상속
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
class Parent{}
class Child extends Parent {
//...
}
이 두 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 ‘조상 클래스’라 하고 상속받는 클래스를 ‘자손 클래스’라 한다.
자손 클래스는 조상 클래스의 모든 멤버를 상속받기 떄문에, Child클래스는 Parent클래스의 멤버들을 포함한다고 할 수 있다.
만일 Parent 클래스에 age라는 정수형 변수를 멤버변수로 추가하면, 자손 클래스는 조상의 멤버를 모두 상속받기 때문에, Child 클래스는 자동적으로 age라는 멤버 변수가 추가된 것과 같은 효과를 얻는다.
class Parent {
int age;
}
class Child extends Parent {}
반대로 자손인 Child클래스에 새로운 멤버로 play() 메서드를 추가해보자.
class Parent {
int age;
}
class Child extends Parent{
void play() {
System.out.println("놀자~");
}
}
Child 클래스에 새로운 코드가 추가되어도 조상인 Parent클래스는 아무런 영향도 받지 않는다.
조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 되지만, 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
클래스 간의 포함 관계
클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조 변수를 선언하는 것을 뜻한다.
원(Circle)을 표현하기 위한 Circle클래스와 좌표상의 한 점을 다루기 위한 Point클래스를 다음과 같이 작성되어 있다고 가정하자.
Point클래스를 재사용해서 Circle클래스를 작성한다면 다음과 같이 할 수 있을 것이다.
이와 같이 한 클래스를 작성하는 데 다른 클래스를 멤버변수로 선언하여 포함시키는 것은 좋은 생각이다.
클래스 간의 관계 결정하기
두 경우를 비교해 보면 Circle클래스를 작성하는데 있어서 Point클래스를 포함시키거나 상속받도록 하는 것은 결과적으로 별 차이가 없어 보인다.
그럴 때는 ‘~은~이다(is-a)’와 ‘~은 ~을 가지고 있다(has-a)’를 넣어서 문장을 만들어 보면 클래스 간의 관계가 보다 명확해진다.
원(Circle)은 점(Point)이다. - Circle is a Point // 상속 관계
원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point // 포함 관계
클래스를 가지고 문장을 만들 때 ‘~은 ~이다.’라는 문장이 성립한다면, 서로 상속관계를 맺어 주고, ‘~은 ~을 가지고 있다’는 문장이 성립한다면 포함관계를 맺어 주면 된다.
단일상속(Single inheritance)
C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 ‘다중 상속(multiple inheritance)’을 허용하지만 자바에서는 단일 상속만을 허용한다.
class TvDVD extends Tv, DVD { // 에러. 조상은 하나만 허용된다.
//...
}
static메서드라면 메서드 이름 앞에 클래스의 이름을 붙여서 구별할 수 있다지만, 인스턴스 메서드의 경우 선언부가 같은 두 메서드를 구별할 수 있는 방법은 없다.
자바에서는 다중상속의 이러한 문제점을 해결하기 위해 다중 상속의 장점을 포기하고 단일 상속만을 허용한다. 단일 상속이 하나의 조상 클래스만을 가질 수 있기 때문에 다중 상속에 비해 불편한 점도 있지만, 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중 상속보다 유리하다.
Object 클래스 - 모든 클래스의 조상
Object클래스는 모든 클래스의 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
class Tv { // extends object가 자동 추가됨
...
}
class SmartTv extends Tv {
...
}
이처럼 모든 상속계층도의 최상위에는 Object클래스가 위치하여 상속받기 때문에 자바의 모든 클래스들은 Object클래스에 정의된 멤버들을 사용할 수 있다. 주요 메서드로는 toString()과 equals(Object o)등이 있다.
'Server > 자바의정석' 카테고리의 다른 글
[Java 입문] 제어자(modifier), 캡슐화 (0) | 2022.09.28 |
---|---|
[Java 입문] Super (0) | 2022.09.28 |
[Java 입문] 생성자(constructor) (0) | 2022.09.27 |
[Java 입문] Static 메서드와 인스턴스 메서드 (0) | 2022.09.27 |
[Java 입문] 매개변수 (0) | 2022.09.27 |