✓ 상속
class 자식클래스 extends 부모클래스 {
...
}
- 여러 개의 부모 클래스를 상속할 수 없다.
- 부모 클래스 중 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
- 서로 다른 패키지에서 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다.
super()
자식 생성자를 직접 선언하고 명시적으로 부모 생성자를 호출하는 방법
super.method2() 이런식으로도 사용 가능하다
자식클래스 ( 매개변수선언, ... ) {
super(매개값, ... );
...
}
예시:
// 부모 클래스
public class People {
public String name;
public String ssn;
public People(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
// 자식 클래스
public class Student extends People {
public int studentNo;
public Student(String name, String ssn, int studentNo) {
super(name, ssn);
this.studentNo = studentNo;
}
}
메소드 재정의 Overriding
상속된 일부 메소드를 수정해서 사용하는 것
- 부모 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다
- 접근 제한을 더 강하게 재정의 할 수 없다
- 새로운 예외를 throws할 수 없다
- 재정의 시 @Override 어노테이션을 쓰면 실수를 줄일 수 있다.
❗️ final 키워드가 붙은 클래스: 상속할 수 없는 클래스
final 키워드가 붙은 메소드: 재정의할 수 없는 메소드
💡 protected 접근 제한자
같은 패키지 내에서는 접근 제한이 없지만 다른 패키지에서는 자식 클래스만 접근을 허용한다. 필드, 생성자, 메소드 선언에 사용될 수 있다.
✓ 타입 변환과 다형성
1️⃣ 자동 타입 변환: 클래스의 자동 타입 변환은 상속 관계에 있는 클래스 사이에서 발생한다.
자식은 부모 타입으로 자동 타입 변환이 가능하다.
Cat cat = new Cat();
Animal animal = cat;
// Animal animal = new Cat(); 도 가능
cat과 animal 변수는 타입만 다를 뿐 동일한 Cat 객체를 참조한다. (cat === animal의 결과값은 true)
❗️ 부모 타입으로 자동 타입 변환된 후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
❗️ 만약 메소드가 자식 클래스에서 재정의되었다면 자식 클래스의 메소드가 대신 호출 된다.
2️⃣ 필드의 다형성: 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다.
매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다.
3️⃣ 강제타입변환: 부모 타입을 자식 타입으로 변환하는 것.
자식타입이 먼저 부모타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환될 때 사용가능.
// 자식타입 변수 = (자식타입) 부모타입;
Parent parent = new Child();
Child child = (Child) parent;
❗️ 강제 타입 변환을 할 경우 자식에 선언된 필드와 메소드를 사용할 수 있다.
✅ instanceof 연산자: 어떤 객체가 어떤 클래스의 인스턴스인지, 객체 타입을 확인하는 연산자
부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확인할 때 쓰인다.
⇨ boolean result = 좌항(객체) instanceof 우항(타입)
✓ 추상 클래스
- 실체 클래스: 객체를 직접 생성할 수 있는 클래스
- 추상 클래스: 실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스
💡 이때 추상 클래스가 부모이고 실체 클래스가 자식이라 실체 클래스는 부모의 특성인 추상 클래스의 필드, 메소드를 물려 받는다.
추상 클래스 선언하기
public abstract class 클래스 {
...
}
❗️ 자식 객체가 생성될 때 super()를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.
❗️ 추상 클래스는 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다.
❗️ 부모 클래스로만 사용되기 때문에 extends 뒤에만 올 수 있는 클래스이다.
추상 메소드 선언
abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호가 없는 메소드.
public abstract class Animal {
public abstract void sound();
}
'컴퓨터 & 코딩 > Java' 카테고리의 다른 글
[혼공학습단 10기][혼공자] 멀티 스레드 (0) | 2023.07.17 |
---|---|
[혼공학습단 10기][혼공자] 기본 API 클래스 (0) | 2023.07.13 |
[혼공학습단 10기][혼공자] 3주차 미션 (0) | 2023.07.12 |
[혼공학습단 10기][혼공자] 예외 처리 (0) | 2023.07.12 |
[혼공학습단 10기][혼공자] 중첩 클래스 / 중첩 인터페이스 / 익명 객체 (0) | 2023.07.10 |