상속이란.
객체 지향 프로그래밍의 중요한 특징 중 하나는 상속이다.
상속은 우리가 일반 적으로 알고있듯 물려받는다는 의미이다.
부모에게서 재산을 상속 받듯이 객체 지향 프로그래밍에서도
새로운 클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance) 받아서
속성이나 기능을 확장하여 클래스를 구현하는 것이다.
이미 구현된 클래스 보다 더 구체적인 기능을 가진 클래스를 구현해야 할 때
기존 클래스를 상속한다.
하위 클래스 -> 상위 클래스 방향으로 화살표를 그려줘야 한다.
부모 클래스 -> 자식 클래스 방향이 아니다!
상속하는 클래스 : 상위 클래스, parent class, base class, super class
상속받는 클래스 : 하위 클래스, child class, derived class, subclass
- 상속의 문법
class B extends A {
}
상속을 구현 하는 경우
상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가진다.
하위 클래스는 상위 클래스보다 더 구체적인 개념과 기능을 가진다.
하위 클래스가 상위 클래스의 속성과 기능을 확장한다는 의미다.
- protected 접근 제어자
상위 클래스에서 선언된 private 멤버 변수는 하위 클래스에서 접근할 수 없기 때문에
외부 클래스는 접근할 수 없지만, 상속받은 하위 클래스는 접근 할 수 있도록 protected 접근 제어자를 사용 한다.
public class Animal {
protected String name;
protected void eat() {
System.out.println("The animal is eating.");
}
}
public class Dog extends Animal {
public void setName(String name) {
this.name = name;
}
public void displayInfo() {
System.out.println("Name: " + name);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("Buddy");
dog.displayInfo();
dog.eat();
}
}
상속에서 클래스 생성 과정과 형 변환.
하위 클래스가 생성 될 때 상위 클래스의 생성자가 먼저 호출 됩니다.
클래스가 상속 받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출합니다.
package june2023.day08.oop2;
class ParentClass {
private int number;
public ParentClass(int number) {
this.number = number;
System.out.println("부모 생성자 호출");
}
public void print() {
System.out.println("숫자: " + number);
}
}
class ChildClass extends ParentClass {
private String name;
public ChildClass(int number, String name) {
super(number); // 상위 클래스의 생성자 호출
this.name = name;
System.out.println("자식 생성자 호출");
}
public void display() {
System.out.println("이름: " + name);
print(); // 상위 클래스의 메서드 호출
}
}
public class Main08Test {
public static void main(String[] args) {
ChildClass child = new ChildClass(10, "자식");
child.display();
}
}
- 상속에서 인스턴스 메모리 상태
항상 상위클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가 생성
위와 같이 상위 클래스의 변수가 먼저 메모리에 생성되기 때문에
하위 클래스에서도 이 값을 모두 사용할 수 있다.
이때 super 예약어를 통해 하위클래스에서 상위클래스로 접근할 수 있다.
또한 상위 클래스 생성자 호출할 때도 사용 가능
- 형 변환 (업캐스팅)
편의를 위해 모든 변수와 메서드를 public으로 변경하고 변수 접근에 대해 알아보자.
만약 ParentClass p1 = new ChildClass(10, "이름"); 으로 인스턴스를 생성한다면
p1 이 가리키는 것은 무엇일까?
자식 클래스 생성자로 자식 클래스의 모든 멤버 변수에 대한 메모리는 생성되었지만
변수 타입이 상위 클래스 이기 때문에 실제 접근 가능한 변수나 메서드는 상위 클래스 변수와 메서드이다.
아래와 같이 자식클래스로 항변환 해주면 할당해준 자식 클래스 변수로 접근 가능하다.
'BACKEND > JAVA' 카테고리의 다른 글
상속과 추상 클래스, 템플릿 메서드 패턴 (0) | 2023.06.09 |
---|---|
상속과 메서드 오버라이딩, 가상 메서드 원리 (0) | 2023.06.08 |
클래스의 속성과 기능 (0) | 2023.06.05 |
객체지향 프로그래밍과 클래스 (0) | 2023.06.05 |
자바 - 스트림(Stream) (0) | 2023.06.04 |