Java

Java - 상속 (Inheritance) / 메소드 오버라이딩 (Method Overriding) / super

왕현성 2023. 1. 19. 17:15
728x90

상속이란?

자바에는 상속(Inheritance)이라는 개념이 존재합니다.

쉽게 말해 부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 됩니다.

상속을 하는 이유는 간단합니다. 이미 마련되어 있던 클래스를 재사용해서 만들 수 있기 때문에 효율적이고, 개발 시간을 줄여주게 됩니다.

 

 

부모 클래스 코드

public class Parent {
	String name;
	int age;
	private int money;
	
	Parent(){
		System.out.println("Parent 클래스 생성자!");
	}
	
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	
	void print() {
		System.out.println("name :"+name);
		System.out.println("age :"+age);
	}
	void printMoney() {
		System.out.println("name :"+name);
		System.out.println("age :"+age);
		System.out.println("money :"+money);
	}

}

자식 클래스 코드

public class Child extends Parent{
	
	// 상속받을 때 사용하는 키워드가 extends다.
	// extends 오른 쪽에 상속받을 클래스명을 쓴다.
	// 즉 Parent 클래스의 멤버 변수와 메소드를 상속받는다는 뜻이다.
	// 우리 눈에는 안 보이지만 상속받은 코드가 숨어있는 것!!!!!
	String hobby;
	
	Child(){
		System.out.println("Child 클래스 생성자!!!!!!");
	}
}

메인함수 코드

public class PersonMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 메모리 확보
		Parent p = new Parent();
		// 데이터 저장
		p.name = "홍길동";
		p.age = 50;
		p.setMoney(1000000000);
		// 저장된 데이터 출력
//		p.print();
//		p.printMoney();
		
		// Child 클래스를 객체 생성한다.
		Child c = new Child();
		// 데이터 저장
		c.name = "홍나나";
		c.age = 23;
		c.setMoney(500000);
		c.hobby = "게임";
		
		// 저장된 데이터 확인 ! 출력 !
		c.print();
		c.printMoney();

	}

}

위 코드 실행 결과를 보면 

메모리 동작방식을 확인하기 위해  생성자 함수에 print 문을 넣어놨다. 실행 결과

메모리를 확보하는 코드 ( Parent p = new Parent(); )를 한 번만 했지만 상속받은 Child 클래스의 객체를 생성할 때도

부모클래스의 코드가 실행되는 것을 확인할 수 있다.

 

메소드 오버라이딩 ( Method Overriding)

Child에 있는 hobby 정보까지 같이 출력할 수 있는 함수를 만드려고한다.

이럴 때 새로운 함수를 만들지 않고 상속받은 함수를 재활용하여 코드를 작성할 수 있는 방법을

Method Overriding 메소드 오버라이딩이라고 한다.

 

사용하는 방법.

코드 작성하는 곳에 마우스 우클릭 -> source -> Override / Implement Methods

@Override
	void print() {
		// TODO Auto-generated method stub
		super.print();

위 코드에서 super란 extends 옆에 있는 상속받은 클래스를 말한다.

 

내가 원하는 대로 개발을 하고 싶으면 위 코드에서 super.print();를 지우고 아래 코드와 같이 작성을 해도 된다.

@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println(name+" "+age+" "+job+" "+hobby);
	}

같은 print(); 함수를 썼지만 각각 결과가 다른 모습

 

 

 

수퍼클래스(부모클래스)의 생성자를 호출하는 코드

 

 

// 수퍼클래스의 생성자 호출하는 코드.
		super(num,name,dept,address);