[사용자 정의 데이터 타입]
C언어) 구조체
객체 지향) 클래스
형변환을 할 수 있는 캐스트 연산자
마찬가지로, 상속 관계에 있는 부모 클래스로 타입 변경 가능
상속 관계에서만 가능_업캐스팅, 다운캐스팅, 오버라이딩
업캐스팅
: 서브 클래스의 레퍼런스를 슈퍼 클래스의 레퍼런스에 대입
(서브 클래스의 객체는 이미 슈퍼 클래스의 멤버를 모두 가짐)
→ 서브 클래스의 멤버를 가지고 있으나 서브 클래스의 멤버 접근 불가능
→ 서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환
Person p = new Student("이재문");
[업캐스팅]
업캐스팅 된 서브 클래스의 객체
업캐스팅된 레퍼런스
객체 내에 슈퍼 클래스의 멤버만 접근 가능
→ 서브 클래스의 멤버 접근 불가능
주소 값만을 가지고 있어 가능
(엄격한 타입 체크를 가지고 있으면 데이터 타입이 달라 업캐스팅 오류 발생)
→ 객체의 실제 타입 구분하기 어려움 why? 여러 서브 클래스에서 업캐스팅
Sol) 객체 레퍼런스 instance of 클래스 타입
다운캐스팅
: 슈퍼 클래스의 레퍼런스를 서브 클래스의 레퍼런스에 대입
→ 업캐스팅 된 것을 다시 원래대로 되돌리는 것
→ 슈퍼 클래스 객체를 서브 클래스 타입으로 변환
(슈퍼 클래스의 서브 클래스는 다양하기에 명시적 타입 변환 지정)
Person p = new Student("이재문"); //업캐스팅
Student s = (Student) p; //다운캐스팅, 명시적 타입 변환 필요
오버라이딩
: 슈퍼 클래스의 메소드를 서브 클래스에서 재정의
→ 슈퍼 클래스의 메소드 무시 “동적 바인딩 발생”
** 오버로딩과 오버라이딩은 객체 지향에서 다형성을 제공한다.*
조건) 메소드의 원형(이름, 인자 타입 및 개수, 리턴 타입) 동일
“슈퍼와 서브는 100퍼 동일한 프로토 타입을 갖는다”
: 서브 클래스의 오버라이딩된 메소드가 무조건 실행
→ 이름이 같아 어느 함수를 호출할지 몰라 발생하는 오류를 예방
업캐스팅(서브 클래스의 객체를 수퍼 클래스의 객체로) → 오버라이딩된 메소드 호출
⇒ 서브 클래스의 메소드 (수퍼 클래스의 메소드 무력화)
Shape shape = new Line();
shape.draw(); //Line 출력 (shape의 draw() X)