다형성

김민혁·2022년 1월 20일
0

다형성(Polymorphism)

  • 하나의 객체가 많은 형(타입)을 가질 수 있는 성질
  • 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스할 수 있다.
  • 다형성으로 다른 타입의 데이터를 하나의 배열로 관리할 수 있다.
    • Object는 모든 클래스의 조상이므로 Object의 배열은 어떤 타입의 객체라도 저장할 수있다.
    • 기본형도 Wrapper 클래스에 의해 오토박싱되어 담을 수 있다.
    • 매개변수에도 다형성이 많이 사용된다. ex: println(Object obj)
    • API에서 파라미터로 Object를 받는다는 것은 모든 객체를 처리한다는 말이다.

다형성과 참조형 객체의 형 변환

  • 메모리에 있는 것과 사용할 수 있는 것의 차이
  • 메모리에 있더라도 참조하는 변수의 타입에 따라 접근할 수 있는 내용이 제한됨
  • 참조형 객체의 형 변환
    • 작은 집(child)에서 큰 집(super)으로 -> 묵시적 캐스팅
      • 자손 타입의 객체를 조상 타입으로 참조: 형변환 생략 가능
      • 조상의 모든 내용이 자식에 있기 때문에 가능하다.
    • 큰집(super)에서 작은 집(child)으로 -> 명시적 캐스팅
      • 조상 타입을 자손 타입으로 참조: 형변환 생략 불가
    • 명시적 캐스팅은 개발자를 믿고 프로그램이 바꿔주는것이기 때문에 실제 메모리의 객체를 확인하고 캐스팅해줘야 한다.
      • instanceof 연산자를 통해 확인할 수 있다.
      if(person instanceof SpiderMan){
      	SpiderMan sman = (SpiderMan)person;
      }

참조 변수의 레벨에 따른 객체의 멤버 연결

  • 상속 관계에서 객체의 멤버 변수가 중복될 때
    • 참조 변수의 타입에 따라 연결이 달라짐
  • 상속 관계에서 객체의 메서드가 중복될 때(메서드가 override 되었을 때)
    • 무조건 자식 클래스의 메서드가 호출됨 -> viertual method invocation
    • 최대한 메모리에 생성된 실제 객체에 최적화 된 메서드가 동작한다.(멤버 은폐가 됨)
profile
학생

0개의 댓글