상속의 정의와 장점
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
자바에서는 'extends'를 사용하여 상속하는데, 상속해주는 클래스를 '조상 클래스'라 하고 상속 받는 클래스를 '자손 클래스'라고 한다.
자손 클래스는 조상 클래스의 모든 멤버를 상속받는다(생성자와 초기화 블럭은 상속되지 않는다). 따라서 만약 조상 클래스에 멤버 변수를 추가하면 자손 클래스에도 자동적으로 멤버 변수가 추가되는것과 같다. 반대로 자손 클래스에 멤버 변수를 추가해도 조상 클래스에 영향을 주지 않는다.
이처럼 자손 클래스는 조상 클래스보다 항상 같거나 많은 멤버를 갖는다. 즉, 상속을 거듭할수록 상속받는 클래스의 멤버 개수가 많아지기때문에 상속을 받는다는 것은 조상 클래스를 확장(extend)한다는 의미로 해석할 수 있다.
자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다. 즉 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
포함 관계
상속 이외에도 클래스를 재사용하는 또 다른 방법이 있는데, 그것은 클래스간에 '포함(Composite)'관계를 맺어 주는 것이다.
클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.
따라서 만들어진 참조변수를 통해 인스턴스에 접근하여 상속과 마찬가지로 그 인스턴스의 멤버들을 사용할 수 있게 된다.
클래스간의 관계 설정하기
클래스를 작성하는데 있어서 상속관계를 맺어 줄 것인지 포함관계를 맺어 줄 것인지 결정하는 것은 때때로 혼돈스러울 수 있다.
이럴 때는 '~은 ~이다(is-a)'와 '~은 ~을 가지고 있다(has-a)'를 넣어서 문장을 만들어보면 클래스 간의 관계가 보다 명확해 진다.
- ~은 ~이다(is-a) => 상속관계
- ~은~을 가지고 있다(has-a) => 포함관계
Java에서의 상속
-'단일 상속'
다른 몇 언어에서는 '다중 상속'을 허용하지만, 자바에서는 오직 단일 상속만을 허용한다. 그래서 둘 이상의 클래스로부터 상속을 받을 수 없다.
다중 상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만, 클래스간의 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가진다.
자바에서는 이러한 다중상속의 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일상속만을 허용한다. 단일 상속이 하나의 조상 클래스만을 가질 수 있기 때문에 불편한 점도 있지만, 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중상속보다 유리하다.
-'Object 클래스'
Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
자바의 모든 클래스들은 Object클래스의 멤버들을 상속 받기 때문에 Object클래스의 정의된 멤버들을 사용할 수 있다. 대표적인 멤버들로 평소에 자주 사용하는 toString( ), equals(Object o)등 모든 인스턴스가 가져야 할 기본적인 11개의 메서드가 정의되어있다.
'Java > 객체지향프로그래밍' 카테고리의 다른 글
[Java] 제어자(modifier) - 코딩밥상 (0) | 2023.02.09 |
---|---|
[Java] 오버라이딩(overriding) - 코딩밥상 (0) | 2023.02.08 |
[Java] 초기화 블럭(initialization block) - 코딩밥상 (0) | 2023.02.07 |
[Java] 생성자(Constructor) - 코딩밥상 (0) | 2023.02.07 |
[Java] 오버로딩(overloading) - 코딩밥상 (0) | 2023.02.07 |