반응형
타입 변환
기본 타입과 마찬가지로 클래스에도 타입 변환이 존재!
프로그램 실행 도중 자동으로 타입 변환이 일어나는 것을 자동 타입 변환이라고 하고
형식은 부모타입 변수 = 자식타입; 로 나타낼 수 있다.
Sub test = new Sub();
Main test1 = test;
자동 타입 변환은 굳이 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입인 경우에도 일어날 수 있다.
그리고, 부모 타입으로 자동 변환된 이후에는 부모 클래스에 선언된 필드 및 메소드만 접근이 가능!
하지만 자식 클래스에서 메소드가 재정의 되었을 경우엔 자식 클래스의 메소드가 대신 호출된다
public class Main {
public void test1() {}
public void test2() {System.out.println("Main");}
}
public class Sub extends Main{
public void test3() {}
public void test2() {System.out.println("Not main");}
}
public class Test{
public static void main(String[] args){
Sub test0 = new Sub();
Main test00 = test;
test00.test1():
test00.test2(); // Sub의 test2 method 호출
}
}
다형성
재정의 + 타입변환으로 객체지향의 다형성을 구현할 수 있다
필드의 다형성
필드 타입을 부모 타입으로 선언할 경우 자식 객체에 따라 달라질 수 있다
class Car{
//field
Tire frontT = new Tire();
Tire backT= new Tire();
public void run(){
frontT.roll();
backT.roll();
}
}
Car myC = new Car();
myC.frontT = new HTire();
myC.backT = new KT();
myC.run();
매개 변수의 다형성
매개 변수를 부모 타입으로 선언하게 되면 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체들을 제공할 수 있다.
이는 자식의 재정의된 메소드를 이용할 수 있음을 의미하고 매개 변수로도 다형성을 구현할 수 있음을 의미한다.
class Driver{
public void drive(Vehicle vehicle){
vehicle.run();
}
}
Driver driver = new Driver();
Taxi taxi = new Taxi();
driver.drive(taxi);
강제 타입 변환
부모 타입을 자식 타입으로 변환할 때 강제 타입 변환을 이용한다.
단 조건이 있는데 자식 타입이 부모 타입으로 자동 타입 변환된 후 다시 반대로 변환할 때 사용할 수 있다
Parent parent = new Child(); //이와 같은 자동 타입 변환된 후인 경우만 가능!
Child child = (Child) parent;
따라서 타입 변환을 확인하지 않고 강제 타입 변환 시도 시에는 ClassCastException 오류가 발생할 수 있는데
이는 instanceof 연산자를 통해 확인 후 안전하게 실행해서 확인하고 해결할 수 있다.
public void test(Parent parent){
if(parent instanceof Child){
Child child = (Child) parent;
//만약 parent에 Child 객체가 들어오면 조건문 값은 true가 될 것이고 그렇지 않을 경우엔 false가 반환된다.
}
}
반응형
'Language > Java' 카테고리의 다른 글
Java 인터페이스 (0) | 2022.05.30 |
---|---|
Java 추상클래스 (0) | 2022.05.30 |
Java 상속 (0) | 2022.05.22 |
Java 접근 제한자 (0) | 2022.05.13 |
Java 인스턴스 멤버와 정적 멤버 (0) | 2022.05.10 |