본문 바로가기
JAVA

[JAVA] 상속(특징, 자식과 부모의 인스턴스 생성)

by 정공자씨 2024. 4. 18.

 

상속

 

정의

  • 클래스의 상속을 통해서 자식 클래스는 부모 클래스의 멤버변수와 메서드를 물려 받아서 사용하고
  • 부모 클래스와 다른 부분만 추가하거나
  • 부모 클래스로부터 물려받은 메서드를 재정의(메서드 오버라이딩)함으로써 기존의 코드를 쉽게 확장할 수 있음

 

 

형식 (extends)

  • 자바에서 상속을 구현할 때는 extends 예약어를 사용
  • Dog(자식 클래스)가 Animal(부모 클래스)울 상속함(extends) 
class Animal {

}
class Dog extends Animal {

}
class Cat extends Animal {

}

 

 

 

상속의 특징

  • 자바는 단일 상속만 지원함(다중 상속 X)
[ 다중 상속을 이용하고 싶을 떼 ]
인터페이스(interface)를 사용하여 다중 상속을 이용할 수 있음
  • 부모 클래스의 속성(멤버변수)과 기능(메서드)을 자식 클래스에서 자유롭게 사용할 수 있음
  • 생성자는 상속되지 않음

 

 

상속 관계에서 부모와 자식 클래스의 인스턴스 생성

상속이 이루어지는 과정에서
자식 클래스가 생성될 때 부모 클래스의 생성자가 먼저 호출이 됨

[ 이유 ]
부모 클래스의 생성자가 먼저 호출이 되어, 메모리에 변수와 메서드가 먼저 생성되어 있어야
자식 클래스에서 이를 가져와 사용할 수 있기 때문 
  • 자식 클래스의 인스턴스 생성 시(new 연산자 이용)
    • 생성자를 호출하여 메모리에 인스턴스 생성하고, 멤버변수 초기화를 진행하는데
    • 생성자 메서드의 첫 줄에서는 자동으로 부모의 기본 생성자를 호출 super(); 하여
    • 부모 클래스의 멤버변수(필드)를 먼저 초기화
  • 부모 클래스의 멤버변수를 초기화 한 후에, 자식 클래스의 생성자로 돌아와서
    • 자식 클래스의 필드를 초기화

 

실제로는

  • 자식 클래스의 인스턴스 생성 시에(new 연산)
  • 부모 클래스인 인스턴스와 자식 클래스의 인스턴스가 메모리에 생성이 되어
    • 즉, 부모와 자식 클래스가 한꺼번에  메모리 Heap 영역에 공간을 확보하고
  • 자식 클래스의 생성자의 첫 줄에서 자동으로 부모의 기본 생성자를 호출 super(); 하여, 부모 클래스의 멤버변수(필드)를 먼저 초기화 하고
  • 부모 클래스의 멤버변수 초기화를 마친 후, 자식 클래스 생성자로 돌아와서 자식 클래스의 필드를 초기화

 

[ 자식 인스턴스 생성 시, 자동으로 부모의 기본 생성자를 호출한다는 것 ]

자식의 기본 생성자에서,
부모의 기본생성자를 호출하는 코드인 super()를 직접 작성하지 않더라도
컴파일 시에 부모의 기본 생성자를 호출하는 코드를 추가해줌

 

 

 

예제

class Animal {
    String category;
}

class Cat extends Animal {
    String name;
    int age;

    public Cat() {
        super(); // 생략하면, 컴파일러가 자동으로 추가해줌
    }
}
public class AnimalTest {
    public static void main(String[] args) {
    
        Cat c = new Cat();  // Cat 인스턴스 생성(객체 생성) - 생성자 호출
    }
}
  • 부모 클래스의 멤버변수가 먼저 초기화되고
  • 별도로 값을 지정해주지 않아서, 기본값으로 초기화  
    • category = null
  • 자식 클래스의 멤버변수 초기화
    • name = null
    • age = 0

 

class Animal {
    String category;    
    public Animal() {  // 기본 생성자 }
}

class Cat extends Animal {
    String name;
    int age;

    public Cat(String name, int age) {
        super(); // 생략하면, 컴파일러가 자동으로 추가해줌
        
        // 부모클래스의 멤버변수(필드)를 초기화 한 후에, 자식클래스를 초기화 함
        this.name = name; 
        this.age = age;
    }
}
 public class AnimalTest {
     public static void main(String[] args) {
     
        Cat c = new Cat("야옹스", 2);  // Cat 인스턴스 생성(객체 생성), 매개변수 있는 생성자 호출
    }
}
  • 부모 클래스의 멤버변수가 먼저 초기화(별도로 값을 지정해주지 않아서, 기본값으로 초기화) 
    • category = null
  • 자식 클래스의 멤버변수 초기화(매개변수가 있는 생성자를 호출하여, 값 초기화)
    • name = 야옹스
    • age = 2

 

 

 

[JAVA] super와 super(), this와 this()

super와 super() 자식 클래스에서 속받은 부모 클래스의 인스턴스(객체)를 가리키는 키워드 사용 부모 클래스로부터 상속을 받았기 때문에, 부모의 멤버변수와 메서드를 사용할 수 있는데 이 때에

growingsoksok.tistory.com