다형성
다형성이란?
- 여러가지 형태를 가질 수 있는 능력
- 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현함
- 상속 관계에 있는 클래스의 경우, 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것도 가능함
- 참조 변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다
- 인스턴스의 멤버 개수보다 같거나 적어야 한다
참조변수의 형변환
- 자손 타입의 참조변수를 조상 타입 참조변수로, 조상 타입의 참조변수를 자손 타입의 참조변수로의 형변환만 가능
- 자손타입 -> 조상타입 : 형변환 생략가능 (업캐스팅) / 조상은 자손보다 멤버의 개수가 적은 것이 분명하기 때문에 생략 가능
- 자손타입 <- 조상타입 : 형변환 생략불가 (다운캐스팅)
- 참조 변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다
- 참조변수의 형변환을 통해서 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위를 조절하는 것 뿐이다
- 조상 타입의 인스턴스를 자손 타입의 참조변수로 참조하는 것은 허용되지 않는다
instanceof 연산자
- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용하는 연산자
- 조건문에 사용, instanceof의 왼쪽에는 참조변수를, 오른쪽에는 타입이 피연산자로 위치한다
참조변수와 인스턴스의 연결
- 멤버변수의 경우 참조변수의 타입에 따라 달라진다
매개변수의 다형성
추상 클래스
추상 클래스란?
- 미완성 메서드를 포함하는 클래스
- 인스턴스를 생성할 수 없다
- 상속을 통해 자손 클래스에 의해서만 완성될 수 있다
- 새로운 클래스를 작성하는 바탕이 되는 조상 클래스로서 의미를 가진다
- abstract
추상 메서드
- 선언부만 작성하고 구현부는 작성하지 않은채로 남겨둔 것
- 추상클래스로부터 상속받는 자손 클래스는 오버라이딩을 통해 추상 클래스의 추상 메서드를 모두 구현해야 한다
추상 클래스의 작성
- 추상화 : 클래스 간의 공통점을 찾아내서 공통의 조상을 만드는 작업
- 구체화 : 상속을 통해 클래스를 구현, 확장하는 작업
인터페이스
인터페이스란?
- 일종의 추상 클래스
- 추상메서드와 상수만을 멤버로 가진다
인터페이스 작성
- 모든 멤버 변수는 public static final이어야 하며, 이를 생략할 수 있다
- 모든 메서드는 public abstrac 이어야 하며 이를 생략할 수 있다
- jdk 1.8부터 디폴트메서드 추가 허용
인터페이스 상속
- 인터페이스는 다중 상속이 가능하다
- 인터페이스는 최고 조상이 없다
인터페이스 구현
- implements
- 일부만 구현해야 하는 경우 abstract를 붙여 추상 클래스로 선언
- 그 이후 상속과 구현을 동시에 함
인터페이스를 이용한 다형성
- 인터페이스 ㅌ아ㅣㅂ의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로 형변환도 가능하다
- 리턴 타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다
인터페이스의 장점
- 개발시간 단축
- 표준화 가능
- 서로 관계없는 클래스들에게 관계를 맺어줄 수 있다
- 독립적인 프로그래밍 가능
디폴트 메서드와 static 메서드
- 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드로, 추상 메서듣가 아니기 때문에 디폴트 메서드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다
- 접근 제어자는 public
- 새로 추가한 디폴트 메서드가 기존의 메서드와 이름이 중복되어 충돌하는 경우
- 여러 인터페이스의 디폴트 메서드 간의 충돌은 인터페이스를 구현한 클래스에서 오버라이딩을 한다
- 디폴트 메서드와 조상 클래스의 메서드 간에 충돌이 일어나는 경우 조상 클래스의 메서드가 상속되고 디폴트 메서드는 무시된다
내부 클래스
내부 클래스란?
- 클래스 내에 선언된 클래스
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다
- 코드의 복잡성을 줄일 수 있다(캡슐화)
종류와 특징
- 인스턴스 클래스 : 외부 클래스의 멤버변수 선언위치에 선언, 외부 클래스의 인스턴스 멤버처럼 다루어진다
- 스태틱 클래스 : 외부 클래스의 멤버변수 선언위치에 선언, 외부 클래스의 static 멤버처럼 다루어진다
- 지역 클래스 : 외부 클래스의 메서드나 초기화 블럭 안에 선언, 선언된 영역 내부에서만 사용됨
- 익명 클래스 : 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용)
제어자와 접근성
- 제어자, 접근 제어자 사용 가능
- 스태틱 클래스만 스태틱 멤버를 가질 수 있다
- fianl과 static이 동시에 붙은 변수는 상수이기 때문에 모든 내부 클래스에서 정의 가능
익명 클래스
- 클래스의 선언과 객체의 생성을 동시에 함
- 한번만 사용될 수 있고 하나의 객체만을 생성할 수 있음