[Java] 참조형 형변환(Casting)

수경·2023년 8월 10일
0
post-thumbnail

형변환, Type Casting

  1. 값형 형변환
  • 값형끼리 형변환(boolean 제외)
  • 숫자형끼리 형변환
  1. 참조형 형변환
  • 참조형끼리 형변환
  • 클래스끼리 형변환

참조형 형변환

  • 상속 관계의 클래스간 형변환만 지원한다.
  • 직계(직선관계)끼리만 가능하다.
  • 방계(형제)는 불가능하다.
  • A클래스 > B클래스 변환

1. 업캐스팅, Up Casting

  • 암시적 형변환
  • 100% 안전하다.
  • 자식 클래스 타입을 부모 클래스 타입으로 변환(밑에서 위로 캐스팅)

2. 다운캐스팅, Down Casting

  • 명시적 형변환
  • 불안정하다. > 원래는 100% 불가능하다.
  • 부모 클래스 타입을 자식 클래스 타입으로 변환

예제 코드

public class Ex55_Casting {
	public static void main(String[] args) {
    	
        //업캐스팅(***)
        //암시적 형변환
        Parent p1;
		Child c1;
		
		c1 = new Child();

        //Parent = Child
		p1 = c1;
		p1 = (Parent)c1;
        
        //복사 후 검증 방법 
		//- 복사된 참조변수의 모든 멤버에 접근 가능한지 테스트 해본다.
		p1.a = 10;
		System.out.println(p1.a);
        

		//다운캐스팅
		//업 캐스팅 후 다운 캐스팅한다.
		Parent p3;
		Child c3;
		
		c3 = new Child();
		
		//업캐스팅
		p3 = c3;
		
		Child c4;
        
		c4 = (Child)p3;	//원래 p3는 자식클래스이였으므로 자식클래스로 다운캐스팅이 가능하다.
		
		c4.a = 10;
		c4.c = 30;
		
		System.out.println(c4.a);
		System.out.println(c4.c);
	}
}

//부모 클래스
class Parent {
	public int a;
	public int b;
}

//자식 클래스
class Child extends Parent{
	public int c;
	public int d;
}
    

심화버전 코드(인터페이스와 업캐스팅)

instanceof 사용
요구사항) 프린터 LG500, HP600의 기능을 같이 수행하시오.

public class Ex56_Casting {
	public static void main(String[] args) {
		
		//하나의 배열로 여러가지 인터페이스를 통합할 수 있다.
		Printer[] ps = new Printer[8];
		
		//*** 서로 다른 클래스의 객체를 하나의 배열에 넣는다.
		//업캐스팅
		ps[0] = new LG500();
		ps[1] = new HP600();
		
		for (int i=0; i<ps.length; i++) {
			if(i<5) {
				ps[i] = new LG500();
			} else {
				ps[i] = new HP600();
			}
		}
		
		//데일리업무
		for (int i=0; i<ps.length; i++) {
			ps[i].print();
			
			//추가업무
			//- LG500 > selfTest()
			//- HP600 > clean()
			
			//a객체 instanceof b클래스 >(이항연산자) a객체가 b클래스 이냐
			
			if (ps[i] instanceof LG500) {
				((LG500)ps[i]).selfTest();	//캐스팅과 . 이 같이 있으면 .를 먼저 수행하기에 캐스팅 부분에 ()를 씌어준다.
				
			} else if (ps[i] instanceof HP600) {
				((HP600)ps[i]).clean();
			}
		}
	}
}

interface Printer {
	void print();
	void powerOn();
	void powerOff();
}

class LG500 implements Printer {

	public void print() {
		System.out.println("LG500 출력합니다.");
	}
	
	public void selfTest() {
		System.out.println("자가 점검을 합니다.");
	}

	@Override
	public void powerOn() {
		System.out.println("전원을 켭니다.");
	}

	@Override
	public void powerOff() {
		System.out.println("전원을 끕니다.");
	}
}


class HP600 implements Printer {
	
	public void powerOn() {
		System.out.println("전원 켜짐");
	}
	
	public void powerOff() {
		System.out.println("전원 꺼짐");
	}
	
	public void clean() {
		System.out.println("헤더를 청소합니다.");
	}

	@Override
	public void print() {
		System.out.println("HP600 출력합니다.");
	}
}
    
    

LG500 출력합니다.
자가 점검을 합니다.
LG500 출력합니다.
자가 점검을 합니다.
LG500 출력합니다.
자가 점검을 합니다.
LG500 출력합니다.
자가 점검을 합니다.
LG500 출력합니다.
자가 점검을 합니다.
HP600 출력합니다.
헤더를 청소합니다.
HP600 출력합니다.
헤더를 청소합니다.
HP600 출력합니다.
헤더를 청소합니다.

profile
웹백엔드개발자를 꿈꾸는

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

큰 도움이 되었습니다, 감사합니다.

답글 달기