본문 바로가기
java&eclipse 코딩 알고리즘/20231215

UpDownCastingTest

by 몽상크리에이터 2023. 12. 15.

package com.tjoeun.abstractClass;

 

class Base {

 

// package 접근 권한은 접근 권한 지정자를 생략하면 package 권한으로 설정된다. (예전에 default 라고 불림)

// package 접근 권한은 같은 package에서는 public 처럼 사용되고 다른 package에서는

// private 처럼 사용된다.

String name; // 접근 권한을 생략했으므로 package 권한을 의미한다.

void say() {

System.out.println(name + "님 안녕하세요");

}

}

 

class Sub extends Base {

int age;

 

@Override

void say() {

System.out.println(name + "님은 " + age + "살 입니다.");

}

 

 

 

}

public class UpDownCastingTest {

 

public static void main(String[] args) {

 

// 부모클래스 타입에 부모 클래스 타입의 객체를 만들어 넣어주면 아무 문제없이 처리된다.

Base base = new Base();

base.name = "홍길동";

base.say();

System.out.println("===================");

 

Sub sub = new Sub();

sub.name = "임꺽정";

sub.age = 20;

sub.say();

System.out.println("===================");

 

// 결론 => 부모클래스가 자식 클래스를 제어할 수 있지만, 자식 클래스가 부모 클래스를 제어할 수 없다.

 

// 부모 클래스 타입에 자식 클래스 타입의 객체가 생성된 주소를 대입하면 아무 문제 없이 처리된다. UpCasting

// Base b = new Sub();

// b.say();

 

// 자식 클래스 타입에 부모 클래스 타입의 객체가 생성된 주소를 대입하면 에러가 발생된다.

// Sub s = new Base(); 에러발생

 

// 부모 클래스 타입의 객체에 자식 클래스 타입의 객체를 대입한다 => UpCasting

// DownCasting 부모 클래스 타입으로 <<UpCasting 된 자식 클래스>>를

// 다시 자식 클래스 타입으로 변환하는 것을 말한다.

Base b = sub; // => 업캐스팅 UpCasting

// b는 부모클래스 타입의 객체지만 자식 클래스 타입을 대입했으므로 say()메소드를 실행하면 부모 클래스의 say()메소드가 아닌,

// 자식 클래스의 say()메소드가 실행된다.

b.say();

System.out.println("===================");

 

// 자식 클래스 타입에 부모 클래스 타입의 객체를 대입하면 에러가 발생하는데 이 때, 부모 클래스 타입을 자식 클래스

// 타입으로 형변환 시켜 대입하면 대입이 가능해지지만 정상적인 DownCasting이 아닌 경우 문법적인 오류는 없더라도,

// 실행하면 ClassCastException이 발생한다.

// Sub s = (Sub) base; // casting 시키면 문법적인 에러는 발생되지 않는다.(하지만 base는 업캐스팅 된 것이 아니라서 실행시 에러)

Sub s = (Sub) b; // 다운캐스팅 DownCasting //b는 업캐스팅 된 것이라 다운캐스팅시 정상 처리.

 

// instanceof 연산자는 어떤 객체가 instanceof 뒤에 지정한 클래스 타입으로 안전하게 형변환이 가능한지 검사하는 연산자이다.

if (sub instanceof Base) {

System.out.println("Sub 클래스 타입의 객체는 Base 클래스 타입으로 형변환 가능");

Base base2 = (Base) sub;

base2.say();

} else {

System.out.println("Sub 클래스 타입의 객체는 Base 클래스 타입으로 형변환 불가능");

}

System.out.println("==============================================================");

if (base instanceof Sub) {

System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 가능");

// base는 Sub클래스 타입이 Base클래스 타입으로 Upcasting 된 객체가 아니므로 DownCasting이 불가능하다.

Sub sub2 = (Sub) base;

sub2.say();

} else {

System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 불가능");

}

System.out.println("==============================================================");

if (b instanceof Sub) {

System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 가능");

// b는 Sub클래스 타입이 Base클래스 타입으로 Upcasting 된 객체라서 DownCasting이 가능하다.

Sub sub3 = (Sub) b;

sub3.say();

} else {

System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 불가능");

}

System.out.println("==============================================================");

 

try {

Sub sub4 = (Sub) base;

sub4.say();

} catch (ClassCastException e) {

System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 불가능");

}

System.out.println("==============================================================");

 

// 정상적인 DownCasting

Base base2 = sub; // 부모클래스 타입에 자식클래스 타입을 대입한다. (UpCasting)

// 부모클래스 타입에 자식클래스 타입이 대입된 것( = UpCasting 된 것)을 다시 자식 클래스 타입에 넣어주는 것을 말한다.

Sub sub2 = (Sub) base2; // DownCasting

 

}

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'java&eclipse 코딩 알고리즘 > 20231215' 카테고리의 다른 글

PolymorphismTest2  (0) 2023.12.15
PolymorphismTest  (0) 2023.12.15
CustomerTest  (0) 2023.12.15
VIPCustomer  (0) 2023.12.15
Customer  (0) 2023.12.15