상속(Inheritance)이란?
- 상속이란 특정 클래스를 구성할 때 기존 클래스의 데이터(속성)와 메소드를 상위(부모) 클래스에서
그대로 물려받아서 중복적인 코드를 줄인 것
- 하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화
데이터 위주의 상속 팁
- 데이터가 옆으로 늘어날 때(칼럼이 추가될때) 사용하자
- 하위 클래스를 먼저 만들고 상위 클래스로 뽑아내는 것
- private으로 문제 발생할때는 protected, getter/setter을 사용하여 해결
상속에서 사용하는 용어 및 설명
용어 및 문법 | 설명 |
---|
부모 클래스, Super 클래스, Parent | 코드를 물려주는 클래스 |
자식 클래스, Sub 클래스, Child | 코드를 물려 받는 클래스 |
extends | 상속을 사용하는 문법 |
- 자식 클래스는 부모 클래스의 모든 것을 물려받는다
- JAVA에서는 하나의 부모 클래스만 가질수있습니다
- 변수의 타입은 컴파일러를 위한 것
->변수의 타입에 상관없이 실행되는 것은 결국은 객체
원하는 메소드가 없다면 부모 클래스를 찾아서 실행하려 한다
public class Store {
public void makeZazang(){
System.out.println("짜장면을 만들어요");
}
}
public class SeoulStore extends Store{
@Override
public void makeZazang() {
System.out.println("간짜장을 만듭니다.");
}
}
this 와 super
- this -> 현재 코드를 실행하는 객체의 데이터나 메소드를 호출할 때 사용
현재 클래스의 또 다른 생성자를 호출하고자 할 때 사용하는 방식
같은 클래스의 또 다른 생성자를 호출할 때 사용
- super -> 현재 코드에서 명시적으로 부모 클래스의 속성이나 메소드를 호출할 때 사용
상속 관계에서 부모 클래스에 정의된 생성자를 사용하는 방식
실제 호출되는 생성자는 부모 클래스 안에 정의해 둔 생성자 호출
오버라이드(Override)
- 자식 클래스에서 부모 클래스의 메소드를 다시 정의
- 잘 이용하면 간단한 코드로 if~else를 없앨 수 있다
추상 클래스(Abstract Class)
- 객체가 아니라 타입으로만 존재하고 추상 메소드를 가지는 존재
- 객체 생성의 용도로 사용하지 않음
- 변수의 타입으로 선언하는 용도, 상속의 본연의 기능으로 하위 클래스로 코드를 물려주는 기능
- 100%사용 -> new를 선언하지 못하게
- 90%%사용 -> new를 선언하지 못하는 것 + 강제성(오버라이드를 강제적으로 해야함)
체크
- 반드시 ~의 일종이 성립할 때만 사용하자 이외에는 조합(Composition)을 이용할 것
- 단순 기능을 하나로 모으려고 상속을 사용하지 않음
- 하위 클래스에서 오버라이드를 많이 할수록 위험한 신호
- incetanceof를 사용할 때 if~else가 많이 나오면 위험한 신호
변수를 이용할 때 실제 움직이는 객체가 무엇인지 생각해보자.