Chapter 4. 상속과 생성자
객체 지향 프로그래밍의 첫 주자로 상속에 대해서 알아본다.
그리고 그 상속이라는 개념과 함께 생성자에 대한 개념도 통합적으로 살펴본다.
상속
자바에서의 상속은 재활용 + a 의 기능을 제공한다.
상속이란 상위 클래스를 물려받으면서
새로운 메소드나 변수를 추가하거나 변경해서 사용할 수 있도록 하는 것을 말한다.
즉 기존의 객체를 그대로 유지하면서 어떤 기능을 추가하는 방법이다.
기존의 객체가 갖고 있는 메서드들을 그대로 사용할 수 있다.
하위 클래스는 상위 클래스의 확장판인 셈이다.
상위 클래스를 확장하기엔 부담이 있을 때 상속을 사용한다.
즉, 코드를 하나 이상의 클래스에 중복적으로 추가해야하는 경우에는 상속관계를 이용해서
코드의 중복을 최소화해야한다.
extends라는 키워드를 쓴다.
IS-A 관계 : ~의 일종이다.
HAS-A 관계 : 갖는다 .
위 두 개념으로 상속을 사용하게 된다.
생성자와 초기화블럭은 상속되지 않고 멤버만 상속된다.
자바에서는 단일 상속만을 허용한다.
하나의 클래스만 상속받을 수 있다는 것이다.
class Animal{ int birthday //태어난 날 public void breathe(){ //숨을 쉰다는 성질 } } class Person extends Animal{ //이 부분에 상속한 클래스의 코드가 올라오게 된다. public void study(){ //인간만이 공부를 할 수 있다고 가정하고 메소드를 추가하였다. } }
모든 클래스는 Object라는 최상위 클래스를 상속받는다.
위 코드에서 Animal 클래스는 코드 상으로는 보이지 않지만 extends Object를 하고 있다.
Object 클래스에는 toString()이나 equal(Object obj)같은 메서드들이 미리 정의되어 있어서
상속받은 클래스에서 위 메서드들을 사용할 수 있다.
상속과 생성자
개발자가 명시적으로 생성자를 만들어주면 자바는 기본 생성자를 생성하지 않는다.
상위 클래스에서 기본 생성자가 아닌 매개변수를 받는 생성자를 정의하였다.
이렇게 되면 하위 클래스에서 생성자를 정의할 때 상위 클래스에서 기본 클래스를 정의하라고 말을 한다.
그래서 기본 생성자를 추가로 정의해줘야 한다.
하지만 이 방법 말고 다른 방법이 존재한다.
이렇게 문제를 해결한다면 코드의 중복이 발생한다는 문제점이 발생한다.
즉 상위 클래스 하위클래스 둘 다에서 하는 일이 같은 생성자를 두 번 생성한다는 문제.
그 때 사용하는 것이 super.
super는 상위 클래스를 의미한다.
즉 상위 클래스의 생성자를 생성하라는 의미이다.
class Animal{ int birthday //태어난 날 } class Person extends Animal{ super();//명시적으로 삽입하지 않아도 컴파일러가 자동적으로 삽입한다. }
인스턴스 변수의 초기화는 인스턴스 변수가 선언된 클래스의 생성자를 통해서 진행하는 것이 가장 좋은 모델이 될 수 있다.
그래서 상위 클래스의 인스턴스 변수는 상위 클래스의 생성자 내에서 초기화가 되어야 하고,
하위 클래스에서는 상위클래스의 인스턴스 변수를 초기화하는데 필요한 데이터를
키워드 super를 통해서 전달만 하는 것이 합리적이다.
class Animal{ int birthday //태어난 날 Animal(int birthday){ //default 생성자가 아닌 생성자 this.birthday = birthday; } } class Person extends Animal{ String name; Person(String name, int birthday){ super(birthday); //명시적으로 삽입해야한다. this.name = name; //추가적으로 멤버를 setting해준다. } }
위 코드에서 처럼 하위클래스의 생성자 내에서는 반드시 상위 클래스의 생성자가 호출되어야 한다.
또 super라는 키워드는 상위클래스에서 정의된 메소드의 호출에도 사용이 된다.
오버라이딩에서 조금 더 깊이 들어가자.
Chapter 4. The End
'Dev.BackEnd > JAVA' 카테고리의 다른 글
[JAVA] 6. 접근제어자와 정보은닉 (0) | 2016.06.26 |
---|---|
[JAVA] 5. 오버로딩과 오버라이딩 (0) | 2016.06.25 |
[JAVA] 3. 자바에서 변수와 메소드에 대하여 / 클래스 메소드, 클래스 변수 (0) | 2016.06.24 |
#가비지컬렉션(Garbage Collection) / JVM 구동원리에 이어서 (0) | 2016.06.23 |
#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가? (3) | 2016.06.23 |