java
2022.09.07 java 다형성
Han_5ung
2022. 9. 10. 19:35
🐧다형성
👉 하나의 객체가 여러 타입을 가질 수 있는 것을 의미
- 상위 클래스 타입의 참조변수로 하위 클래스 타입의 인스턴스를 참조
- 참조변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거다 적어야 함.
- 참조변수가 사용할 수 있는 멤버의 개수는 타입을 따라감
⛄참조변수의 다형성
class Job{...}
class Human{...}
class Programmer extends Job{...}
class Designer extends Job{...}
class Firefighter extends Job{...}
Job job = new Job(); //허용 (타입, 인스턴스 일치)
Job job = new Programmer(); //허용 (타입 인스턴스 불일치)
Designer designer = new Designer(); //허용
Human human = new Job(); //오류
- 타입과 인스턴스가 일치할 경우 참조 가능
- 상위 클래스 타입과 하위 클래스 인스턴스 경우 참조 가능
- 참조변수가 사용할 수 있는 멤버 개수가 실제 인스턴스 멤버 개수보다 적음
- 👉 손실 나는 부분이 없음
- 하위 클래스 타입과 상위 클래스 인스턴스 참조 불가능
- 참조변수가 사용할 수 있는 멤버 개수가 실제 인스턴스 멤버 개수보다 많음
- 👉 실질적으로 사용할 수 있는 개수가 적어 손실나는 데이터가 있음
🐧참조변수의 타입 변환
조건
- 상속 관계에 있는 클래스 사이에만 타입 변환 가능
- 하위 클래스 타입에서 상위 클래스 타입 변환시에는 생략 가능 👉 업캐스팅
- 상위 클래스 타입에서 하위 클래스 타입 변환시에는 반드시 명시 👉 다운캐스팅
⛄업캐스팅
class Job{
void Info(){
System.out.println("Job클래스");
}
}
class Programmer extends Job{
@Override
void Info() {
System.out.println("Programmer 클래스");
}
void Print(){
System.out.println("프로그래머 클래스");
}
}
public class Example {
public static void main(String[] args) {
Programmer pg = new Programmer();
Job job = (Job)pg;
job.Print(); //오류 발생
job.Info();
//Job job = new Job(); 괄호가 생략된 업캐스팅 방식
}
}
//출력값
Programmer 클래스
- 업캐스팅시에 괄호 생략 가능
- 캐스팅을 진행한 후 Job클래스의 멤버만 사용가능 👉 job.print()가 오류나는 이유
- 출력값이 Programmer 클래스인 이유
- 📌 오버라이딩된 함수를 동적 바인딩하여 Job타입에 담겼어도 Programmer 클래스의 Info를 불러옴
⛄다운 캐스팅
public class Example {
public static void main(String[] args) {
Job job = new Programmer(); //생략된 업캐스팅
Programmer pg = (Programmer)job; //다운캐스팅
pg.Print(); //사용가능
}
}
class Job{
void Info(){
System.out.println("Job클래스");
}
}
class Programmer extends Job{
@Override
void Info() {
System.out.println("Programmer 클래스");
}
void Print(){
System.out.println("프로그래머 클래스");
}
}
- 다운캐스팅이 되려면 반드시 업캐스팅이 전제되어야함
- 👉 ex) 업캐스팅이 된 것을 원래대로 되돌림
- Programmer pg = (Programmer)Job; //불가능
- 다운캐스팅시에는 타입을 반드시 명시
🐧instanceof연산자
👉 참조변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있음
public class Example {
public static void main(String[] args) {
Job job = new Job();
System.out.println(job instanceof Object); //true
System.out.println(job instanceof Job); //true
System.out.println(job instanceof Programmer); //false
Job job2 = new Programmer();
System.out.println(job2 instanceof Object); //true
System.out.println(job2 instanceof Job); //true
System.out.println(job2 instanceof Programmer); //true
}
}
class Job{ }
class Programmer extends Job{ }
- 왼쪽에 전달된 참조 변수가 실제 참조하고 있는 인스턴스의 타입이 오른쪽에 전달된 타입이면 true 아니면 false
- 참조변수가 null인 경우 false