상속
- 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.
- 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
- 자손 클래스는 조상 클래스의 모든 멤버를 상속받으므로 항상 조상 클래스보다 같거나 많은 멤버를 가진다.
- 조상 클래스가 변경되면 자손 클래스는 영향을 받게 되지만, 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
- 생성자와 초기화 블럭은 상속되지 않으며 멤버만 상속된다.
1 2 3 4 5 6 7 8 | class Parent { int age; } class Child extends Parent { void play() { } } | cs |
클래스 |
클래스의 멤버 |
Parent |
age |
Child |
age, play() |
포함관계
한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것.
1 2 3 4 5 6 7 8 9 | class Point { int x; int y; } class Circle { Point c = new Point(); int r; } | cs |
관계 결정하기
~은 ~이다. → 상속
~은 ~를 가지고 있다. → 포함
ex) 스포츠카는 자동차이다. → 상속 / 원은 점을 가지고 있다. → 포함
단일 상속
자바에서는 다중상속을 허용하지 않기 때문에 하나 이상의 클래스로부터 상속을 받을 수 없다.
다중상속의 경우 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만,
클래스간의 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속받은 멤버가느이 이름이 같은 경우 구별할 수 없다는 단점을 가진다.
Object 클래스
Object 클래스는 모든 클래스 상속 계층도의 최상위에 있는 조상 클래스이다.
다른 클래스로부터 상속받지 않는 모든 클래스들은 컴파일러에 의해 자동적으로 'extends Object'가 추가된다.
super
자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수.
1 2 3 4 5 6 7 8 9 10 11 12 | class Parent { int x = 10; } class Child extends Parent { int x = 20; void method() { System.out.println("x = " + x); // 20 System.out.println("this.x = " + this.x); // 20 System.out.println("super.x = " + super.x); // 10 } } | cs |
조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 super를 써서 호출할 수 있다.
뿐만 아니라 super()를 이용하여 조상 클래스의 생성자를 호출할 수도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } String getLocation() { return "x : " + x + ", y : " + y; } } class Point3D extends Point { int z; Point3D(int x, int y, int z) { super(x, y); this.z = z; } String getLocation() { return super.getLocation() + ", z : " + z; } } | cs |
Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 this() 또는 super()를 호출해야 한다.
그렇지 않으면, 컴파일러가 자동적으로 super();를 생성자의 첫 줄에 삽입한다.
자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
생성자의 첫 줄에서 조상 클래스의 생성자을 호출해야하는 이유는 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야하기 때문이다. 조상 클래스 생성자의 호출은 클래스의 상속관계를 거슬러 올라가면서 계속 반복되며, 마지막으로 모든 클래스의 최고 조상인 Object 클래스의 생성자인 Object()까지 가서야 끝이난다.
참고자료
자바의 정석
'Java' 카테고리의 다른 글
[Java] 다형성 (0) | 2019.01.01 |
---|---|
[Java] 제어자 (0) | 2019.01.01 |
[Java] 생성자 (0) | 2019.01.01 |
[Java] 오버로딩과 오버라이딩 (0) | 2019.01.01 |
[Java] 변수, 메서드 (0) | 2018.12.30 |