프로그래밍 언어인 자바는 객체 지향 언어이다.
객체 지향 언어에는 여러 가지 특징이 있다. 오늘은 그중에서 상속이라는 개념을 알아보자.
처음 나는 상속이라는 단어를 들었을 때 부모의 재산을 받는 걸 떠올렸다.
자바의 상속이라는 개념도 똑같다.
우선 상속의 개념을 살펴보면 기존의 클래스를 재사용해 새로운 클래스를 작성하는 거라고 한다.
사용하는 이유는 적은 양의 코드로 새로운 클래스를 작성이 가능하고 코드를 공통적으로 관리할 수 있다. 공통적으로 관리되는 코드는 추가, 변경에 용이하다.
그렇게 되면 재사용성이 올라가고 유지 보수하기도 좀 더 쉬워진다. 결론적으로 프로그램의 생산성이 높아지는 효고가 생긴다.
자바에서 상속을 사용하는 방법은 쉽다.
클래스 이름 옆에 extends를 붙여주고 상속받고 싶은 클래스를 적어주면 끝이다.
좀 더 이해하기 쉽게 예를 들어보자.
Child 클래스가 Parent 클래스를 상속 받으려면 아래처럼 하면 된다.
class Child extends Parent{
}
상속을 받았으니 이제 Child 클래스는 자손 클래스라고 불린다. 다른 말로는 자식 클래스, 하위 클래스라고도 불린다.
Parent 클래스는 상속을 해주었으니까 조상 클래스라고 불린다. 부모 클래스 혹은 상위 클래스라고도 불린다.
Child와 Parent의 상속 관계를 상속계층도로 나타내면 다음과 같다.
화살표의 모양을 보고 Child는 Parent를 상속받았다고 이해하면 된다.
이걸 다이어그램으로 표현하면 다음과 같다.
위 그림을 보면 Parent 클래스가 Child 클래스 안에 들어가 있다.
즉, Parent를 Child가 가지고 있었다는 말이다.
만약 Parent 클래스에 ParentMoney라는 멤버 변수 추가되면 하위 클래스인 Child는 부모 돈에 손을 댈 수 있다.
상속을 받았기 때문이다.
반대로 Child 클래스에 ChildMoney라는 멤버 변수를 추가해도 Parent는 자식의 돈에 손댈 수 없다.
부모의 자비로움과 서러움을 느낄 수 있다.
여기서 알 수 있는 건 조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받지만, 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
자식이라고 모든 걸 상속받지 않는다. 생성자와 초기화 블록은 상속되지 않는다. 멤버만 상속된다.
상위 클래스의 private, default 접근 제어자를 가진 멤버들은 상속은 받지만 접근이 제한된다.
만약에 자식이 하나 더 생기면 어떨까?
Child2가 Parent를 상속받았다. 그러면 이들의 상속계층도는 아래와 같다.
이 관계를 조금 설명해보자.
Parent와 Child는 상속 관계다. Child2와 Parent도 상속 관계다. 하지만 Child와 Child2 사이는 아무런 관계가 없다.
이번에는 코드 중복을 없애고 유지 보수를 용이하게 만드는 상속의 장점을 예시로 알아보자!
만약 Child와 Child2 둘 다 talmo라는 변수가 필요하다고 해보자.
class Child{
boolean talmo = true;
}
class Child2{
boolean talmo = true;
}
위와 같이 변수를 선언해 줄 수 있다. 하지만 이러면 talmo라는 공통의 변수가 Child에도 존재하고 Child2에도 존재하게 된다.
만약 talmo 변수의 값을 false로 변경해야 한다면 두 클래스의 변수 모두를 수정해야 한다. 조금 번거롭다.
talmo라는 변수를 Parent에 선언하면 코드의 중복을 해결할 수 있다.
class Parent{
boolean talmo = true;
}
class Child extends Parent{
//talmo 변수 사용 가능
}
class Child extends Parent{
//talmo 변수 사용 가능
}
이렇게 하면 두 자식은 talmo를 상속받아서 사용할 수 있다. 만약 값을 false로 변경해야 하면 Parent의 talmo의 값만 수정하면 된다. 코드의 중복이 줄어들고 유지 보수가 용이해지는 순간이다!
자바의 단일 상속
자바는 단일 상속만을 지원한다. 상속받을 수 있는 클래스는 단 한 개라는 말이다. 반면 또 다른 객체 지향 언어인 C++은 다중 상속을 허용한다.
자바가 단일 상속만 지원하는 이유는 클래스의 관계가 명확해지기 때문이다. 다중 상속의 환경에서 발생할 수 있는 문제점이 있다.
만약 부모 클래스들에 같은 이름을 가진 변수가 있다면 자식 클래스에서 이 변수를 사용할 때 어떤 부모의 변수인지 알기 모호해지는 문제가 발생한다.
이러한 이유 때문에 자바는 단일 상속을 선택했다.
모든 클래스의 조상
Object클래스는 모든 클래스의 조상이다.
클래스를 생성하면 자동적으로 상속이 받아진다. extends Object을 따로 작성하지 않아도 컴파일러가 처리해준다.
따라서 자바의 모든 클래스들은 Object 클래스의 정의된 멤버들을 사용할 수 있다.
이러한 이유 때문에 우리는 toString(), equals()와 같은 메서드를 따로 정의하지 않고 사용이 가능하다.
'TIL > Java & Spring Boot' 카테고리의 다른 글
Timestamp와 LocalDateTime 타입 차이 (0) | 2023.09.14 |
---|---|
묵시적 / 명시적 형 변환 (0) | 2022.08.03 |
Spring Framework 4 - Spring Legacy Project 뜯어보기 (4) | 2021.04.06 |
Spring Framework 3 - Spring MVC 구조와 처리과정 (0) | 2021.04.06 |
Spring Framework 2 - 프로젝트 생성 및 기본 설명 (0) | 2021.04.05 |