상속
정의
- 클래스의 상속을 통해서 자식 클래스는 부모 클래스의 멤버변수와 메서드를 물려 받아서 사용하고
- 부모 클래스와 다른 부분만 추가하거나
- 부모 클래스로부터 물려받은 메서드를 재정의(메서드 오버라이딩)함으로써 기존의 코드를 쉽게 확장할 수 있음
형식 (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' 카테고리의 다른 글
[JAVA] JAVA 메모리 영역(method, stack, heap 영역) (0) | 2024.04.19 |
---|---|
[JAVA] 접근 제한자(public < protected < default < private) (0) | 2024.04.18 |
[JAVA] 변수와 데이터 타입(기본형 타입, 참조형 타입) (0) | 2024.04.18 |
[JAVA] 오버로딩(메서드 오버로딩, 생성자 오버로딩) (0) | 2024.04.18 |
[JAVA] 생성자(기본 생성자, 매개변수 있는 생성자, 주의할 점) (0) | 2024.04.18 |