5. 다형성
- 여러가지 형태를 가질 수 있는 능력
- 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있게 하는 것
- 조상 타입의 참조변수로 자손타입의 인스턴스 참조 가능
- 그러나 자손에서 추가로 정의한 메소드에는 접근 불가!
- 반대로 자손타입의 참조변수로 조상타입의 인스턴스 참조 불가능
- 조상타입의 인스턴스 참조 허용하면 존재하지 않는 멤버 사용하고자 할 가능성 존재, 허용 x,
! 참조 변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다
5.2 형변환
자손타입 -> 조상타입 (업캐스팅) - 형변환 생략 오케이
조상타입 -> 자손타입 (다운캐스팅) - 형변환 생략 불가
- 상속 관계가 아닌 클래스 간 형변환 불가
- 조상 = 자손 의 형태는 업캐스팅 (조상<-자손) - 형변환 캐스팅 필요 없음
- 자손 = (자손캐스팅)조상 은 다운캐스팅 (자손 <-조상) - 캐스팅 필수!!
5.3 instance of 연산자
- 참조변수가 참조하는 인스턴스의 실제 타입을 알아보기 위해 사용되는 연산자
- instance of의 연산결과가 true라면 참조변수가 검사한 타입으로 형변환이 가능
6. 추상클래스
6.1 추상클래스
- 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도
- 추상클래스는 마완성 메소드를 포함하고 있다.
- 추상클래스 자체로는 클래스로서의 역할 다 못하지만 새 클래스 작성하는데 있어서, 바탕이 되는 조상클래스로서 중요 의미
- 클래스 선언부에 abstract 붙여주면 ㅗ딘다.
6.2 추상메소드
-
선언부만 작성, 구현부는 작성 x 남겨둔 것
-
실제 내용은 추상클래스 상속받는 자손클래스에서 구현해줘야한다.
6.3 추상클래스의 작성
- 추상화 ) 클래스 간 공통점 찾아내, 공통의 조상 만드는 작업
-
구체화) 상속을 통해 클래스 구현, 확장 작업
-
굳이 abstract 붙여서 추상메서드 선언 이유는, 자손 클래스에서 추상메서드를 반드시 구현하도록 강요하기 위해서
추상메소드의 사용이유!
-
만일 추상메서드로 정의 x, 빈 몸통만 가지도록 정의된다면 상속받는 자손 클래스에서는 메서드들이 온전히 구현된 것으로 인식, 오버라이딩 통해 클래스에 안 맞게 구현 가능
-
그러나 추상메소드 구현 시, 자손 클래스 작성할 때 이들이 추상메서드이므로 내용 구현해줘야 함을 인식하고, 자신 클래스에 알맞게 구현할 것
7. 인터페이스
인터페이스 vs 추상메소드
-
추상메소드 : 내부의 기능 확장 위해 존재, 추상메소드가 하나 이상만 있음 된다 (같은 부모로서의 역할)
-
인터페이스 : 정의된 함수들의 구현 강제 위해(인터페이스가 구현한 객체와 같은 동작 보장), 모든 메소드가 반드시 추상메소드여야 한다. (다른 부모더라도 같은 기능 수행 보장)
7.1 인터페이스 - 일종의 추상클래스
- 그러나 추상클래스보다 추상화 정도가 높은 아이, 추상클래스와 달리 몸통을 갖춘 일반
메서드 , 멤버변수 가질 수 없음, 오직 추상메서드와 상수만을 멤버로 가짐
- 추상클래스는 그래도 일반 메소드, 멤버 변수 허용 (미완성 설계도)
- 인터페이스는 모조리 추상클래스여야 한다.
7.3 인터페이스 상속
- 인터페이스가 인터페이스 상속 시 extends
- 클래스가 인터페이스 상속 시 implements
- 인터페이스는 클래스와 달리 Object 클래스와 같은 최고 조상이 존재 X
7.4 인터페이스 구현
- 인터페이스도 추상클래스처럼 그 자체로 인스턴스 생성 불가
- 클래스가 인터페이스를 IMPLEMENTS 해서 구현하도록 한다,
7.5 인터페이스 다중 상속
- 인터페이스는 STATIC 상수만 정의 가능, 조상 클래스의 멤버변수와 충돌하는 경우는 없고 충돌된다 하더라도 클래스 이름 붙여 구분이 가능
- 추상메소드는 구현 내용 없으므로 조상 클래스의 메소드와 선언부가 일치하는 경우에는 조상 클래스 쪽의 메소드 상속받으면 됨
7.7 인터페이스의 장점
- 표준화 가능
- 개발자들에게 인터페이스 구현해 프로그램 작성하게 함 => 일관되고 정형화된 프로그램의 개발 가능
- 서로 관계 없는 클래스들에게 관계 맺어주기 가능
- 서로 상속도 아니고, 같은 조상클래스 갖고 있지 않은 서로 아무 관계도 없는 클래스들에게 하나의 인터페이스 공통으로 구현해 프로그램 작성하게 하며 관계 맺어주기 가능