7.클래스 - (5) 타입변환(Casting)

한승록·2023년 4월 27일
0

자바 기초

목록 보기
15/21
'타입변환(Casting)'은 상속개념을 바탕으로 하여 해당 계층의 클래스를 다른 계층의 클래스로 전환하기 위한 작업을 의미합니다.
현 단계까지 학습하신 분들은 어디선가 익숙한 내용이실 겁니다. 저는 강제 형변환이 생각나는데 여러분은 어떠실지 잘 모르겠습니다.(●'◡'●)
여담은 이정도로 하고 그렇다면 캐스팅이 어느 상황에서 사용되는 한번 확인해보실까요?




'캐스팅'은 위에서 언급한 일반적인 강제 형변환과는 조금 차이를 보입니다. 바로 '객체'의 타입변환을 수행하는 작업이기 때문입니다.
	class Human {}
    
    class Doctor extends Human{}
    class Student extends Human{}
이와 같은 상속이 발생했을 경우 먼저 클래스 간의 관계에 대해 먼저 파악하셔야됩니다.
가장 상위 클래스인 Human클래스에서 Doctor클래스와 Student클래스에 상속이 들어갑니다.

사람의사 가 될 수 있습니다.
학생은 어떤가요? 사람학생 이 될 수 있습니다.
그러나 학생이 의사대신 치료할 수 있을까요?
의사는 학생이라고 할 수 있을까요?
(물론 현실에서는 가능할 수 있지만 이 부분은 조금 양해 부탁드립니다(❁´◡`❁))

이것이 일반적인 상속관계입니다. 그런데 여기서 이러한 생각이 들 수 있습니다.
학생과 의사 모두 사람이죠. 그렇다면 각각의 객체가 생성되었을때 최상위 클래스의 객체와 상속받은 객체간의 상호작용이 불가능 할까요?



해당 의문점에 답을 줄 수 있는것이 바로 캐스팅입니다.
먼저 항상 이루어질 수 있는 '업캐스팅'에 대해 설명드리겠습니다.
위에서 언급드린것 처럼 학생과 의사는 모두 사람입니다. 이것이 업캐스팅이라고 할 수 있습니다.
반면에 '다운캐스팅'은 모든사람이 의사이거나 학생이어야 합니다.
하지만 누군가는 학생일 수 있지만 누군가는 아닐 수도 있고 누군가는 의사이지만 누군가는 아닐 수도 있기 때문에 다운캐스팅은 항상 가능하지 않은 것이죠.
정확히 말씀드리자면 의사 클래스만이 가지고 있는 치료라는 고유의 메서드가 존재한다면 모든 사람 클래스의 객체가 이에 해당할 수 없는 것입니다.
public class Human {
	private String name;	
	private int age;
	
	
	// 상속을 위한 생성자 작성
	Human(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// 상속을 확인하기 위한 메서드 작성
	public void introduce() {
		System.out.printf("%s의 나이는 %d세입니다.\n", name, age);
	}
}
    
    
public class Doctor extends Human {

	// 객체 생성을 위해서는 부모 클래스(Human)의 생성자필요
	Doctor(String name, int age) {
		super(name, age);
	}
	
	
	@Override	// 어노테이션을 통해 오버라이딩 되었음을 주석으로 확인 및 문법 검사 진행
	public void introduce() {
		// Doctor 클래스 만의 내용을 가지고 있는 출력문 작성
		System.out.printf("%s의 나이는 %d세이며 직업은 의사입니다.\n", getName(), getAge());
	}
	
	// 의사 클래스에서만 사용가능한 heal메서드 작성
	public void heal() {
		System.out.printf("%s가 환자를 치료합니다.\n", getName());
	}

}

public class Student extends Human {

	// 객체 생성을 위해서는 부모 클래스(Human)의 생성자필요
	Student(String name, int age) {
		super(name, age);
	}

	
	@Override	// 어노테이션을 통해 오버라이딩 되었음을 주석으로 확인 및 문법 검사 진행
	public void introduce() {
		// Student 클래스에서만 출력가능한 문구 작성
		System.out.printf("%s의 나이는 %d세이며 직업은 학생입니다.\n", getName(), getAge());
	}
}

public class Velog {
	public static void main(String[] args) {
	
	Scanner sc = new Scanner(System.in);
	
	String doc;		// 의사의 이름을 입력받을 doc 변수 선언
	int d_age;		// 의사의 나이 입력받을 변수 d_age 선언
	
	String stu;		// 치료 가능여부 비교를 위한 학생의 이름을 입력받을 stu 변수 선언
	int s_age;		// 학생의 나이 입력	s_age 선언
	
	
	System.out.print("의사 이름 입력 : ");
	doc = sc.nextLine();
	System.out.print("의사의 나이 입력 : ");
	d_age = Integer.parseInt(sc.nextLine());
	
    
    
    
	System.out.print("학생 이름 입력 : ");
	stu = sc.nextLine();
	System.out.print("학생의 나이 입력 : ");
	s_age = Integer.parseInt(sc.nextLine());
			
            
    
	Human doctor = new Doctor(doc, d_age);		// 상속해준 의사 클래스를 객체로 선언
	Human student = new Student(stu, s_age);	// 상속해준 학생 클래스를 객체로 선언
	doctor.introduce();
	student.introduce();


	
	// 다운 캐스팅 작동여부를 확인
	doctor.heal();
	
	sc.close();
	}
}

<※ 결과는 다음과 같습니다.>

profile
개발 학습

0개의 댓글