[java][이론] 011 다형성
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에 저장된 객체 개수 반환