🎇상속
- 코드 중복을 줄여주고, 유지 보수를 쉽게 하기 위한 것.
- 상속관계의 자식클래스는 부모클래스의 자원을 모두 사용할 수 있다.
- 힙메모리 내부를 살펴보면, 실제로 부모 클래스의 객체 생성 후 자식 클래스 객체를 만든 뒤 상속 관계를 맺는다.
- 자식 클래스의 객체 생성 시 자식 클래스의 기본 생성자 내부에 super() 라는 생성자 메서드가 내부적으로 호출되어 부모 클래스가 먼저 생성된다.
- 자식 객체에서 부모 객체의 자원을 사용 시 자바는 순서대로 자식 객체를 확인 후 부모 객체 내 자원을 확인한다.
클래스 상속
class 자식클래스 exnteds 부모 클래스 {...}
- 상속은 하나의 클래스로 부터 받을 수 있다.
- private 접근 제한한 클래스는 상속이 불가하다.
- defualt 접근 제한한 클래스는 외부 패키지에서 상속이 불가하다.
- final 예약어를 사용한 클래스는 상속이 불가하다.
- 상속 시 별도 객체 생성 없이 바로 자원 사용이 가능하다.
super
- super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출한다.
- 해당 매개변수를 가진 생성자가 없는 경우 컴파일 에러가 발생한다.
- 부모 클래스에 매개변수를 포함한 생성자를 정의한 경우, 자식 클래스에도 매개값을 포함한 생성자를 선언해야 한다.
- super() 생성자 호출 메서드는 자식 클래스 생성자의 첫 줄에 호출한다.
- 자바에서는 부모 클래스의 객체가 먼저 생성된 후 자식 클래스 생성이 가능하기 때문이다.
메서드 재정의(override)
- 규칙
1. 부모 클래스의 메서드와 동일한 시그니처를 가져야 한다.
2. 접근 제한을 더 강하게 재정의할 수 없다.
3. 새로운 예외를 throws 할 수 없다.
- 자바에서 메서드 호출 시 메서드를 자식 클래스에서 확인한 다음 없는 경우에 부모 클래스에서 찾아 호출한다.
메서드 재정의 후 부모 클래스 메서드 사용하는 경우
- super. 메서드명()으로 호출 시 부모 클래스의 메서드를 호출.
🎇final 클래스와 final 메서드
final 클래스
- 상속할 수 없는 클래스
- public final class 클래스명{...}
Ex) String(자바 표준 API 제공) 은 final로 선언되어 있기 때문에 상속이 불가함.
final 메서드
- 재정의할 수 없는 메서드
- public final 리턴타입 메서드(매개변수, ...) {}
protected 접근 제한자
- 같은 패키지 내에서는 접근 제한이 없지만, 다른 패키지에서 상속관계의 자식 클래스에서 멤버 사용이 가능하다.
🎇타입 변환과 다형성
다형성
- 다양한 형태(타입)의 객체로 변환이 가능한 성질.
- 다형성은 메서드 재정의와 타입 변환이 필요하다.
매개변수의 다형성
- 메서드의 매개변수의 타입이 상속 관계의 부모 클래스 타입인 경우, 자식 클래스 타입의 객체도 매개변수로 대입이 가능하다.(자동 타입변환)
자동 타입 변환
-
프로그램 실행 중 타입이 자동으로 변환되는 것을 의미한다.
-
부모클래스 변수명 = 자식클래스;
-
자식은 부모의 속성과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
Ex) 고양이는 고양이기도 하지만 '동물'이기도 한다.
Ex) Cat cat = new Cat(); Animal animal = cat; // 가능
-
부모 클래스 뿐만아니라 상속 계층에서 상위 타입이면 자동 타입 변환이 가능하다.
-
부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메서드만 접근이 가능하다. 즉, 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.
※ 예외적으로 메서드가 자식 클래스에서 재정의된 경우 자식 클래스의 메서드가 대신 호출 된다. 이는 메서드의 경우 재정의라는 것이 있기 때문에, 메서드 호출 시 재정의 여부 확인 후 자식 클래스의 메서드를 우선 호출 및 없는 경우 부모 클래스의 메서드를 호출해준다.
강제 타입 변환
- 부모 타입을 자식 타입으로 강제 변환하는 것.
- 부모 타입이 이전에 자식 타입 내부에 부모 객체와 동일한 객체이어야 한다.
- 즉, 서로 다른 타입의 자식 클래스 간에는 강제 타입 변환이 불가능하다.
- 부모 클래스 타입에서 자식 클래스타입으로 강제 타입 변환 시 타입 불일치로 인한 오류 발생을 줄이기 위해서 instancof 연산자를 통해 타입 확인 후 변환해줘야 한다.
🎇추상 클래스
- 추상 클래스는 클래스들의 공통적인 특성을 추출하여 선언한 클래스를 의미한다.
- 일반적으로 부모 클래스를 추상클래스, 자식 클래스로 구현을 한다.
- 추상 클래스는 객체 생성이 불가능하다.
추상 클래스의 용도
- 공통된 필드와 메서드의 이름을 통일할 목적.
- 실제 클래스 작성 시 중복 코드를 줄여 시간을 절약하기 위한 목적.
추상 클래스 선언
- 추상 클래스 선언 시 abstract 예약어를 붙힌다.
public abstract class {...}
추상 메서드와 재정의
public | protected abstract 리턴타입 메서드명(매개변수, ...);
- 메서드의 선언만 동일하고 실행 내용은 실체 클래스마다 달라야 하는 경우 하위 객체에서 추상 메서드를 재정의하여 사용한다.
- 재정의 하지 않을 경우, 컴파일 에러가 발생한다.
- 추상 메서드 선언 시 추상 클래스 안에서만 선언되어야 하며, 일반 클래스 내에서 추상 메서드 선언 시 컴파일 에러가 발생한다.