[JAVA] 업캐스팅 & 다운캐스팅
자바수업을 듣는 와중.... 업캐스팅과 다운캐스팅에 대해 이해가 정말정말 안됐었다...😅
그리하여 혼자서 공부하본 결과 깨달은게 엄청 많았기에 이렇게 블로그로 남겨봅니다ㅎㅎ
일단 먼저 업캐스팅/다운캐스팅을 이해하기 전 "캐스팅"이 무엇인지 알아야 이해하기 쉽습니다!
🤷♀️캐스팅이란?
- 좌변에 자료에 맞게 우변의 형을 변환하는 것
이해가 쉽게 예시를 하나 들어볼게요
int a = 3;
double b = 3.14;
b = a // int 타입을 double 타입으로 형변환
이런 식으로 타입이 맞지 않은 두 개의 자료를 가지고, 우변의 타입에 맞게 형변환 해주는 것입니다.
이 형변환도 자동형변환과 강제형변환으로 나누어집니다.
- 자동형변환 : 작은 자료형에서 큰 자료형으로 이동하는 것.
- 강제형변환 : 큰 자료형에서 작은 자료형으로 이동하는 것. 하지만 이때 오류가 발생하기 때문에 오류가 발생하지 않게 강제적으로 형변환을 해주는 것
byte a = 1;
int b = 20;
double c = 3.33
b = a; //자동형변환 (int = byte)
c = (int) b; //강제형변환 (double = int)
이렇게 예시로까지 형변환에 대해 알아봤습니다.
강제형변환때 (int)를 사용해 준것은 오류가 나지 않게 명시적으로 타입변환을 한 것입니다.
그럼 이제 업캐스팅이 무엇인지, 다운캐스팅이 무엇인지에 대해 알아봅시다!
🤷♀️업캐스팅(upcasting)이란?
- 서브 클래스 객체를 슈퍼 클래스 타입으로 변환시키는 것.
class Person{...}
class Student extends Person{...}
Student s = new Student();
person p = s; //업캐스팅, 슈퍼클래스 = 서브클래스
이렇게 s(서브 클래스)를 p(슈퍼 클래스)로 변환시켜준 것입니다.
그럼 업캐스팅은 자동형변환이겠지요??
여기서 질문!!
이렇게 업캐스팅 된 레퍼런스는 서브클래스에 접근이 될까요??
정답은!!
접근이 안됩니다😭😭
업캐스팅을 해도 상위 클래스에는 없고, 하위클래스에만 있는 객체들에게는 접근이 불가능 합니다.
그럼 여기서 의문이 생기실 겁니다. 그냥 p와 s객체를 따로 생성해서 사용하면 되지 왜 굳이 업캐스팅을 할까? 라고요.
수업시간에서도 "메모리 절약을 위해 사용된다."라고만 하셨지 정확한 이유를 말해주지 않았습니다.
하지만 그 이유를 열심히 공부해본 끝에 깨닫게 되었습니다.
이번에도 예시를 드리며 설명해보겠습니다.
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 UpcastringEx {
public static void main (String[] args){
person p;
Struent s = new Student ("영깅이");
p = s; //업캐스팅
System.out.print(p.name); //오류 없음
//p.grade ---> 컴파일 오류 발생
//p.department = "Com"; ---> 컴파일 오류 발생
}
}
이렇게 업캐스팅을 하게 하면, Person에만 있는 객체에 접근하게 된다면 에러가 뜹니다.
한번 이 코드의 메모리 구조를 살펴보겠습니다.
위의 코드는 하나의 인스턴스로 묶어서 관리가 가능합니다.
하지만 업캐스팅을 하지 않고 객체를 따로 생성하게 된다면
이렇게 두개의 인스턴스가 생성되어, 비효율적인 메모리가 생성됩니다.
🤷♀️다운캐스팅(downcasting)이란?
- 슈퍼 클래스 객체를 서브 클래스 타입으로 변환하는 것.
이름과 설명을 보셔도 아시다시피, 다운캐스팅은 업캐스팅의 반대되는 것 입니다.
그럼 당연히 강제형변환이며 명시적 타입 변환을 해야겠죠??
밑은 다운캐스팅의 예제입니다.
class Person {...}
class Student extends Person {...}
Person p = new Student ("영깅이"); //업캐스팅
Student s = (Student) p; //다운캐스팅, 서브클래스 = 슈퍼클래스
이런식으로 명시적 타입변환을 하여 다운캐스팅을 해줍니다.
근데 여기서 주의해야될 점!! 다운캐스팅은 무조건 업캐스팅 한 객체에만 가능합니다.
또 의문이 생기죠? 왜 그럴까라고???
이 의문은 다운캐스팅을 하는 이유를 알게된다면 궁금증이 풀리실 겁니다
다운캐스팅을 하는 이유는 하위클래스의 정보를 담을 수 있는 객체의 상위클래스로 전환 되어 있는 것을 다시 원래 상태대로 되돌리게 위한 것입니다.
즉, 업캐스팅 된 객체를 원상태로 돌리기 위해 사용 됩니다.
그러기에 다운캐스팅은 업캐스팅 한 객체만 가능하다는 것입니다.
public class Downcasting Ex {
public static void main (String[] args){
Person p = new Student ("영깅이"); //업캐스팅
Student s;
s = (Student) p; //다운캐스팅
System.out.println(s.name); //오류 없음
s.grade = "A"; //오류 없음
}
}
이렇게 업캐스팅, 다운캐스팅에 대한 정의가 끝났습니다.
많은 사람들에게 도움이 되셨으면 좋겠네요ㅠㅠ 긴 글 봐주셔서 너무너무 감사합니당😎