본문 바로가기

Dev.BackEnd/JAVA

[JAVA] 4. 상속과 생성자 / extends, super




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