[JAVA] 다형성 / 참조변수의 형변환 / instanceof 연산자

윤수인·2023년 11월 29일
1

🗂️ 오류 / 정리

목록 보기
7/19
post-thumbnail
  • 다형성 & 참조변수의 형변환은 다른 개념이지만, 연관있음
  • (참조변수)p+"문자열" = (참조변수)p.toString + "문자열"

다형성

  • 여러 상황에서 코드를 더 유연하게 만들고 관리하기 위해서
  • 타입불일치 (참조변수타입 = 인스턴스 타입과 일치하는 것이 보통이나[TV t = new TV( );], 불일치(다형성)도 가능)
    ex) TV t = new SmartTV( ); ← 불일치
  • 한개의 부모타입 참조 변수로 여러개의 자식타입 객체를 다루는 것
    부모 → 자식 (Upcasting 가능) / 자식 → 부모 (불가능)
    ② 있는 기능 5개 < 7개 (안쓰는건 가능) - 장점이 되기도 함 / 7개 > 5개 (없는걸 호출하면 에러남)
  • 여러가지 형태를 가질 수 있는 것
  • 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐
  • 메서드 오버라이딩(Method Overriding)과 함께 다형성 사용
    오버라이딩 ? 부모의 메서드를 자식메서드에서 같은 이름의 메서드로 [메서드이름(매개변수)]을 쓰되, 내용이 마음에 안들어서 내용을 재정의 하는 것.
    ex) myAnimal.makeSound()를 호출하면 실제로는 Dog 클래스에서 오버라이딩한 makeSound() 메서드가 호출됩니다.


📌 Note Code


  • 일일이 다 class로 특정 행동을 쓰지 않고도, 교통수단이라는 공통적인 대표 interface를 만들고, 그 아래 다형성을 사용해서 추가로 코드 확장 및 수정할 때 기존 코드를 변경하지 않고 적용 가능 ex) 카페 - 음료 종류 / 동물 - 종류 / 교통수단 - 종류


    💻 입력 (예시)

interface 이동할_수_있는 {
    void 이동();
}

class 자전거 implements 이동할_수_있는 {
    void 이동() {
        System.out.println("페달을 밟고 이동합니다.");
    }
}

class 자동차 implements 이동할_수_있는 {
    void 이동() {
        System.out.println("엔진을 가동하고 이동합니다.");
    }
}

class 비행기 implements 이동할_수_있는 {
    void 이동() {
        System.out.println("비행기 엔진을 가동하고 이동합니다.");
    }
}

void 교통수단_사용(이동할_수_있는 교통수단) {
    교통수단.이동();
}

// 다양한 교통수단 사용
이동할_수_있는 내자전거 = new 자전거();
이동할_수_있는 내자동차 = new 자동차();
이동할_수_있는 내비행기 = new 비행기();

교통수단_사용(내자전거);
교통수단_사용(내자동차);
교통수단_사용(내비행기);

> 다형성 장점

다형성 장점

① 다형적 매개변수
: (부모타입객체)하나의 메서드로 여러개를 간단히 처리가능

💻 입력 (예시)

class 부모

class 자식1
class 자식2
class 자식3

void live(행위) 메서드 (자식 변수)

House h = new House();
부모 b = new 자식1();//다형성
부모 b = new 자식2();

h.live(자식1);
h.live(자식2);

하나의 배열여러 종류 객체를 배열하는 것 (원래 : 같은 타입만 저장가능)

💻 입력 (예시)

Product p[ ] = new Product[3];
p[0] = new Tv( );
p[1] = new Computer( );
p[2] = new Audio( );

> 형변환

형변환 : 데이터 타입의 변환

  • 기본형 : 기본 데이터끼리 형변환
  • 참조형 : 상속관계에 있는 클래스들끼리 형변환

참조변수의 형변환 (상속관계에 있는 클래스끼리)

  • 기본형의 형변환 ex) 3.6 ----int로 형변환----> 3
  • 사용할 수 있는 멤버의 개수 조절 ex) 자바의정석 리모콘 생각 4->5->4 왔다갔다 개수조절할 수 있음
  • 객체 타입간의 관계 조절
  • 부모 <-> 자식 간에 가능 (단, 형제일땐 불가능)
    ① 형변환 연산자 사용해야 함
    ② 자식 → 부모 : Upcasting
    ③ 부모 → 자식 : Downcasting

instanceof 연산자

① 반드시! 참조변수 형변환(부모 <-> 자식) 가능여부에 대한 확인 → 가능 : [true] 반환 / 값: null : [false] 반환
② 형변환 진행

💻 입력 (예시)


FireEngine f = new FireEngine( );

//(부모 <-> 자식) 형변환 서로 가능
System.out.println(fe instaceof Object); //true 
System.out.println(fe instaceof Car); //true
System.out.println(fe instaceof FireEngine); //true

//( )타입으로 변환
Object obj = (Object)fe;
Car c = (Car)fe; 

💻 입력

FireEngine f = new FireEngine( );

Car c = (Car)f; // Car = 부모 , f = 자식 (형변환 가능) , (생략가능)
FireEngine f2 = (FireEngine)c; //  f = 자식, c = 부모 (형변환 가능) , (생략불가)
Ambulance a = (Ambulance)f; // 자식간엔 불가능

profile
어제보다 조금 더 성장하기!

0개의 댓글