본문 바로가기
공부/Java

[JAVA] 상속 - 다형성, 캐스팅, instanceof

by 아찌방 2025. 5. 23.

상속 클래스 변수의 할당

 

  • 상위 클래스 변수에 하위 클래스 객체 할당 가능
    • Student / Professor는 Person 중 하나이므로 Person 변수에 할당 가능

예시

Person p;

p = new Person(); // 가능
p = new Professor(); // 가능
p = new PartTimeProfessor(); // 가능

 

Person[] per = new Person[3];
Professor prof = new Professor();
Student stud = new Student();

per[0] = prof; // 가능
per[1] = stud; // 가능
per[2] = new PartTimeProfessor(); // 가능

 

  • 상위 클래스 변수에 할당된 객체는 상위 클래스의 객체로 간주
per[0] = prof;

per[0].getName(); // 가능 : per[0]는 Person 객체로 간주되므로 이 호출은 성립함.
per[0].getEmployeeNumber(); // 불가능 : per[0]는 Professor 객체로 간주되므로 이 호출은 에러가 남.

 

  • 하위 클래스 변수에 상위 클래스 객체를 지정 할 수 없음.
    • 모든 파트 타임 교수는 교수이지만, 교수가 파트 타임 교수는 아님
Professor prof;

prof = new Person(); // 불가능
prof = per[0]; // 불가능
prof = new PartTimeProfessor(); // 가능

 

 

캐스팅

캐스팅이란?

하나의 타입을 다른 타입으로 강제로 변화하는 과정임.

double x = 3.405;
ubt nx = (int)x;

 

  • 클래스간 캐스팅
    • 하나의 클래스 객체를 다른 클래스로 강제로 변환
      • 하위 클래스 객체를 상위 클래스로 캐스팅은 허용
      • But, 상위 클래스 객체를 하위 클래스로 캐스팅은 허용되지 않음.
Person[] per = new Person[3];

per[0] = new Professor();
per[1] = new Student();
per[2] = new PartTimeProfessor()

Professor prof1 = (Professor)per[0]; // 가능
Professor prof2 = (Professor)per[1]; // 불가능
Professor prof3 = (Professor)per[2]; // 가능
Professor prof3 = (Professor)(new Person()); // 불가능

 

 

instanceof

instanceof 연산자란?

어떤 클래스의 인스턴스인지 판단하기 위한 연산자임

true 또는 false 값을 반환

 

예시

Person per = new Professor();

if(per instanceof Person) {
	System.out.println(per.getName()); // true
}

if(per instanceof Student) {
	System.out.println(((Strudent)per).getStudentNumber()); // false
}

if(per instanceof Professor) {
	System.out.println(((Professor)per).getEmployeeNumber()); // true
}

 

코드 결과
per instanceof Person true
prof instanceof Person true
per instanceof Professor false
! (prof instanceof Person) false
! prof instanceof Person syntax error
dalmation instanceof "Dog" syntax error
null instanceof String false

 

예제

Person[] per = new Person[3];
per[0] = new Professor();
per[1] = new Student();
per[2] = new PartimeProfessor();

for ( int i=0; i < per.length; i++ ) {
	if ( per[i] instanceof Person ) {
		System.out.println( “per[“+i + “]는 Person 클래스의 객체입니다”);
	}
	if ( per[i] instanceof Student ) {
		System.out.println( “per[“+i + “]는 Student 클래스의 객체입니다”);
	}
	if ( per[i] instanceof Professor ) {
		System.out.println( “per[“+i + “]는 Professor 클래스의 객체입니다”);
	}
	if ( per[i] instanceof PartimeProfessor ) {
		System.out.println( “per[“+i + “]는 PartimeProfessor 클래스의 객체입니다”);
	}
}

 

결과

더보기

per[0]는 Person 클래스의 객체입니다
per[0]는 Professor 클래스의 객체입니다
per[1]는 Person 클래스의 객체입니다
per[1]는 Student 클래스의 객체입니다
per[2]는 Person 클래스의 객체입니다
per[2]는 Professor 클래스의 객체입니다
per[2]는 PartimeProfessor 클래스의 객체입니다

 

 

 

 

 

 

 

728x90