[Java] 상속
2021. 11. 24. 15:39ㆍLanguage`/Java
목차
상속 (Inheritance)
- 클래스 사이의 상속
- 코드 중복을 제거하여 클래스를 간결하게 구현
- 부모 클래스 = 슈퍼 클래스(Super Class) / 상속받는 자식 클래스 = 서브 클래스(Sub Class)
※ 서브 클래스
- 슈퍼 클래스의 private 멤버를 제외한 모든 멤버에 접근 가능
※ Example
class Point{ private int x, y; public void set(int x, int y){ // private로 선언된 x, y에 접근을 위한 메소드 this.x = x; this.y = y; } public void showPoint(){ System.out.println("(" + x + "," + y + ")"); } } class ColorPoint extends Point{ /* Point(부모 클래스)를 상속받는 ColorPoint(자식 클래스) Point 클래스의 멤버 set(int x, int y), showPoint() 호출 가능 */ private String color; public void setColor(String color){ // private로 선언된 color에 접근을 위한 메소드 this.color = color; } public void showColorPoint(){ System.out.print(color); showPoint(); // Point 클래스의 showPoint() 호출 } } public class test { public static void main(String[] args) { Point p = new Point(); ColorPoint cp = new ColorPoint(); p.set(1, 2); p.showPoint(); cp.set(3, 4); // 부모 클래스 Point에서 set() 호출 cp.setColor("red"); cp.showColorPoint(); } } ------------------------------- (1,2) red(3,4)
슈퍼 클래스에 대한 접근 지정
슈퍼 클래스 멤버에 접근하는 클래스 종류 | 슈퍼 클래스 멤버의 접근 지정자 | |||
private | default | protected | public | |
같은 패키지에 있는 클래스 | X | O | O | O |
다른 패키지에 있는 클래스 | X | X | X | O |
같은 패키지에 있는 서브 클래스 | X | O | O | O |
다른 패키지에 있는 서브 클래스 | X | X | O | O |
생성자 (서브 클래스/슈퍼 클래스)
Question 1) 서브 클래스 객체가 생성될 때, 서브 클래스의 생성자 + 슈퍼 클래스의 생성자는 모두 실행되는가?
- Answer) 둘다 실행된다. 서브 클래스 객체가 생성되면 이 객체 안에는 서브 클래스의 멤버, 슈퍼 클래스의 멤버가 모두 들어있다. 생성자의 목적은 객체 초기화
Question 2) 서브 클래스의 생성자, 슈퍼 클래스의 생성자 -> 둘 중 누가 먼저 실행되는가?
- Answer) 슈퍼 클래스의 생성자가 먼저 실행된다.
※ Example
class A{ public A(){ System.out.println("A!!"); } } class B extends A{ public B(){ System.out.println("B!!"); } } class C extends B{ public C(){ System.out.println("C!!"); } } public class test { public static void main(String[] args) { C c = new C(); /* A -> B -> C 순으로 상속 따라서, A B C순으로 생성자가 실행 */ } } --------------------- A!! B!! C!!
서브 클래스에서 슈퍼 클래스의 생성자 선택
1. 슈퍼 클래스의 기본 생성자가 자동 선택
- 명시적 지시가 없으면, 자바 컴파일러에 의해 강제적으로 무조건 슈퍼 클래스의 기본 생성자를 선택한다
- 단, 짝을 이룰 기본 생성자는 무조건 존재해야 한다
※ Example
class A{ public A(){ System.out.println("생성자 A"); } } class B extends A{ public B(){ System.out.println("생성자 B"); } } class C{ public C(){ System.out.println("생성자 C"); } public C(int x){ System.out.println("매개변수 생성자 C"); } } class D extends C{ public D(){ System.out.println("생성자 D"); } public D(int x){ System.out.println("매개변수생성자 D"); } } public class test { public static void main(String[] args) { B b = new B(); /* 서브 클래스 B의 기본 생성자 B() -> 슈퍼 클래스 A의 기본 생성자 A() 실행 */ D d = new D(10); /* 서브 클래스 D의 매개변수를 가진 생성자 D() -> 슈퍼 클래스 C의 기본 생성자 C() 실행 */ } } ---------------------------- 생성자 A 생성자 B 생성자 C 매개변수생성자 D
2. super()를 이용해서 명시적으로 슈퍼 클래스의 생성자 선택
- super() : 슈퍼 클래스의 생성자를 호출하는 코드
- super()는 반드시 생성자의 첫 라인에 사용해야 한다
※ Example
class A{ public A(){ System.out.println("생성자 A"); } } class B extends A{ public B(){ System.out.println("생성자 B"); } } class C{ public C(){ System.out.println("생성자 C"); } public C(int x){ System.out.println("매개변수생성자 C"); } } class D extends C{ public D(){ System.out.println("생성자 D"); } public D(int x){ super(x); // C(int x)를 명시적으로 호출 System.out.println("매개변수생성자 D"); } } public class test { public static void main(String[] args) { B b = new B(); D d = new D(10); } } ---------------------------------- 생성자 A 생성자 B 매개변수생성자 C 매개변수생성자 D