카테고리 없음

[Java] 업, 다운 캐스팅이란

alclssha 2022. 10. 24. 01:39

21번째로 포스팅하게 된 내용은 업캐스팅, 다운캐스팅에 대한 내용입니다.

 

[ 캐스팅 ]

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

 

[ 업캐스팅 ]

서브 클래스의 객체가 슈퍼 클래스 타입으로 형변환 되는 것

 

  • 자바에서 서브 클래스는 슈퍼 클래스의 모든 특성을 상속받기 때문에 서브 클래스는 수퍼 클래스로 취급될 수 있음
  • 슈퍼 클래스 레퍼런스 변수가 서브 클래스로 객체화된 인스턴스를 가리킬 수 있게 됨
  • 하위 클래스의 정보를 담을 수 있는 객체에 상위클래스의 자료형을 부여해서, 상위클래스처럼 사용하게 하는 것

 

업캐스팅된 레퍼런스

  • 객체 내에 슈퍼 클래스의 멤버만 접근 가능

 

[ 사용이유 ]

다형성을 이용해서 코드 재사용성을 높이기 위해서

상속을 받은 서브클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리하기 위해서

인스턴스 1개로 잡아서 서브클래스를 담아놓고 관리하기 위해서

슈퍼클래스가 관리 가능

-> 다형성: 메소드를 각각 다른 형태로 사용

-> 슈퍼클래스를 여러 가지 형태로 만들 수 있음

 

 

ex)

class Person{
	String name;
	String id;
	
	public Person(String name){
		this.name = name;
	}
}

class Student extends Person{
	String grade;
	String department;
	
	public Student(String name){
		super(name);
	}
}

public class UpcastingEx {
	public static void main(String[] args) {
		Person p;
		Student s = new Student("이승민");
        // 서브 클래스 객체를 우선 생성하고 생성자에 "이승민"을 넣어서 name의 값을 초기화 시켜줌
        
		p=s; // 업캐스팅
        // 이 경우 객체는 Student형이지만 Person형 참조변수로 가르키므로 Student의 멤버 변수는 참조 할 수 없다 
		
		System.out.println(p.name);  // 오류 없음
        // Person형의 멤버 변수이므로 사용 할 수 있음
		
		p.grade = "A";  // 컴파일 오류
        // grade는 Student형의 멤버이므로 사용이 불가능 하다 (업캐스팅 하였기 때문)
        
		p.department = "com";  // 컴파일 오류
        // department는 Student형의 멤버이므로 사용이 불가능 하다 (업캐스팅 하였기 때문)
        
		}
}

 

 

 

[ 다운캐스팅 ]

자신의 고유한 특성을 잃은 서브클래스의 객체를 다시 복구시켜주는 것을 말함

 

  • 업케스팅 된 것을 다시 원상태로 돌리는 것
  • 업케스팅이 선행 되어야만 다운캐스팅 할 수 있음
  • 명시적으로 타입을 지정해야 함

 

class Person{
	String name;
	String id;
	
	public Person(String name){
		this.name = name;
	}
}

class Student extends Person{
	String grade;
	String department;
	
	public Student(String name){
		super(name);
	}
}

public class UpcastingEx {
	public static void main(String[] args) {
		Person p;
		Student s = new Student("이승민");
        // 서브 클래스 객체를 우선 생성하고 생성자에 "이승민"을 넣어서 name의 값을 초기화 시켜줌
        
		p=s; // 업캐스팅
        // 이 경우 객체는 Student형이지만 Person형 참조변수로 가르키므로 Student의 멤버 변수는 참조 할 수 없다 
		
		System.out.println(p.name);  // 오류 없음
        // Person형의 멤버 변수이므로 사용 할 수 있음
		
        Student s1 = (Student)p; // 다운캐스팅
        // 업캐스팅 된 p를 다운캐스팅으로 객체 p를 Student형 참조변수를 가르키게 함
        
		s1.grade = "A";  // 오류 없음
        // Student형의 멤버 변수이므로 사용 할 수 있음
        
		s1.department = "com";  // 오류 없음
		// Student형의 멤버 변수이므로 사용 할 수 있음        
		}
}