상속과 새성자 extends, super - accidentlywoo/legacyVue GitHub Wiki
상속과 새성자 extends, super
- 객체 지향 프로그래밍의 첫 주자로 상속에 대해서 알아본다.그리고 그 상속이라는 개념과 함께 생성자에 대한 개념도 통합적으로 살펴본다.
상속
자바에서의 상속은 재활용 + a 의 기능을 제공한다. 상속이란 상위 클래스를 물려받으면서 새로운 메소드나 변수를 추가하서나 변경해서 사용할 수 있도록 하는 것을 말한다. 즉 기존의 객체를 그대로 유지하면서 어떤 기능을 추가하는 방법이다. 기존의 객체가 갖고 있는 메서드들을 그대로 사용할 수 있다. 하위 클래스는 상위 클래스의 확장판인 셈이다. 상위 클래스를 확장하기엔 부담이 있을 때 상속을 사용한다. 즉, 코드를 하나 이상의 클래스에 중복적으로 추가해야하는 경우에는 상속관계를 이용해서 코드의 중복을 최소화해야한다.
extends 라는 키워드를 쓴다.
IS-A 관계 : ~의 일종이다. HAS-A 관계 : 갖는다. 위 두 개념으로 상속을 사용하게 된다.
생성자와 초기화블럭은 상속되지 않고 멤버만 상속된다.
자바에서는 단일 상속만을 허용한다. 하나의 클래스만 상속받을 수 있다는 것이다.
` class Animal{ int birthday //태어난 날
public void breath(){ //숨을 쉰다는 성질 } } 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라는 키워드는 상위클래스에서 정의된 메소드의 호출에도 사용이 된다. 오버라이딩에서 조금 더 깊이 들어가자.