[JAVA] 상속 / 오버라이딩 / super, super()
자바의 꽃이라고 불리우는 상속에 대해 알아보자!
1. 상속이란?
기존에 있는 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
- 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 수정이 쉽다.
- 코드의 중복을 제거하고, 코드의 재사용성이 높아진다.
== 프로그램의 유지보수가 쉬워진다!!
상속은 extends 키워드로 사용할 수 있다.
class ParentClass {}
class ChildClass extends ParentClass {}
ParentClass를 부모클래스(=super클래스), ChildClass를 자식클래스라고 한다.
이 관계를 상속 관계도와 다이어그램으로 나타나면 아래 그림과 같다.
![](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
ParentClass에 a라는 멤버변수를 추가하면 자식 클래스인 ChildClass에도 a라는 멤버변수가 상속된다.
단, 자식 클래스인 ChildClass에 b라는 멤버변수를 추가해도 부모 클래스인 ParentClass에는 아무런 변화가 없다.
🌟 모든 클래스의 부모, Object 클래스
Object 클래스는 모든 클래스의 최상위에 존재하는 부모 클래스이다.
따라서 모든 클래스는 Object 클래스에 정의된 멤버들을 사용할 수 있다.
toString()이나 equals()같은 메서드들을 사용할 때 따로 정의하지 않고 사용할 수 있었던 이유는 이 메서드들이 Object 클래스에서 정의되었기 때문이다.
2. 단일 상속
JAVA는 다른 언어와는 달리 단일 상속(Single inheritance)만 허락한다.
다중상속의 경우 클래스 간 관계가 복잡해지는 단점이 있다. 따라서 단일상속은 클래스 간 관계를 명확히 하기 위함이다.
하지만, 인터페이스를 사용하여 다중상속의 효과를 낼 수도 있다.
class ChildClass extends ParentClass implements testInterface {}
3. 오버라이딩(Overriding) 이란?
부모 클래스로부터 상속받은 메서드의 내용을 재정의하는 것이다.
📌 메서드의 내용만을 재정의하는 것이기 때문에 메서드 선언부는 부모의 것과 동일해야 한다!!
메서드를 오버라이딩 하기 위한 조건은 아래와 같다.
- 메서드의 이름이 동일해야 함
- 메서드의 매개변수가 동일해야 함
- 메서드의 return 타입이 동일해야 함 (단, jdk 1.5부터 공변 반환타입이 추가되어 return 타입을 자식 클래스의 타입으로 변경할 수 있도록 허용됨.)
- 메서드의 선언부에서 접근 제어자는 변경이 가능함. (단, 부모 클래스의 메서드보다 좁은 범위로는 변경이 불가능)
- 메서드의 선언부에서 Exception도 변경 가능 (단, 부모 클래스의 메서드보다 많은 수의 예외는 선언 불가능)
4. super와 super()
super
- 자식 클래스에서 부모 클래스로부터 상속받은 멤버를 참조할 때 사용하는 키워드
- 메서드를 오버라이딩 할 때, 완전히 다른 내용으로 재정의하기보다는 부모의 메서드에 내용을 덧붙이는 경우가 많기 때문에 super키워드를 사용하여 부모 메서드를 호출한 뒤 메서드의 내용을 추가한다.
super()
- 부모 클래스의 생성자를 호출하는데 사용하는 생성자
- Object 클래스를 제외한 모든 클래스 생성자에 this()나 super()를 호출하지 않았다면 컴파일러가 자동으로 super();를 생성자의 첫 줄에 추가한다.