JAVA/이론

[java][이론] 011 다형성

Na선생 2020. 8. 6. 00:39

11 다형성

다형성

○ 다형성 : 여러 가지 형태를 가질 수 있는 능력

한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 프로그램적으로 구현

조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 함

 

○ 같은 타입의 참조변수와 조상타입 참조변수 접근의 차이

둘 다 같은 타입의 인스턴스이지만 참조변수 타입에 따라 사용할 수 있는 멤버 개수가 다름

자손 타입의 참조변수가 접근할 수 있는 멤버가 더 많음

조상 타입으로 접근 시 조상타입의 멤버만 접근 가능

 

○ 자손 타입의 참조변수로 조상 타입 인스턴스 참조는 불가능

존재하지 않는 멤버를 사용하고자 할 가능성이 있어서 불허용

참조변수가 사용할 수 있는 멤버 개수는 인스턴스 멤버 개수보다 같거나 적어야 함

클래스는 상속을 통해 확장만 가능, 축소는 불가능 -> 멤버 개수가 조상이 더 적음

 

참조변수의 형 변환

○ 서로 상속관계에 있는 클래스 사이에서만 형 변환 가능

자손 타입 -> 조상 타입 : 형 변환 생략 (큰 거에서 작은 거로 가므로 가능)

조상 타입 -> 자손 타입 : 형 변환 생략 불가

조상 인스턴스가 자손 -> 조상 으로 변화해서 자손 타입 멤버가 존재는 하지만 접근할 수 없었던 상태일 때 가능

자손 타입으로는 조상을 참조하지 못함!

 

형 변환 수행 전 instanceof연산자 사용

참조 변수가 참조하고 있는 실제 인스턴스의 타입 확인하는 연산자

 

○ 형 변환은 참조변수의 타입을 변환하는 것이지 인스턴스의 타입을 변환하는 것이 아님

참조 변수 형 변환은 인스턴스에 영향 없음

참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위가 조절되는 것 뿐!

 

● instanceof 연산자

○ 참조변수 instanceof 타입

○ 연산 결과로 boolean 반환

True : 참조변수가 겁사한 타입으로 형변환 가능 false : 참조변수가 검사한 타입으로 형변환 불가능

값이 null인참조변수에 대해 instanceof연산 수행하면 false 나옴

 

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

 

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

○ 멤버변수가 조상 클래스와 자손 클래스에 중복 정의된 경우

-> 조상 참조타입 사용하면 조상꺼, 자손 참조타입 사용하면 자손꺼 사용

메서드는 오버라이딩 되니까! 노상관

Parent p = new Child();

Child c = new Child();

일 때 p.x, c.x로 서로 같은 이름 변수를 참조한다

○ 구분자 super, this

조상 타입일 때 super.x

자손 타입일 때 this.x

 

매개변수의 다형성

○ 메서드의 매개변수에도 다형성 적용!

○ 부모 타입 참조변수를 메서드의 매개변수로 선언하면 자식 타입을 전부 메서드의 매개변수로 사용할 수 있음

PrintStream 클래스의 print(Object o)메서드도 매개변수가 Object 객체이므로 모든 것을 다 넣으면 다 출력하는 것이지!

 

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

○ 조상 타입의 참조변수 배열 사용해 자손 타입 객체들을 한 배열로 묶을 수 있음

○ 묶어서 다루고 싶은 객체들의 상속관계 따져서 공통조상 클래스 타입 참조변수 배열 생성하면 됨

Vector 클래스

내부적으로 Object타입 배열 가지고 있는 클래스(모든 타입 가능하다는 거!)

배열의 크기를 알아서 관리해주기에 저장할 인스턴스의 개수 신경 안쓰임

즉 동적으로 크기가 관리되는 객체배열!

주요 메서드들

□ Vector() : 10개 객체 저장할 수 있는 Vector객체 생성(크기 자동 조절)

□ Boolean add(Object o) : Vector에 객체 추가. 성공 시 true, 실패 시 false 반환

□ Boolean remove(Object o) : Vector에 저장된 객체 제거. 성공 시 true, 실패 시 false 반환

□ Boolean isEmpty(Object o) : Vector가 비어있는지 검사. 빈 거면 true, 안 빈 거면 false 반환

□ Object get(int index) : index에 위치한 객체 반환. 반환 후 형 변환 필요(Object 타입이므로)

□ int size() : Vector에 저장된 객체 개수 반환