[Java] 상속

나무나무·2025년 1월 10일

자바

목록 보기
1/6

상속

  • 객체 지향형 프로그래밍에서 가장 핵심적인 요소에 해당됨.
  • 부모 클래스가 자식 클래스에게 자신의 멤버를 물려주는 것을 의미함. 부모에게 있는 필드 값과 메서드를 그대로 사용 가능하게 되는 것에 해당됨.
  • 모든 클래스는 Object 클래스의 자식이다.
// 부모 클래스
public class Car{
	...
}
// Car를 상속 받는 자식 클래스
public class Electriccar extends Car{
	...
}

1) 메모리 구조

  • 일반적으로 부모 클래스를 상속받는 자식 클래스를 생성하면 부모 클래스에 대한 인스턴스도 같이 생성됨.
    ex) ElectricCar ecar 생성 -> Car(부모 클래스), ElectricCar ecar 둘 다 생성됨.
  • 상속 관계의 대상을 호출할 때는 대상 타입을 지정해주어야 함. 기준은 호출 변수의 타입. 현재 타입에서 찾지 못한 경우 -> 상위 클래스로 이동해서 찾게 됨.
    ex) ElectricCar 타입에서 메서드나 필드를 찾지 못하면 Car로 올라가서 찾게 됨.

2) 메서드 오버라이딩

오버라이딩 vs 오버로딩

  • 오버라이딩(Overriding) : 부모 클래스의 메서드를 자식 클래스에서 재정의해서 사용하는 것을 의미.
  • 오버로딩(Overloading) : 메서드 이름은 동일하나 매개변수 수나 타입이 다른 메서드를 여러 개 정의하는 것을 의미.
  • 오버라이딩의 경우 메서드 이름 / 매개변수 타입, 개수 / 반환 타입이 동일해야 가능하다.
  • static / final / private이 붙은 부모 타입의 메서드는 오버라이딩 할 수 없다. 멤버 변수에도 접근할 수 없다.
// 부모 클래스
public class Animal {
  private String name;
  private String kinds;
  
  public Animal() {
  }

  public Animal(String name, String kinds) {
      this.name = name;
      this.kinds = kinds;
  }
  // 부모 클래스의 
  public String bark() {
      return "짖는다.";
  }
}

// 자식 클래스
public class Dog extends Animal {
  private int weight;

  public Dog() {
  }

  public Dog(String name, String kinds, int weight) {
    super(name, kinds);

    this.weight = weight;
  }

  // 오버라이드 하는 메서드
  @Override
  public String bark() {
      return "멍멍~ 짖는다.";
  }
}

3) 생성자

  • 일반적으로 생성자를 명시하지 않은 경우, 인스턴스 생성시 내부에 기본적으로 만들어져 있는 생성자가 호출된다.
  • 만약 자식 클래스 인스턴스를 생성할 경우 부모 클래스의 인스턴스도 함께 생성되면서 부모의 기본 생성자() -> 자식의 기본 생성자() 순으로 호출된다.
    ex) super(); -> Electriccar(); 순서
  • 부모 클래스의 생성자가 기본 생성자에 해당할 경우 생략이 가능하지만, 부모 클래스에서 생성자가 기본 생성자가 아닌 경우, 반드시 자식 클래스의 생성자에서 부모 클래스를 명시적으로 호출해주어야 한다.
  • 부모 클래스의 생성자는 자식 클래스 생성자의 제일 첫 번째 줄에 위치해야 한다.
  • 부모 클래스의 생성자는 자식 클래스의 생성자 내에서만 호출이 가능하다. 다른 필드나 메서드에서는 호출이 불가능하다.
// 부모 클래스
public class Product {
    protected String code;
    protected String name;
    protected String brand;
    protected int price;

	// 부모 클래스 기본 생성자
    public Product() {
        System.out.println("부모 클래스의 기본 생성자 호출");
    }
	// 부모 클래스의 생성자
    public Product(String code, String name, String brand, int price) {
        this.code = code;
        this.name = name;
        this.brand = brand;
        this.price = price;
    }
}


// 자식 클래스
public class Desktop extends Product{
    private boolean allInOne; // 일체 여부
    
    // 자식 클래스의 기본 생성자
    public Desktop(){
    	// super();가 먼저 호출됨. 기본적으로 이건 생략되어 있음.
        System.out.println("자식 클래스의 기본 생성자 호출");
    }

    public Desktop(String code, String name, String brand, int price, boolean allInOne) {
		// 자식 생성자에서 부모 생성자 초기화 가능
        this.code = code;
        super.name = name;
        this.brand = brand;
        super.price = price;

        this.allInOne = allInOne;
    }
}

profile
백엔드 개발자 나무입니다

0개의 댓글