다형성(Polymorphism) - 정의

  • 객체지향개념에서의 다형성

    • 여러가지 형태를 가질 수 있는 능력
  • 자바에서의 다형성

    • 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있음

    • 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있음



다형성 - 특징

  • 부모클래스 타입의 참조변수에서 자식클래스의 인스턴스를 참조할 수 있음

    • 부모클래스명 참조변수 = new 자식클래스(매개변수);
  • 단, 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐

    • 자식클래스 타입의 참조변수 = 전체 접근

    • 부모클래스 타입의 참조변수 = 부모클래스에 정의된 멤버만 접근

  • 반대로는 불가능함

    • 컴파일 에러

    • 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야함
      자식클래스가 부모클래스의 사용가능한 멤버 개수가 더 많기 때문에



참조변수의 형변환

  • 기본형 변수처럼 참조형 변수도 형변환이 가능함

    • 단, 서로 상속관계에 있는 클래스 사이에서만 가능(조상의 조상도 가능)
  • 참조변수의 타입을 변경하는 것 != 실제 인스턴스의 타입을 변환하는 것

  • 인스턴스에는 아무 영향을 미치지 않음

  • 자식타입 ↔ 부모타입

    • 자식타입 → 부모타입(Up-casting) : 생략 가능

    • 자식타입 ← 부모타입(Down-casting) : 생략불가
      다룰수 있는 참조변수의 멤버 > 인스턴스의 멤버 이므로, 문제가 발생할 가능성이 있음
      instanceof 연산자를 사용하여 확인 필요

  • 주의)

    • 참조변수가 가리키는 인스턴스의 자식타입으로는 형변환 비허용

    • 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인할 것 → instanceof



instanceof 연산자

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용

  • 사용방법

    • 참조변수 instanceof 클래스명(타입)
  • 반환값(boolean)

    • true : 참조변수가 검사한 타입으로 형변환 가능

    • false : 불가, 값이 null인 참조변수에 대해 수행시도 false

  • 참조변수.getClass().getName() → 참조변수가 가리키고 있는 인스턴스의 클래스 이름을 문자열로 변환



참조변수와 인스턴스의 연결

  • static

    • 변수, 메서드 모두 참조변수의 타입에 영향을 받음

    • 부모클래스타입 참조변수 → 부모클래스의 static 변수/메서드

    • 자식클래스타입 참조변수 → 자식클래스의 static 변수/메서드

    • 혼란의 소지가 있으니, 반드시 참조변수가 아닌 ‘클래스이름.메서드()’로 호출할 것

  • 중복정의되지 않은 멤버변수/메서드

    • 참조변수의 타입에 영향을 받지 않고 실제 인스턴스의 변수/메서드 호출
  • 중복정의된(overriding) 메서드

    • 참조변수의 타입에 영향을 받지 않고 실제 인스턴스의 메서드(오버라이딩된 메서드) 호출
  • 중복정의된(overriding) 멤버변수

    • 참조변수의 타입에 영향을 받음

    • 부모클래스타입 참조변수 → 조상클래스에 선언된 멤버변수

    • 자식클래스타입 참조변수 → 자식클래스에 선언된 멤버변수

    • 그래서 멤버변수들을 주로 private로 접근 제어하고, 메소드로 값에 접근할 수 있도록 !



매개변수의 다형성

  • 매개변수도 다형적인 특징이 적용됨



배열로 여러 종류의 객체 다루기

  • 조상타입의 참조변수 배열을 사용하면, 공통의 조상을 가진 서로 다른 종류의 객체를 배열로 묶어서 다룰 수 있음

    • 묶어서 다루고싶은 객체들의 상속관계를 따져서 가장 가까운 공통조상 클래스 타입의 참조변수 배열을 생성해서 객체들을 저장
  • Vector 클래스

    • 내부적으로 Object 타입의 배열을 가지고 있음 > 해당 배열에 객체를 추가/제거

    • 배열의 크기를 알아서 관리

    • 주요 메서드

메서드와 생성자 설명
Vector() 10개의 객체를 저장할 수 있는 Verctor 인스턴스를 생성
10개 이상의 인스턴스가 저장되면 크기가 자동 조절
boolean add(Object o) Vector에 객체 추가
추가에 성공하면 결과값 true, 실패하면 false 반환
boolean remove(Object o) Vector에 저장되어 있는 객체 제거
제거에 성공하면 결과값 true, 실패하면 false 반환
boolean isEmpty() Vector가 비어있는지 확인
비어있다면 결과값 true, 비어있지 않다면 false 반환
Object get(int index) 지정된 위치(index)의 객체를 반환
반환타입 Object
적절한 타입으로 형변환 필요
int size() Vector에 저장된 객체의 개수 반환