상속이란
부모 클래스의 필드, 메소드를 자식 클래스에게 물려주는 것
- 클래스 이름 뒤에
extends 부모클래스
로 상속 받을 부모 클래스를 설정 - 상속은 한 부모 클래스로부터만 받을 수 있음
public class 자식클래스 extends 부모클래스 {}
부모 생성자 호출
자식 클래스의 객체를 생성하면 부모 객체가 먼저 생성된 다음 자식 객체가 생성된다.
super()
메소드로 부모 클래스의 생성자를 실행하여 부모 객체 생성
public 자식클래스(...) {
super(); // 부모 객체 생성(생략 가능)
...
}
- 부모 클래스에 기본 생성자가 없는 경우
super()
메소드에 인자를 넣음
public 자식클래스(...) {
super(매개값, ...);
...
}
매소드 오버라이딩
부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용하는 것
- 부모 메소드 선언부와 동일해야 함(리턴 타입, 메소드 이름, 매개변수)
- 접근 제한 더 강하게 불가능(public -> private 불가능)
- 새로운 예외를 throws 할 수 없음
- 메소드 오버라이딩이 됐다면 자식 메소드를 우선적으로 사용
- 메소드 오버라이딩을 하려면 부모 메소드 내용을 자식 메소드에 전부 작성해야 함
- 부모 메소드 내용은
super()
로 대신하고 나머지 내용만 추가 - @Override: 컴파일 단계에서 정확히 오버라이딩 되었는지 체크하고, 문제 시 컴파일 에러 출력
- 부모 메소드 내용은
final 클래스와 final 메소드
final
을 붙이면 초기값 설정 후 변경할 수 없음final
을 클래스와 메소드에 붙인다면?
final 클래스
상속할 수 없는 클래스 -> 자식 클래스 만들 수 없음
final 메소드
오버라이딩 할 수 없는 메소드 -> 자식 클래스에서 메소드 재정의(오버라이딩)할 수 없음
protected 접근 제한자
같은 패키지 내에서는 모두 접근 가능(default) But 다른 패키지 내에서는 자식 클래스에서만 접근 가능
- 필드, 생성자, 메소드 선언에 사용 가능(클래스 사용X)
- ex. 다른 패키지이지만 package1의 클래스를 상속 받았기 때문에 protected 필드, 생성자, 메소드에 접근 가능
// package1
public class A {
protected String field; // 필드 선언
protected A() {} // 생성자 선언
protected void method() {} // 메소드 선언
}
// package2
import ch07.sec06.package1.A;
public class D extends A {
public D() {
super(); // A() 생성자 호출
}
public void method1() {
// A 필드값 변경 및 메소드 호출 가능(상속)
this.field = "value";
this.method();
}
public void method2() {
// 아래처럼 직접 객체 생성해서 사용하는 것은 불가
// A a = new A();
// a.field = "value";
// a.method;
}
}
`
타입 변환
자동 타입 변환
부모타입 변수 = 자식타입 객체;
: 자식타입 객체가 부모타입 변수로 자동 타입 변환
class Animal {...}
class Cat extends Animal {...}
// Cat 객체를 Animal 타입으로 자동 타입 변환
// Cat 클래스의 고유한 필드와 메서드에 접근 불가능. 부모 클래스의 필드, 메서드만 접근 가능
Cat cat = new Cat();
Animal animal = cat;
// Animal animal = new Cat(); // 이것도 가능
cat == animal // true
강제 타입 변환
자식타입 변수 = (자식타입) 부모타입객체;
: 부모타입 객체를 자식타입 변수로 강제 타입 변환
- 자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환 사용
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환
객체 타입 확인 - instanceof
instanceof 연산자를 통해 객체의 타입 확인
객체 instanceof 타입;
: 객체가 타입이면 true, 아니면 false
Parent parent1 = new Child(); // Child 객체 생성
Parent parent2 = new Parent(); // Parent 객체 생성
method(parent1); // true
method(parent2); // false
public void method(Parent parent) {
// parent 매개변수가 참조하는 객체가 Child인지 조사
// Child 타입이 아니라면 강제 타입 변환을 할 수 없기 때문
if(parent instanceof Child) {
Child child = (Child) parent;
// child 변수 사용
}
}
// Java 12부터는 instanceof 연산의 결과가 true일 경우 우측 타입 변수를 사용할 수 있기 때문에 강제 타입 변환 불필요
if(parent instanceof Child child) {
// child 변수 사용
}
추상 클래스 - abstract
실체 클래스들의 공통 필드, 메소드 추출해서 만든 클래스
public abstract class 클래스명 {...}
- 추상 클래스 상속받아 필드, 메소드 물려받는 용도
- 추상 클래스 객체 생성 불가능(상속 용도로만 사용 - extends 뒤에만 옴)
public abstract class Phone {
// 필드 선언
String owner;
// 생성자 선언
Phone(String owner) {
this.owner = owner;
}
// 메소드 선언
void turnOn() {
System.out.println("폰 전원을 켭니다.");
}
void turnOff() {
System.out.println("폰 전원을 끕니다.");
}
}
public class SmartPhone extends Phone {
SmartPhone(String owner) {
// Phone 생성자 호출
super(owner);
}
void internetSearch() {
System.out.println("인터넷 검색을 합니다.");
}
}
public class PhoneExample {
public static void main(String[] args) {
// Phone phone = new Phone(); -> 불가
SmartPhone smartPhone = new SmartPhone("홍길동");
smartPhone.turnOn(); // 폰 전원을 켭니다.
smartPhone.internetSearch(); // 인터넷 검색을 합니다.
smartPhone.turnOff(); // 폰 전원을 끕니다.
}
}
추상 메소드
메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우 사용
- abstract 리턴타입 메소드명(매개변수, ...);
public abstract class Animal {
public void breathe() {
System.out.println("숨을 쉽니다");
}
public abstract void sound();
}
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
봉인된 클래스
- final 클래스를 제외한 모든 클래스는 부모 클래스가 될 수 있지만, Java 15부터는 무분별한 자식 클래스 생성 방지를 위해 봉인된(sealed) 클래스가 도입되었다.
// permits 키워드 뒤에 상속 가능한 자식 클래스 지정
public sealed class Person permits Employee, Manager {...}
봉인된 Person 클래스를 상속하는 Employee와 Manager는 final 또는 non-sealed 키워드로 선언하거나, sealed 키워드를 사용해서 또 다른 봉인 클래스로 선언
public final class Employee extends Person {...}
public non-sealed class Manager extends Person {...}
'Programming Language > 자바(JAVA)' 카테고리의 다른 글
[JAVA] 중첩 클래스, 중첩 인터페이스, 익명 객체 (0) | 2024.11.25 |
---|---|
[JAVA] 인터페이스 (0) | 2024.11.25 |
[JAVA] 클래스 - 접근 제어자, final, static (0) | 2024.11.24 |
[JAVA] 참조 타입 - 문자열, 배열 (3) | 2024.11.21 |
[JAVA] ArrayList, LinkedList 자료구조 (1) | 2024.06.21 |