Java : 다형성, instanceof

커비·2024년 11월 15일
0

Java

목록 보기
47/55

📌 참조 변수의 타입변환

📍 자동 타입 변환

부모타입 변수 = 자식타입객체; 는 자동으로 부모타입으로 변환이 일어난다.

  • 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급될 수 있다.
    : 예를 들어 포유류 클래스를 상속받은 고래 클래스가 있다면 포유류 고래 = 고래객체; 가 성립될 수 있음
    : 고래 객체는 포유류의 특징인 모유수유 행위를 가지고 있기 때문
    : 다만 주의할 점은 부모타입 변수로 자식객체의 멤버에 접근할 때는 부모 클래스에 선언된(상속받은) 멤버만 접근할 수 있음

  • Mammal : 부모 클래스

class Mammal {
	// 포유류는 새끼를 낳고 모유수유를 한다.
    public void feeding(){
    	System.outprintln("모유수유를 합니다.");
    }
}
  • Whale : 자식 클래스
class Whale extends Mammal {
	// 고래는 포유류 이면서 바다에 살며 수영이 가능하다
    public void swimming(){
    	System.out.println("수영하다.");
    }
    @Override
    public void feeding() {
    	System.out.println("고래는 모유수유를 합니다.");
    }
}
  • main 메서드를 사용한 테스트 / main 클래스
public class Main {
	public static void main(String[] args) {
    	// 고래는 포유류이기 때문에 포유류 타입으로 반환될 수 있습니다.
        Mammal mammal = new Whale();
        
        // 하지만 포유류 전부가 바다에 살고 수영을 할 수 있는 것은 아니기 때문에
        // 수영하다 메서드는 실행 불가
        // 즉 부모 클래스에 swimming이 선언되어있지 않아서 사용 불가능 합니다.
        // mammalia.swimming(); // 오류발생
        
        // 반대로 모든 포유류가 전부 고래처럼 수영이 가능한 것이 아니기 때문에 타입 변환이 불가능함
        // 즉 부모 타입의 객체는 자식타입의 변수로 변환될 수 없다
        // Whale = whale = new Mammal(); // 오류 발생
        
        mammal.feeding();
    }
}

강제 타입 변환

자식타입 변수 = (자식타입) 부모타입객체;

  • 부모타입객체는 자식타입 변수로 자동 타입변환되지 않음
// 자식타입 객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();

// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면 된다
Whale whale = (whale) mammal;
whale.swimming();
  • 자동 형 변환이 완료된 것들만 돌아갈 수 있는 것 : 기능이 제한적임

다형성

여러 가지 형태를 가질 수 있는 능력을 의미함

  • 예를 들어 자동차의 핸들을 교체하면 핸들링이 부드러워지고 바퀴를 교체하면 승차감이 좋아짐
  • 소프트웨어 또한 구성하고 있는 객체를 바꿨을 때 소프트웨어의 실행 성능 및 결과물이 다르게 나올 수 있음
  • 일전에 배운 참조변수 타입변환을 활용해 다형성을 구현할 수 있음
Tire tire = new JankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
  • 부모타이어 변수 = 자식타이어객체; 를 선언하여 자동 타입변환된 변수를 사용하여 자식타이어 객체에 재정의

instanceof

다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이 때 사용할 수 있는 명령어가 intance of 이다.

  • 이 명령어를 통해 해당 객체가 내가 의도하는 클래스의 객체인지 확인할 수 있음
  • (대상객체) instance of {클래스 이름} 과 같은 형태로 사용하면 응답값은 boolean이다.
profile
전공은 컴퓨터공학, 복수전공은 해킹보안학, 직장은 방학(파워 구직중)

0개의 댓글