Java - 클래스 - 상속(Constructor), 다양성, 오버라이딩(Overriding)

반응형

상속

  • 자식 클래스는 부모 클래스의 모든 속성을 상속 받고 사용 가능함
  • 상속 받은 메소드는 필요에 따라 자식 클래스에서 따로 재정의 할 수 있음 (메소드 오버라이딩)
  • 자식 클래스 정의 방식은 '자식클래스이름 extends 부모클래스'로 정의
  • 자식 클래스 호출시 부모 클래스도 함께 호출
  • 자식 클래스에서 상속 받은 인스턴스 변수는 자식 클래스마다 각각의 이름 공간을 가짐
  • 부모 클래스의 메소드 호출시에는 super 키워드를 사용

조부모 / 부모 / 자식 클래스 정의

package ParentsClass;

// 조부모 클래스
public class GrandParent {
	protected String gpMsg;
	
	// 호출시 조부모 클래스 생성자 생성 메시지 출력
	public GrandParent() {
		System.out.println("---The GrandParent constructor has been created.");
	}
	
	public void print() {
		System.out.println("GrandParent : " + gpMsg);
	}
}

// 부모 클래스
public class Parent extends GrandParent {
	protected String pMsg;
	
	// 호출시 부모 클래스 생성자 생성 메시지 출력
	public Parent() {
		System.out.println("---The Parent contructor has been created.");
	}
	// print 메소드 오버라이딩
	public void print() {
		super.print(); // 부모 클래스 GrandParent의 print 메소드 호출
		System.out.println("Parent : " + pMsg);
	}
}

// 자식 클래스
public class Child extends Parent{
	public String cMsg;
	
	// 호출시 조부모 클래스 생성자 생성 메시지 출력
	public Child() {
		System.out.println("---The Child constructor has been created.");
	}
	// print 메소드 오버라이딩
	public void print() {
		super.print(); // 부모 클래스 Parent의 print 메소드 호출
		System.out.println("Child : " + cMsg);
	}
}

메인 클래스에서의 호출

public class ParentsMain {

	public static void main(String[] args) {
		GrandParent gp = new GrandParent();
		gp.gpMsg = "Hello";
		gp.print();
		// ---The GrandParent constructor has been created.
		// GrandParent : Hello

		Parent p = new Parent();
		p.gpMsg = "Hello";
		p.pMsg = "World!";
		p.print();
		// ---The GrandParent constructor has been created.
		// ---The Parent contructor has been created.
		// GrandParent : Hello
		// Parent : World!
		
		Child c = new Child();
		c.gpMsg = "Hello";
		c.pMsg = "World!";
		c.cMsg = "Bye~";
		c.print();
		// ---The GrandParent constructor has been created.
		// ---The Parent contructor has been created.
		// ---The Child constructor has been created.
		// GrandParent : Hello
		// Parent : World!
		// Child : Bye~
	}
}

상속 받은 인스턴스 변수는 각각의 독립된 값을 가짐

  • 조부모 클래스의 gpMsg 변수의 값을 넣어도 부모 클래스에서의 gpMsg 변수의 값은 null
public class ParentsMain {

	public static void main(String[] args) {
		GrandParent gp = new GrandParent();
		gp.gpMsg = "Hello";
		gp.print();
		// ---The GrandParent constructor has been created.
		// GrandParent : Hello

		Parent p = new Parent();
		p.pMsg = "World!";
		p.print();
		// ---The GrandParent constructor has been created.
		// ---The Parent contructor has been created.
		// 중요!!! GrandParent : null
		// Parent : World!
    }
}

상속의 다양성

  • 자식 클래스는 상속 받은 메소드를 각각 다르게 재정의하여 클래스마다의 다양성을 나타낼 수 있음
    • 이를 오버라이딩(Overriding)이라고 함
  • 오버라이딩 : 부모 클래스에서 상속받은 메소드를 재정의하는 것
// 상속의 다양성 예시 (메소드 오버라이딩, Method Overriding)
// 부모 클래스
public class ClassDiversity {
	void hello() {
		System.out.println("HelloWorld!");
	}
}

// 자식 클래스
// 부모 클래스에서 상속 받은 속성을 재정의하여 다른 형태로 사용 할 수 있음
public class Diversity extends ClassDiversity {
	// 메소드 오버라이딩 (Method Overriding)
	void hello() {
		System.out.println("Bye!!!");
	}
	
	// 메인 실행 함수
	public static void main(String[] args) {
		ClassDiversity cd = new ClassDiversity();
		cd.hello(); // HelloWorld!
		Diversity d = new Diversity();
		d.hello(); // Bye!!!
	}
}
반응형