이것이 자바다(개정판) 기반 정리
목차
- 상속 개념
- 부모 생성자 호출
- 메소드 재정의
- final클래스와 final 메소드
- protected 접근 제한자
- 타입 변환
- 추상 클래스
- 봉인된 클래스
상속 개념
상속
객체지향 프로그램에서 부모 클래스의 필드와 메소드를 자식 클래스에게 물려주는 것을 말한다.
- 중복되는 코드를 줄여줘 효율적으로 코드를 작성할 수 있다.
public class 자식 클래스 extends 부모클래스 {
}
클래스 상속
- 자바는 다중 상속을 허용하지 않는다.
- 즉, extends 뒤엔 하나의 부모 클래스만 올 수 있다.
부모 생성자 호출
자식클래스 name = new 자식클래스();
- 위의 코드는 자식 객체를 생성한 것으로 보인다.
- 하지만, 부모 객체가 먼저 생성된 다음 자식 객체가 생성된 것이다.
부모 객체 생성자 호출
public 자식클래스() {
super();
}
- super : 컴파일 과정에서 자동으로 추가되는데, 부모의 기본 생성자를 호출한다.
- 만약, 부모 클래스에 기본 생성자가 없으면, 자식 생성자 선언에서 컴파일 에러가 발생한다.
- 부모 클래스에 기본 생성자 없이, 매개변수를 갖는 생성자만 있다면, 그에 맞게 매개변수를 넣어줘야 한다.
메소드 재정의
- 부모 클래스의 메소드가 자식 클래스에서 사용하기 적합하지 않을 수 있다.
- 이 경우 자식 클래스에서 메소드를 재정의해서 사용한다. -> 오버라이딩
메소드 오버라이딩
- 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것이다.
- 이 경우 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.
- 부모 메소드의 선언부인 리턴 타입, 메소드 이름, 매개변수가 동일해야 한다.
- 접근 제한을 더 강하게 오버라이딩 할 수 없다.
- 새로운 예외를 throws할 수 없다.
@Override
// 컴파일 시 정확히 오버라이딩이 되었는지 체크해주는 어노테이션
부모 메소드 호출
- 비록 부모 메소드의 일부만 변경된다 하더라도, 자식 메소드도 중복된 내용을 모두 가지고 있어야 한다.
- 이 경우 공동 작업 처리 기법을 이용해 쉽게 해결할 수 있다.
- 아래 코드를 사용하면, 부모 객체의 메소드를 호출한다.
super.부모메소드이름();
final 클래스와 final 메소드
final 클래스
- 클래스 선언할 final을 class 앞에 붙이면, 최종적인 클래스이므로 더는 상속할 수 없다.
- 즉, 부모클래스가 될 수 없어 자식 클래스도 없다.
public final class 클래스이름 {
}
final 메소드
- 메소드 선언할 때 final을 붙이면, 최종적인 메소드이므로 오버라이딩 할 수 없다.
- 즉, 자식 클래스에서 부모 클래서의 final 메소드를 재정의할 수 없다.
protected 접근 제한자
protected
- 제한 대상 : 필드, 생성자, 메소드
- 같은 패키지거나, 자식 객체만 사용 가능하다.
타입 변환
- 클래스에서 타입 변환은 상속 관계에 있는 클래스 사이에 발생한다.
자동 타입 변환
- 자동적으로 타입 변환이 일어나는 것을 말한다.
- 아래와 같은 경어 자동 타입 변환이 일어난다.
부모타입 변수 = 자식 타입 객체;
- 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면, 자동 타입 변환이 일어날 수 있다.
- 부모 타입으로 자동 타입 변환된 이후엔, 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
- 비록 변수는 자식 객체를 참조하지만, 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.
- 만약 자식 클래스에서 오버라이딩 된 메소드가 있다면, 부모 메소드 대신 오버라이딩된 메소드가 호출된다. -> 다형성과 관련됨
ex)
- Cat이 Animal을 상속받는다 가정
Cat cat = new Cat();
Animal animal = cat;
- cat과 animal은 변수 타입만 다르고, 동일한 객체를 참조한다.
- 따라서 두 참조 변수의 == 연산 결과는 true다.
강제 타입 변환
- 부모는 자식 타입으로 자동 변환되지 않아, 캐스팅 연산자로 강제 타입 변환을 해야한다.
자식타입 변수 = (자식타입) 부모타입객체;
- 그런데 자식이 부모 타입으로 자동 변환 후, 다시 자식 타입으로 변환할 때 강제 타입을 사용할 수 있다.
추상 클래스
- 추상(abstract) : 실체 간에 공통되는 특성을 추출한 것이다.
추상 클래스
- 클래스들의 공통적인 필드나 메소드를 추출해 선언한 클래스다.
- 객체를 생성할 수 있는 클래스를 실체 클래스라고 한다.
- 추상 클래스는 실체 클래스의 부모 역할을 한다.
- 즉, 실체 클래스는 추상 클래스를 상속해 공통적인 필드나 메소드를 물려받을 수 있다.
public abstract class 클래스명 {
// 필드
// 생성자
// 메소드
}
- new 연산자를 이용해 객체를 직접 만들지 못 하고, 상속을 통해 자식클래스만 만들 수 있다.
- 즉, extends 뒤에만 올 수 있다.
- 자식 객체가 생성될 때 super()로 추상 클래스의 생성자를 호출하기 때문에, 생성자도 반드시 있어야 한다.
추상 메소드와 재정의
- 공통 메소드를 뽑아 추상 클래스를 작성할 때, 메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우가 있다.
- 이 경우 추상 클래스에서 통일해 작성할 수 없으므로, 추상 메소드를 선언할 수 있다.
- 추상 메소드는 자식 클래스의 공통 메소드라는 것만 정의하고, 실행 내용을 가지지 않는다.
public abstract class 클래스명 {
abstract void 메소드명();
}
- 추상 메소드는 자식 클래스에서 반드시 오버라이딩 해야 한다.
봉인된 클래스
- Java 15부터는 무분별한 자식 클래스 생성을 방지하기 위한 봉인된(sealed) 클래스가 도입됐다.
ex)
public sealed class Animal permits Dog, Cat {
}
- sealed 키워드를 사용하면, permits 키워드 뒤에 상속 가능한 자식 클래스를 지정해야 한다.
public final class Dog extends Dog {...}
public non-sealed class Cat extends Cat {...}
- 봉인된 클래스를 상속한 클래스는 final (상속 불가), non-sealed(봉인 해제) 키워드로 위와 같이 선언하거나, sealed 키워드를 사용해 또 다른 봉인 클래스로 선언해야 한다.
- 즉, non-sealed의 경우엔 자식 클래스를 만들 수 있다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 중첩 선언과 익명 객체 (1) | 2023.10.04 |
---|---|
[Java] 인터페이스 (0) | 2023.09.13 |
[Java] Static (0) | 2023.06.30 |
[JAVA] 클래스 (0) | 2023.01.14 |
[JAVA] 참조 타입 (2) | 2022.11.08 |