1. 상속(inheritance)
1-1) 상속의 정의와 장점
- 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
- 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고
코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
=> 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
- 상속을 구현하기 위해선 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을
키워드 extends와 함께 써 주기만 하면 된다.
조상클래스 | 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스 |
자손클래스 | 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스 |
- 생성자와 초기화블록은 상속되지 않으며 멤버만 상속된다.
- 자손클래스의 멤버 개수는 조상클래스보다 항상 같거나 많다.
- 자손클래스의 인스턴스를 생성하면 조상클래스의 멤버와 자손클래스의
멤버가 합쳐진 하나의 인스턴스로 생성된다.
1-2) 클래스간의 관계 - 포함관계
- 상속이외에도 클래스를 재사용하는 또 다른 방법이 있는데 그것은 클래스간의 포함관계를 맺어주는 것이다.
- 클래스간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.
- 클래스를 작성하는 데 있어서 상속관계를 맺어 줄 것인지 포함관계를 맺어줄 것인지 결정하는 것은 때때로 혼란스럽다.
상속관계 '~은 ~이다 (is ~a)'
포함관계 '~은 ~을 가지고 있다 (has ~a)'
ex)
원(Circle), 점(Point)
원(Circle)은 점(Point)이다. Circle is a Point
원(Circle)은 점(Point)을 가지고 있다. Circle has a Point ==> 포함관계
1-3) 단일상속
- 다른 객체지향언어인 C++에선 다중상속을 허용하지만 자바에서는 오직 단일 상속만을 허용한다.
- 예를 들어 Tv클래스와 VCR클래스가 있을 때 두 클래스로부터 상속을 받는 TVCR클래스를 작성할 수 없다.
만약 다중상속이 허용된다고 할 때 두 클래스 모두 power()라는 메소드가 있다면 어느 조상클래스의 power()를
상속받게 되는 것일까?
- 자바에서는 다중상속의 이러한 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일상속만 허용된다.
==> 이럴 때 포함관계를 사용할 수 있다.
1-4) Object클래스 - 모든 클래스의 조상
- Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
- 다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object클래스로부터
상속받게 함으로써 이것을 가능하게 한다.
- 자바의 모든 클래스들은 Object클래스의 멤버들을 상속받기 때문에 Object클래스에
정의된 멤버들은 사용할 수 있다.
2. 오버라이딩(overriding)
2-1) 오버라이딩이란?
- 조상클래스로부터 상속받은 메소드의 내용을 변경하는 것을 오버라이딩이라고 한다.
- 상속받은 메소드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다.
==> 이럴 때 조상의 메소드를 오버라이딩이라고 한다.
2-2) 오버라이딩의 조건
- 자손클래스에서 오버라이딩하는 메소드는 조상클래스의 메소드의 이름, 매개변수, 반환타입이 같아야 한다.
① 접근제어자는 조상 클래스의 메소드보다 좁은 범위로 변경할 수없다.
- 만일 조상 클래스의 정의된 메소드의 접근 제어자가 protected라면 이를 오버라이딩하는 자손 클래스의
메소드는 접근제어자가 protected 또는 public이어야 한다.(대부분은 같은 범위의 접근 제어자를 사용한다.)
② 조상클래스의 메소드보다 많은 수의 예외를 선언할 수 없다.
③ 인스턴스메소드를 static 메소드 또는 그 반대로 변경할 수 없다.
2-3) 오버로딩 vs 오버라이딩
- 오버로딩은 기존에 없는 새로운 메소드를 추가하는 것이고, 오버라이딩은 조상으로부터 상속받은 메소드의
내용을 변경하는 것이다.
* 오버로딩 (overloading) 기존에 없는 새로운 메소드를 정의하는것 ( new )
* 오버라이딩 (overriding) 상속받은 메소드의 내용을 변경하는 것 (change, modify)
2-4) super
- super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수이다.
- 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와
이름이 같을 때는 super를 붙여서 구분할 수 있다.
- 조상클래스로부터 상속받은 멤버도 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다.
- 그래도 조상 클래스의 멤버와 자손클래스의 멤버가 중복 정의되어서 서로 구별해야 하는 경우에만
super를 사용하는 것이 좋다.
2-5) super()
- this()와 마찬가지로 super() 역시 생성자이다.
- this()는 같은 클래스의 다른 생성자를 호출하지만 super()는 조상클래스의 생성자를 호출하는데 사용된다.
- 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 이 때 조상클래스의 멤버의 초기화작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의
생성자가 호출되어야 한다.
- 생성자의 첫줄에서 조상클래스의 생성자를 호출해야 하는 이유는 자손클래스의 멤버가 조상클래스의 멤버를
사용할수도 있으므로 조상의 멤버들이 먼저 초기화 되어 있어야 한다.