728x90
반응형
상속 개념
상속
- 부모클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있음
상속의 이점
- 이미 개발된 클래스를 재사용하므로 중복 코드를 줄임
- 클래스 수정을 최소화
클래스 상속
클래스 상속
- 자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정하고, 부모 클래스를 다음과 같이 extends 뒤에 기술
public class 자식클래스 extends 부모클래스 {
}
- 다중 상속 허용하지 않음. extends 뒤에 하나의 부모 클래스만 상속
public class 자식클래스 extends 부모클래스1, 부모클래스2(X) {
}
부모 생성자 호출
부모생성자 호출
- 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성
자식클래스 변수 = new 자식클래스( );
- 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출
// 자식 생성자 선언
public 자식클래스(...) {
super();
...
}
메소드 재정의
메소드 오버라이딩
- 상속된 메소드를 자식 클래스에서 재정의하는 것. 해당 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용
- 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야함
- 접근 제한을 더 강하게 오버라이딩 할 수 없음(public -> private으로 변경 불가)
- 새로운 예외를 throws 할 수 없음
부모 메소드 호출
- 자식 메소드 내에서 super 키워드와 도트(.) 연산자를 사용하면 숨겨진 부모 메소드를 호출
- 부모 메소드를 재사용함으로써 자식 메소드의 중복 작업 내용을 업애는 효과
final 클래스와 final 메소드
final 클래스
- final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들수 없음
public final class 클래스 { ... }
final 메소드
- 메소드를 선언할 때 final 키워드를 붙이면 오버라이딩 할 수 없음
- 부모 클래스를 상속해서 자식 클래스를 선언 할 때, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없음
public final 리턴타입 메소드 ( 매개변수, ...) {...}
protected 접근 제한자
protected 접근 제한자
- protected는 상속과 관련이 있고, public과 default의 중간쯤에 해당하는 접근 제한
- protected는 같은 패키지에서는 default 처럼 접근이 가능하나, 다른 패키지에서는 자식 클래스만 접근을 허
타입 변환
자동 타입 변환
- 자동적으로 타입 변환이 일어나는것
- 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급
강제 타입 변환
- 부모 타입은 자식 타입으로 자동 변환되지 않음. 대신 캐스팅 연산자로 강제 타입 변환 가능
- 자식 객체가 부모 타입으로 자동 변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능
다형성
다형성
- 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
- 다형성을 구현하기 위해서는 자동 타입 변환과 메소드 재정의가 필요
필드 다형성
- 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것
//Car 객체 생성
Car myCar = new Car();
//HankookTire 장착
myCar.tire = new HankookTire();
//KumhoTire 장착
myCar.tire = new KumhoTire();
매개변수 다형성
- 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있음
- 어떤 자식 객체가 제공되느냐에 따라서 메소드의 실행 결과가 달라짐
객체 타입 확인
instanceof 연산자
Instanceof : 생성된 객체의 타입을 확인하고자 할때
- 매개변수가 아니더라도 변수가 참조하는 객체의 타입을 확인할 때 instanceof 연산자를 사용
- instanceof 연산자에서 좌항의 객체가 우황의 타입이면 true를 산출하고 그렇지 않으면 false를 산출
boolean result = 객체 instanceof 타입;
- java 12 부터는 instanceof 연산의 결과가 true 일 경우 우측 타입 변수를 사용할 수 있기 때문에 강제 타입 변환이 필요 없음
추상 클래스
추상 클래스
- 객체를 생성 할 수 있는 실체 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스
- 추상 클래스는 실체 클래스의 부모 역할. 공통적인 필드나 메소드를 물려받을 수 있다.
추상 클래스 선언
- 클래스 선언 abstract 키워드를 붙임
- new 연산자를 이용해서 객체를 직접 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있다.
public abstract class 클래스명 {
// 필드
// 생성자
// 메소드
}
*
추상 클래스 : 자식 클래스에서 사용할 기능의 틀을 만들어 놓은 것
부모 클래스 :
자식 클래스에서 기능에 대한 구체적인 기능을 구현
abstract 선언
필드, 메소드 선언
메소드에 abstract 선언해서 추상 메소드 선언()
추상 클래스 : 하나 이상의 추상 메소드가 있어야 된다.
*
추상 메소드와 재정의
- 자식 클래스들이 가지고 있는 공통 메소드를 뽑아내어 추상 클래스로 작성할 때, 메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우 추상 메소드를 선언 할 수 있음
- 일반 메소드 선언과 차이점은 abstract 키워드가 붙고, 메소드 실행 내용인 중괄호가 { }가 없다.
abstract 리턴타입 메소드명(매개변수, ...);
봉인된 클래스
sealed 클래스
- Java 15 부터 무분별한 자식 클래스 생성을 방지하기 위해 봉인된 클래스가 도입
- sealed 키워드를 사용하면 permits 키워드 뒤에 상속 가능한 자식 클래스를 지정
- final은 더이상 상속할 수 없다는 뜻이고, non-sealed는 봉인을 해제한다는 뜻
public sealed class Person permits Employee, Manager {...}
public final class Employee extends Person { ... }
public non-sealed class Manager extends Person { ... }
728x90
반응형
'자바' 카테고리의 다른 글
자바 - 중첩 선언과 익명 객체 (0) | 2023.01.17 |
---|---|
자바 - 인터페이스 (0) | 2023.01.16 |
자바 - 클래스 - 02 (0) | 2023.01.11 |
자바 - 클래스 - 01 (0) | 2023.01.10 |
자바 - 참조 타입 (0) | 2023.01.09 |