코딩이란 무엇일까

[Java/자바]다형성(polymorphism),업캐스팅(Upcasting),다운캐스팅(Downcasting) 본문

Java

[Java/자바]다형성(polymorphism),업캐스팅(Upcasting),다운캐스팅(Downcasting)

둥구는 지굴다 2022. 10. 2. 21:16

다형성이란?

다형성이란 객체지향 프로그래밍에서 꽤나 중요한 부분입니다.

사용 압법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질을 말합니다.

약간의 예를 들자면 자동차가 타이어를 사용하는 방법은 동일하지만 어떤 타이어를 사용하느냐에 따라 주행성능이 달라질 수 있습니다. 

캐스팅(Casting)이란??

캐스팅은 타입의 변환을 말합니다.

자바에서는 상속관계에 있는 클래스를 형 변환할 수 있습니다.

따라서 자식 클래스가 부모 클래스 타입으로 형 변환하는 것을 업 캐스팅이라하고

이 업 캐스팅된 클래스를 다시 형 변환하는 것을 다운 캐스팅이라고 합니다.

업 캐스팅(Upcasting)이란??

자식 클래스의 객체가 부모 클래스의 참조 변수로 형 변환되는 것을 말합니다.

쉽게 말해서 자식 클래스를 부모 클래스 타입으로 형 변환하는 것입니다.

업 캐스팅의 구조

부모 클래스 변수=자식 객체 값;

 

업 캐스팅 예시 코드

Human(부모) 클래스

class Human{
	String name;
	int age;
	String hobby;
	Human(){};
	//매개변수를 사용한 생성자.
	public Human(String name, int age, String hobby) { 
		this.name = name;
		this.age = age;
		this.hobby = hobby;
	}	
    void info() {
		System.out.println("name:"+name);
		System.out.println("age"+age);
		System.out.println("hobby"+hobby);
	}
}

Student1(자식) 클래스

class Student1 extends Human{
	int grade;
	public Student1(String name,int age, String hobby,int grade) {
		super(name,age,hobby); //Human의 매개변수 생성자를 불러옴
		this.grade=grade;
	}
	//오버라이딩 재정의
	@Override
	void info() {
		super.info();
		System.out.println("grade:"+grade);
	}
	
	void study() {
		System.out.println("공부하기");
	}
}

부모 클래스의 메서드인 void info( )를 재정의 해주었습니다.

이 재정의 한 부분이 매우 중요합니다.

부모의 void info()에 grade를 추가로 출력하게 오버 라이딩해주었습니다.

그리고 부모 클래스에는 없는 study( ) 메서드도 하나 만들어 주었습니다.

메인

public class Upcasting {

	public static void main(String[] args) {
			Student1 st1=new Student1("홍길동",20,"게임하기",3);
			Human h1=new Student1("이순신",13,"롤하기",3);
			h1.info(); //부모에없는 grade가 출력되는 걸로보아 자식클래스의 info가 출력된다.
            			//h1.study(); 오류가 납니다.
	}

}

Student1 st1=new Student1("홍길동",20, "게임하기",3); => 여기까지는 평범하게 객체를 만들어 값을 초기화해 주었습니다.

Human h1=new Student1("이순신",13, "롤 하기",3); => 여기서 upcasting을 해주었습니다. 자식 클래스인 Student가 부모 클래스 즉, Human클래스의 참조 변수로 형 변환을 해주었습니다.

추가적으로 h1.study는 Student클래스에 있기 때문에 오류가 발생합니다.

출력 결과

결과 값에 grade:3이 있습니다. 이렇게 부모 클래스에 없는 필드인 grade:3이 출력되었습니다.

어떻게 이게 가능한 걸까요? 그 이유는 바로 동적 바인딩 때문입니다.

동적 바인딩

동적 바인딩은 컴파일 시점에선 부모 클래스의 필드로 인지합니다. 위를 기준으로 보면 info( ) 메서드가 Human클래스의 것으로 호출되고 있습니다. 하지만 런타임 시점에선 자식 클래스의 필드로 호출할 메서드를 묶기 때문에

Student클래스의 info() 메서드가 호출되는 것입니다.

다운 캐스팅이란?

다운 캐스팅이란 간단합니다. 업 캐스팅으로 형 변환이 이루어진 부모 클래스의 객체가 자식 클래스의 참조 변수로 다시 바꾸어주는 것을 말합니다.

다운 캐스팅의 구조

자식 클래스 변수(자식 클래스) 업 캐스팅된 부모 참조 변수;

다운 캐스팅 시 주의할 점

1. 업 캐스팅된 변수만 가능합니다.

당연하게도 다운 캐스팅은 업 캐스팅이 된 변수를 다시 돌려놓는 것이기 때문에 업캐스팅이 된 변수만 가능합니다.

2. 명시적 형 변환을 해주어야 합니다.

업 캐스팅을 사용할 때는부모 클래스 변수=자식 객체 값; 과 같이 명시적 형 변환을 해주지 않았지만

다운 캐스팅은 (자식 클래스)를 넣어 명시를 해주어야 다운 캐스팅이 가능합니다.

 

다운 캐스팅 예시 코드

public class DownCasting1 {

	public static void main(String[] args) {
		//업 캐스팅
		Human h1=new Student1("가길동",20,"게임하기",3);
		//h1.study(); 다운캐스팅 전 오류
		//다운 캐스팅
		Student1 s1=(Student1)h1;
		s1.study();
	
		
	}

}

업 캐스팅을 사용할 때와 동일한 클래스를 사용했습니다.

따라서 위에 업 캐스팅된 부모 클래스 변수 즉 h1을 다운 캐스팅해주었습니다.

따라서 위에서는 s1.study( )가 오류가 났지만

다시 다운 캐스팅을 함으로써 Student에 있는 메서드인 study() 메서드에 접근할 수 있게 되었습니다.

'Java' 카테고리의 다른 글

[자바/Java]인터페이스(interface)  (1) 2022.10.05
[Java/자바]추상 메서드와 추상 클래스  (0) 2022.10.05
[Java/자바] 상속과 다형성  (1) 2022.09.30
[Java/자바]클래스-생성자  (1) 2022.09.30
[Java/자바]객체타입 배열  (1) 2022.09.30
Comments