코드스테이츠_국비교육/[Section1]

14_객체지향 프로그래밍 심화(다형성)_22.09.07

생각없이 해도 생각보다 좋다. 2022. 9. 6. 16:06

학습 키워드

  • 다형성
  • 업캐스팅과 다운캐스팅
  • instanceof 연산자


다형성

>의미

: 하나의 객체가 여러 가지 형태를 가질 수 있는 성질

: 한 타입의 참조변수를 통해 여러 타입의 객체를 참조하는 것

: 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조하는 것.

>특징 및 장점

: 역으로는 참조할 수 없다.

: 상위 클래스의 멤버만 사용할 수 있다.

: 형 변환처럼 타입 변환이 가능하다.

//범위가 큰 쪽으로 형변환은 자동으로, 범위가 좁은 쪽으로 형변환은 명시해야 하는 점에서 자료형 변환과 유사하다.

//범위가 어느 방향이 큰 건지 생각할 것.

>참조변수의 타입 변환

: 사용할 수 있는 멤버의 수를 조절하는 것

>참조변수 타입 변환의 조건

1. 상속관계에 있는 클래스에서만 변환 성립

2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환은 형변환 연산자(괄호)를 생략할 수 있다.

3. 상위 클래스 타입에서 하위 클래스 타입으로의 타입 변환은 형변환 연산자(괄호)를 반드시 명시해야 한다.

//다형성이 성립되는 것이 기본 조건

//참조변수의 형변환의 방향은 상속 관계에서 쌍방향. 즉, 상위에서 하위, 혹은 하위에서 상위로 다 가능하다. 어떤 인스턴

스를 참조하느냐가 중요하다.

>타입 변환 코드 예시

public class Main {
    public static void main(String[] args) {
        CheeseCake cheese = new CheeseCake();
        Cake cream = (Cake) cheese; // 가능(업캐스팅), 명시(생략 가능)
//      Cake cream = cheese; // 가능(업캐스팅), 생략
        CheeseCake cheese2 = (CheeseCake) cream; // 가능(다운캐스팅), 생략 불가능
//      MilkCake milk = (MilkCake) cheese; // 불가능, 상속 관계가 아님
    }
}

class Cake { }
class CheeseCake extends Cake { }
class MilkCake extends Cake { }

 

instanceof 연산자

>의미

: 연산자!이다. 변수도 아니고, 메서드도 아님. (희한하네)

: 캐스팅(타입 변환)이 가능한 지 여부를 boolean 타입으로 확인

: 참조 변수가 검사한 타입으로 변환이 가능하다 or 불가능하다.

>사용

: 에러를 줄이는 데 사용할 수 있음.

코드: (참조_변수) instanceof (타입)

public class Main {
    public static void main(String[] args) {
        // 참조형이 Cake인 c1이 Cake 인스턴스 참조
        Cake c1 = new Cake();
        System.out.println(c1 instanceof Object); // true
        System.out.println(c1 instanceof Cake); // true
        System.out.println(c1 instanceof CheeseCake); // false
        System.out.println(c1 instanceof MilkCake); // false
        // 참조형이 CheeseCake인 c2가 CheeseCake 인스턴스 참조
        CheeseCake c2 = new CheeseCake();
        System.out.println(c2 instanceof Object); // true
        System.out.println(c2 instanceof Cake); // true
        System.out.println(c2 instanceof CheeseCake); // true
        System.out.println(c2 instanceof MilkCake); // error;false(참조형과 상속 관계가 아님)
        // 참조형이 Cake인 c3가 CheeseCake 인스턴스 참조
        Cake c3 = new CheeseCake(); //
        System.out.println(c3 instanceof Object); // true
        System.out.println(c3 instanceof Cake); // true
        System.out.println(c3 instanceof CheeseCake); // true
        System.out.println(c3 instanceof MilkCake); // false(참조형과 상속 관계라서 error가 안남)
    }
}

class Cake { }
class CheeseCake extends Cake { }
class MilkCake extends Cake { }

 

 


//다형성이 실제로 많이 쓰일 것 같다.

//되게 중요해 보이는 만큼 어렵다. 연습 많이 할 것.