상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 기여한다.
상속에는 세 가지 정의가 있다.
- 자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
(단, 생성자와 초기화 블럭은 상속되지 않는다. 조상의 생성자는 조상의 생성자 뒤에서 작성할 super() 활용)
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않아도
조상 클래스의 멤버들을 사용할 수 있다.
상속이외에도 클래스를 재사용하는 또 다른 방법이 있는데 그것은 포함 관계를 맺어주는 것이다.
포함관계를 맺어주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언 하는 것이다.
하나의 거대한 클래스를 작성하는 것보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로
재사용하다 보면 간결하고 손쉽게 클래스를 작성할 수 있다. 또한 작성된 단위 클래스들은 다른 클래스를 작성하는데 재사용될 수 있다.
클래스를 작성하는데 있어 상속관계를 맺을지 포함 관계를 맺을지 결정하는 것은 혼돈스럽다.
그럴 때는 ' ~은~이다.(is - a) [상속 관계] 와 '~은 ~을 가지고 있다 와 '~을 가지고 있다. (has-a) [포함 관계] ' 를 넣어서 문장을 만들어보면 판단이 쉽다.
예를 들어 '원은 점이다. ' 보다 ' 원은 점을 갖고 있다' 를 예로 들면 첫 번째 문장보다 , 두 번째 문장이 더 옳다는 것을 알 수 있다.
몇가지 더 예를 들면, Car 클래스와 SportsClass는 'SportsCar는 Car이다'와 같이 문장을 만드는 것이 더 옳기 떄문에 이 두 클래스는
Car클래스를 조상으로 하는 상속관계를 맺어야 한다.
Object클래스 - 모든 클래스의 조상
object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다. 다른 클래스로부터 상속 받지 않은 모든 클래스들은
자동적으로 object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
자바의 모든 클래스들은 object클래스의 멤버들을 상속 받기 때문에 object 클래스에 정의된 멤버들을 사용할 수 있다.
주요 메소드로는 toString()과 , equals(object O) 등이 있다. 자세한 것은 추후에 다뤄보도록 하자.
오버라이딩(overriding)
조상 클래스로부터 상속받은 매서드의 내용을 변경하는것을 오버라이딩이라 한다. 상속받은 메서드를 그대로 사용하기도 하지만,
자손 클래스에 자신 맞게 변경해야 하는 경우가 많은데 이럴 때 조상의 메서드를 오버라이딩해야한다.
이와 같이 같은 이름의 메서드를 자손 클래스에서 오버라이딩 하고 나니, 자손 객체를 생성하고 메서드를 호출하면 , 3차원 좌표를 출력한다.
Point 클래스의 getloacation()은 한 점의 2차원 좌표를 반환하지만, Point3D 클래스는 3차원 좌표계의 한 점을 표현하기 위한 것이므로
조상인 Point 클래스로부터 상속받은 getLocation()은 Point3D 클래스에 맞지 않는다. 그래서 이 메서드를 Point3D클래스 자신에 맞게
z축의 좌표값도 포함하여 반환하도록 오버라이딩하였다.
오버라이딩의 조건
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
2. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 될 수 없다.
3. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
오버로딩 vs 오버라이딩
오버로딩과 오버라이딩은 서로 혼동하기 쉽지만 사실 그 차이는 명백하다. 오버로딩은 기존에 없는 새로운 메서드를 추가하는 것이고,
오버라이딩은 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} // 오버라이딩
void parentMethod(int i) {} //오버로딩
void childMethod() {}
void childMethod(int i) {}// 오버로딩
void childMethod() {}// 중복정의
}
'JAVA의 정석' 카테고리의 다른 글
(객체part2) 3. 패키지 / import 문과 static import문 (0) | 2023.08.19 |
---|---|
(객체part2) 2. 참조변수 super, super() (0) | 2023.08.18 |
(객체part) 5. 오버로딩과 생성자 / this() vs this. (1) | 2023.08.10 |
(객체part) 4. Static 메서드와 인스턴스 메서드 / static을 언제 붙여야 할까 ? (0) | 2023.08.09 |
(객체part) 3. 참조형 매개변수와 참조형 반환타입 (0) | 2023.08.09 |