[CS-JAVA] Casting(캐스팅)

지영·2023년 8월 4일
0

CS

목록 보기
54/77
post-custom-banner

📍 시작하기 전에 알면 좋은 지식

  • 수퍼 클래스
    • 부모클래스인 상속 관계의 상위 클래스
  • 서브 클래스 : 자식 클래스인 하우 클래스

캐스팅이란,

  • 타입을 변환하는 것을 말하며 형변환이라고도 한다. 자바의 상속 관계에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능함.

캐스팅의 필요성

  • 다형성 : 오버라이딩된 함수를 분리해서 활용이 가능하다.
class 해장국{
   public void 간맞추기(){
   // 뭐든 Ok
   }	
}

class 뼈해장국 extends 해장국{
   @Override
   public void 간맞추기(){
   // 뼈해장국에는 들깨가루 ~!
   }
}

class 콩나물해장국 extends 해장국{
   @Override
   public void 간맞추기(){
   // 콩나물해장국에는 고춧가루 ~!
   }
}

class 취객 {
   public void 해장국먹기(해장국 어떤해장국){
   어떤해장국.간맞추기();
   }
}

public class CastingTest{
   public static void main(String[] args){
      취객 취객1 = new 취객();
      해장국 해장국한그릇 = new 뼈해장국(); 
      // 해장국(상위 클래스) 타입에 뼈해장국(하위 클래스)를 담음. 업캐스팅 !
      취객1.해장국먹기(해장국한그릇);
   }
}
  • 상속 : 캐스팅을 통해 범용적인 프로그래밍이 가능하다.

    🗯 다형성과 상속?
    다형성 : 객체가 여러 형태를 가질 수 있음을 의미한다. 따라서 기반 클래스에 있는 메소드를 파생 클래스에서 사용할 때 오버라이딩을 할 수 있다.
    상속 : 기반클래스로부터 필드, 메소드 등을 그대로물려 받아 새로운 파생 클래스를 만드는 것이다.

캐스팅 종류

1. 업 캐스팅(묵시적 형변환)

✔ 자식 클래스가 부모 클래스 타입으로 캐스팅되는 것

class Human{
// 생략
}

class Student extends Human{
// 생략
}
public class CastingTest {
	public static void main(String[] args) {
    
    	Student student = new Student();
        Human human = student; 
        // 자식 클래스(Student)가 부모 클래스(Human)타입으로 캐스팅
  	}
}

2. 다운 캐스팅(명시적 형변환)

✔ 부모 클래스가 자식 클래스 타입으로 캐스팅되는 것

class Human{
// 생략
}

class Student extends Human{
// 생략
}
public class CastingTest {
	public static void main(String[] args) {
    
    	Human human = new Human();
        Student student = (Student) human;
        // 부모 클래스(Human)이 자식 클래스(Student)타입으로 캐스팅
        // 실제로 다운캐스팅은 업 캐스팅이 선행된 후 되어야 한다.
  	}
}

📢 주의!

: 다운캐스팅은 컴파일 에러는 일어나지 않지만, 런타임 에러는 일어남!(Student클래스가 Human클래스보다 구성이 작기 때문) 런타임 에러를 잡기 위해서는 업 캐스팅을 먼저 적용하고 다운 캐스팅을 해주어야 함. -> 업캐스팅된 참조 변수를 이용해서 다운캐스팅 하기

//런타임 에러 발생(ClassCastException)
Child child = (Child)new Parent();
//업캐스팅
Parent parent = new Child();
//업캐스팅된 참조변수를 이용해서 다운캐스팅하기
Child child = (Child)parent;

profile
꾸준함의 힘을 아는 개발자📍
post-custom-banner

0개의 댓글