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();	//오류
  • 타입과 인스턴스가 일치할 경우 참조 가능
  • 상위 클래스 타입과 하위 클래스 인스턴스 경우 참조 가능
    • 참조변수가 사용할 수 있는 멤버 개수가 실제 인스턴스 멤버 개수보다 적음
    • 👉  손실 나는 부분이 없음
  • 하위 클래스 타입과 상위 클래스 인스턴스 참조 불가능
    • 참조변수가 사용할 수 있는 멤버 개수가 실제 인스턴스 멤버 개수보다 많음
    • 👉  실질적으로 사용할 수 있는 개수가 적어 손실나는 데이터가 있음

🐧참조변수의 타입 변환

조건

  1. 상속 관계에 있는 클래스 사이에만 타입 변환 가능
  2. 하위 클래스 타입에서 상위 클래스 타입 변환시에는 생략 가능 👉 업캐스팅
  3. 상위 클래스 타입에서 하위 클래스 타입 변환시에는 반드시 명시 👉 다운캐스팅

⛄업캐스팅

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