클래스의 상속(Inheritance)
안녕하세요!
오늘 포스팅 할 내용은 "클래스(Class)의 상속(Inheritance)"입니다.
Java가 C++과 가장 다르다고 느낀 부분은, class가 가장 기본이 된다는 것이었어요.
Java는 C계열의 언어와는 달리 다양한 class와 method가 정의되어 있습니다.
그만큼 C계열의 언어에 비해 코딩이 편하다(?)고 생각하는데요.
문제는 package와 project 등을 생성할 때마다 새로운 class를 만들다보면 ,
동일한 이름과 기능을 갖게 되는 class들 때문에 많은 미스커뮤니케이션과 혼란이 발생할꺼에요.
이것이 바로 클래스의 상속이 적시적소에 이루어져야 하는 이유입니다.
그럼 Java의 기본이 되는 class의 상속(Inheritance)에 대해 알아볼까요?
1. 클래스의 상속이란?
- 하나의 클래스가 가지고 있는 멤버 변수와 메소드를 다른 클래스에게도 그대로 승계해주는 것.
- 승계를 해주는 클래스를 부모 클래스(슈퍼 클래스, 상위 클래스, 기반 클래스)라고 한다.
- 승계를 받는 클래스를 자식 클래스(서브 클래스, 하위 클래스, 파생 클래스)라고 한다.
- Java에 포함된 모든 클래스들의 슈퍼 클래스는 Object 클래스이다.
즉, 모든 Java 클래스들의 공통적이고 기본적인 성격을 모아 놓은 것이 Object 클래스이다.
- C++에서는 다중 상속이 가능했지만, Death Diamond 현상이라는 부작용이 발생했다.
Java는 Death Diamond 현상을 방지하기 위해, 다중 상속은 금지하고 있다.
- 부모 클래스에서 접근 권한이 private인 멤버 변수나 메소드는 자식 클래스에서 호출 할 수 없다.
2. 상속 방법
- 형식 : 상속을 받는 클래스명 + extends + 피상속 클래스
- 상속을 받으려는 클래스를 extends와 함께 적어주면 상속이 이루어진다.
3. 상속 예제
실제로 Java에서 어떻게 상속이 이루어지는지 예제를 통해 살펴보겠습니다.
먼저, 이해하기 쉽게 Parent라는 슈퍼 클래스를 생성하겠습니다.
그리고 Child라는 서브 클래스를 하나 생성하여, Parent 클래스를 상속 받도록 하겠습니다.
Parent Class
Parent - a. 자료형이 정수인 age와 String 클래스 자료형인 nickName을 멤버 변수로 선언합니다.
Parent - b. 클래스의 생성자, Parent(int age, String nickName)을 추가합니다.
Parent - c. Parent 클래스의 getter와 setter도 추가합니다.
Parent - d. 마지막으로 Parent 클래스의 toString()도 생성합니다.
Child Class
이제는 'Child'라는 이름으로 새로운 클래스를 하나 생성합니다.
아직 상속을 받기 전이므로, Parent와 Child 클래스는 서로 무관한 클래스입니다.
이제는 InheritancePractice라는 새로운 클래스를 생성하여, 상속 받기 전과 후의 모습을 비교해보겠습니다.
* InheritanceTest
* InheritancePractice라는 새로운 클래스를 생성하였고, 메인 함수의 범위 안에 Child 클래스의 객체 Child1을 생성하였습니다.
* 당연히 Child 클래스 내에 생성된 멤버 변수와 메소드가 없기 때문에, 아무런 Proposal도 나오지 않습니다.
이제는 Child 클래스가 Parent 클래스를 상속하는 코딩을 진행한 후, InheritanceTest 클래스에서 어떤 변화가 있는 지 살펴보겠습니다.
Child 클래스를 선언한 뒤 'extends Parent'를 입력하여 상속을 완료합니다.
그 결과, 부모 클래스에서 선언한 멤버 변수와 getter, setter, toSring()이 모두 호출 가능함을 확인할 수 있습니다.
하지만 유의할 점은 상속 받을 수 있는 멤버 변수와 메소드가
부모 클래스에서의 접근 권한이 public이나 protected로 설정된 경우라는 것입니다.
private로 설정되면 상속 받아 사용할 수 없습니다.
위 사진에서 부모 클래스의 멤버 변수가 호출되지 않은 이유도 접근 권한이 private로 설정되었기 때문입니다. 그래서 부모 클래스의 멤버 변수인 'age'의 접근 권한을 public으로 바꿔보겠습니다.
그 결과, 부모 클래스 멤버 변수 age도 정상적으로 호출됩니다.
지금까지 Java 클래스 상속의 기초에 대해 알아보았습니다.
여기까지는 상속의 아주 기초적이 부분입니다.
상속에 대한 세부적인 내용은 앞으로도 줄줄이 포스팅하겠습니다.
다음 포스팅에서는 '상속의 데스 다이아몬드(Death Diamond) 현상'에 대해 간략히 짚어보겠습니다.
감사합니다 : )