2024. 8. 14. 16:15ㆍJava/객체지향
강제타입전환
자식 타입은 부모 타입으로 자동 변환되지만, 반대로 부모 타입은 자식 타입으로 자동 변환되지 않는다. 대신 캐스팅 연산자로 강제 타입 전환을 할 수 있다.
자식 타입 변수 = (자식 타입) 부모 타입 객체;
자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
Parent parent = new Child();
Child child = (Child) parent;
자식 객체가 부모 타입으로 자동 변환하면 부모 타입에서 선언한 필드와 메서드만 사용이 가능하다. 자식 타입에 선언된 필드와 메서드를 사용하려면 강제 타입 변환을 사용해야 한다.
다형성
다형성이란 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말한다. 동일한 메서드를 상속받아 각자 부모의 메서드를 오버라이딩한다면, 메서드 호출 시 오버라이딩된 메서드가 호출된다.
필드 다형성
필드 타입은 동일하지만 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것을 의미한다.
public class Car {
public Tire tire;
public void run(){
tire.roll();
}
}
public class Tire {
public void roll(){
System.out.println("회전합니다.");
}
}
public class HanKookTire extends Tire{
@Override
public void roll() {
System.out.println("한국타이어가 회전합니다.");
}
}
public class KumhoTire extends Tire {
@Override
public void roll() {
System.out.println("금호타이어가 회전합니다.");
}
}
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.tire = new Tire();
myCar.run();
myCar.tire = new HanKookTire();
myCar.run();
myCar.tire = new KumhoTire();
myCar.run();
}
}
매개변수의 다형성
메서드가 클래스 타입의 매개변수를 가질 경우, 호출할 때 자식 객체를 제공할 수 있다. 자식 객체가 메서드를 재정의하고 있다면 재정의된 메서드가 호출된다.
객체 타입 확인
매개변수 다형성에서 실제로 어떤 객체가 매개값으로 제공되었는지 확인하기 위해서 instanceof 연산자를 확인할 수 있다. 사용은 다음과 같다. 좌항의 객체가 우항의 타입이면 true 아니면 false를 산출한다.
boolean result = 객체 instanceof 타입;
아래처럼 강제 타입 변환을 하기 전에 가능 여부를 확인하기 위해 사용한다.
if(parent instanceof Child){
Child child = (Child) parent;
}
자바12부터는 instanceof 연산의 결과가 true면 강제 타입 변환이 필요가 없다.
추상클래스
객체를 생성할 수 있는 클래스를 실체 클래스라고 하면, 이 클래스들의 공통적인 필드와 메서드를 추출해서 선언한 클래스를 추상클래스라고 한다.
추상 클래스는 new 연산자를 통해서 객체를 직접 생성할 수 없다. 추상 클래스는 extends 뒤에만 올 수 있다.
class Fish extends Animal{
}
추상 클래스 선언
클래스 선언에 abstract 키워드를 붙이면 추상 클래스가 된다. new 연산자가 불가능해진다. '
public abstract class 클래스명{
}
추상 클래스도 필드, 메서드를 선언할 수 있다. 자식 객체가 생성될 때 super()로 추상 클래스의 생성자가 호출되기 때문에 생성자도 반드시 필요하다.
추상 메서드와 재정의
공통 메서드를 뽑아서 추상 클래스로 작성할 때 메서드 선언부만 동일하고 실행 내용은 클래스마다 달라야 하는 경우가 많다. 추상 클래스는 다음과 같이 선언한다.
abstract 리턴타입 메서드명(매개변수...);
다만, 추상 메서드는 실행 내용을 가지지 않는다. 자식 클래스는 반드시 추상 메서드를 채워넣어야 한다.
봉인된 클래스
java15부터는 무분별한 자식 클래스 생성을 막기 위해 봉인된 클래스가 도입되었다. 다음은 Person의 자식 클래스는 Employee, Manager만 가능하고 그 외의 자식 클래스가 될 수 없도록 봉인할 수 있다.
public sealed class Person permits Employee, Manage{}
Employee와 Manage는 final또는 non-seal 키워드로 다음과 같이 선언하거나 sealed 키워드를 사용하여 또 다른 봉인 클래스로 선언해야 한다.
public final class Employee extends Person {}
public non-sealed class Manager extends Person {}
final은 상속 불가능, non-sealed은 봉인 해제를 의미한다. Manager는 다음과 같이 자식 클래스를 만들 수 있다.
public class Director extends Manager{}
'Java > 객체지향' 카테고리의 다른 글
[Java] 인터페이스 연습 문제 (0) | 2024.08.23 |
---|---|
[Java] 인터페이스 (0) | 2024.08.15 |
[Java] 객체 지향 연습 정답 (0) | 2024.08.13 |
[Java] 객체 지향 연습 문제 (0) | 2024.08.13 |
[Java] 객체 지향 - 3 (0) | 2024.08.09 |