클래스 상속
객체 지향 프로그램에서 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있습니다.
이것을 상속이라고 합니다.
이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에 중복되는 코드를 줄일 수 있습니다.
부모 클래스의 한번의 수정으로 모든 자식 클래스까지 수정되는 효과가 있어 유지보수 시간이 줄어듭니다.

이렇게 B는 A의 상속을 받음으로써
B는 B의 method2()와 field2 뿐만 아니라 A의 method1()과 field1 모두를 사용할 수 있습니다.
🚨유의사항🚨
- 동시에 여러 개의 부모 클래스 상속할 수 없습니다.
- 부모클래스에서 private 접근 제한 갖는 필드와 메소드는 상속 대상에서 제외됩니다.
- 부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메소드 역시 제외됩니다.
- 자식 객체를 생성할 때 부모 객체가 먼저 생성되고 그 다음 자식 객체가 생성됩니다.
메소드 재정의 (오버라이딩)
부모 클래스의 메소드가 자식 클래스에서 사용될 때, 자식 클래스에 맞게 수정이 필요할 경우가 발생할 수 있습니다.
이렇게 재정의 하는 것을 메소드 오버라이딩이라고 합니다.
메소드 오버라이딩 방법
- 부모 메소드와 동일한 시그니처를 가져야 합니다.
- 접근 제한자를 더 좁은 범위로 재정의할 수 없습니다.
- 새로운 예외를 추가하여 throws 할 수 없습니다.
⭐다음과 같이 메소드가 오버라이딩될 경우 부모 객체 메소드가 숨겨지며, 자식 객체에서 메소드 호출하면 재정의된 자식 메소드가 호출됩니다.

그렇다면 자식 클래스에서 오버라이딩했지만 부모 클래스 메소드를 호출해야하는 경우엔 어떡할까요❓
-> super 키워드를 붙여 부모 메소드를 호출할 수 있습니다❗

final 클래스와 final 메소드
final = 해당 선언이 최종 상태이며 수정될 수 없음
final이 붙은 클래스는 상속할 수 없습니다.
즉, 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없습니다.
final 메소드는 재정의 할 수 없습니다.
즉, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없습니다.
다형성
기본타입과 마찬가지로 클래스도 타입 변환이 있습니다.
이것을 이용하면 프로그래밍의 다형성을 구현할 수 있습니다.
사용방법은 동일하지만 다양한 객체를 활용해 여러 실행결과가 나오도록 하는 성질입니다.
메소드 재정의 + 타입변환 -> 다형성

저는 이 그림이 다형성이라는 개념을 잘 설명 해 준다고 생각합니다.
자동차가 있고 그에 따른 부품들 중 상황에 따라 한국 타이어를 넣을 수도 있고
금호 타이어 객체를 넣을 수 있는것이 다형성 입니다.
자동 타입 변환
자동 타입 변환은 프로그램 실행 도중 자동으로 타입 변환이 일어나는 것을 말합니다.

Cat cat = new Cat();
Animal animal = cat;
이렇게 부모 클래스의 참조변수에 자식 클래스 객체를 넣어줄 수 있습니다.

바로 위 부모가 아니더라도 상속 계층에서 상위 타입인 경우 자동 타입 변환이 일어날 수 있습니다.
하지만 다른 줄기의 참조 변수에 객체를 담을 수 없습니다.

🚨유의할 점🚨
부모의 참조 변수에 자식 객체를 담았을 경우,
1차적으로 부모의 메소드를 호출합니다.
하지만, 자식 클래스에서 해당 메소드에 대한 오버라이딩이 일어난 경우 자식 메소드를 호출합니다.
부모 참조변수 클래스에 없는 메소드를 호출은 불가능 합니다.
이것을 저만의 방식대로 조금 더 쉽게 설명해 보겠습니다.

왼쪽이 부모 리모컨, 오른쪽이 자식 리모컨입니다.
- 자식 리모컨에서 Youtube 버튼을 눌렀을 때 기능이 완전 같기 때문에 부모 리모컨의 Youtube 기능을 그대로 동작합니다.
- 자식 리모컨에서 Netflix 버튼을 눌렀을 때 자식 리모컨에서 알맞게 재정의 했기 때문에 자식 리모컨의 Netflix 기능을 그대로 동작합니다.
- 자식 리모컨에서 Google 버튼을 눌렀을 때 부모 리모컨에서 받은 것이 없기 때문에 호출이 불가능 합니다.
이런 식으로 간단하게 비유 해 보았습니다.
강제 타입 변환
부모 타입 객체를 다시 자식 타입에 대입할 때 강제 타입 변환이 필요합니다.

instanceof 연산자
Parent parent = new Parent();
Child child = (Child) parent; // 강제 타입 변환을 할 수 없음
public void method(Parent parent){
if(parent instanceof Child){ // parent 매개변수가 참조하는 객체가 Child인지 조사
Child child = (Child) parent;
}
}
이렇게 봤을땐 잘 이해가지 않아서 찾아보았습니다.
class Parent{}
class Child extends Parent{}
public class InstanceofTest {
public static void main(String[] args){
Parent parent = new Parent();
Child child = new Child();
System.out.println( parent instanceof Parent ); // true
System.out.println( child instanceof Parent ); // true
System.out.println( parent instanceof Child ); // false
System.out.println( child instanceof Child ); // true
}
}
출처: https://mine-it-record.tistory.com/120 [나만의 기록들:티스토리]
한줄로 instanceof에 대한 모든것을 설명하는 문장이 있었습니다.
instanceof는 해당 클래스가 자기 집이 맞는지 확인 해 주는 것
parent instanceof Parent : 부모가 본인 집을 찾았으니 true
child instanceof Parent : 자식이 상속받은 부모 집을 찾았으니 true (상속을 받았으니 자기 집이라 해도 무방하다?)
parent instanceof Child : 부모가 자식 집을 찾았으니 false (자식 집은 자식 집이지 부모 집은 아니니까)
child instanceof Child : 자식이 본인 집을 찾았으니 true
이렇게 비유를 하니 너무 쉽게 이해가 되었습니다 :)
'🧮Programming > Java' 카테고리의 다른 글
| [Java] 예외 처리 (0) | 2024.02.06 |
|---|---|
| [Java] 추상 클래스, 인터페이스 (1) | 2024.02.06 |
| [Java] 패키지와 접근 제한자 (0) | 2024.02.06 |
| [Java] 객체와 클래스 (0) | 2024.02.06 |
| [Java] 배열(Array) (0) | 2024.02.05 |