※복습
🎇인터페이스
- 객체의 교환성을 높여주기 때문에 다형성을 구현하는데 매우 중요한 역할.(다형성의 활용 빈도를 높여준다.)
- 개발 코드와 객체가 서로 통신하는 접점(중간) 역할.
- 인터페이스 타입 객체의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출시킨다.
- 따라서 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스 내 메서드 이름만 알면 된다.
- 중간에 인터페이스를 두는 이유는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서이다.
- 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하기 때문에 어떤 객체를 사용하는 냐에 따라서 실행 내용과 반환값이 다를 수 있다. 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화 할 수 있다는 장점을 가지게 된다.
- 객체의 사용 설명서로 메서드를 직접 구현하지 않고 정의만 해놓은 타입이다.
인터페이스 구성
- 상수 필드
- 추상 메서드
※ 객체 생성이 불가하여 생성자가 없다.
인터페이스 선언
public interface 인터페이스명 {...}
상수 필드 선언
- 객체 생성이 불가능하여 메모리 할당 받지 못하기 때문에 필드는 상수로만 선언이 가능하다.
[public static final] 타입 상수명 = 값;
추상 메서드 선언
[public abstract] 반환타입 메서드명(매개변수);
인터페이스 구현
- 인터페이스를 구현할 클래스는 인터페이스 내 정의된 추상 메서드를 구현해줘야 한다.(강제 재정의)
public class 구현클래스명 implements 인터페이스명1, 인터페이스명2, ... {...}
- 다수의 인터페이스를 하나의 클래스에서 구현할 수 있다.
인터페이스 사용
- 인터페이스 타입은 필드, (생성자, 메서드) 매개변수, 반환값 타입으로 사용 가능하다.
🎇인터페이스 타입 변환과 다형성
자동타입변환
- 구현 클래스의 객체가 인터페이스 타입으로 자동 변환되는 것.
- 인터페이스타입 변수 = 구현클래스 객체;
매개변수의 다형성
- 일반적으로 메서드의 매개변수를 인터페이스 타입으로 선언한 경우, 메서드 호출 시 구현한 클래스 타입의 매개변수를 입력 받을 수 있다.(다형성)
강제타입변환
- 구현클래스타입 변수 = (구현클래스타입) 인터페이스타입 변수;
객체타입확인
- instancof 연산자 사용하여 객체의 타입을 확인 가능.(if 조건문과 함께 사용)
인터페이스 상속
public interface 인터페이스명 extends 상위인터페이스1, 상위인터페이스2 {...}
🎇중첩(내부) 클래스와 중첩 인터페이스
중첩(내부) 클래스
- 클래스 내부에 선언한 클래스.
- 중첩(내부) 클래스 장점 : 두 클래스의 멤버들을 서로 쉽게 접근이 가능하고, 외부에는 불필요한 관계 클래스를 감춤으로서 코드의 복잡성을 줄여준다.
- 멤버 클래스 : 멤버변수로서 선언되는 중첩 클래스.
- 지역 클래스 : 생성자 또는 메서드 내부에서 선언되는 중첩 클래스.
중첩(내부) 클래스 명명 규칙
- A $ B.class : A(바깥 클래스), B(내부 클래스)
인스턴스 멤버 클래스
- 인스턴스 멤버 클래스 내에서는 static(정적) 멤버 사용 불가.
정적 멤버 클래스
지역 클래스
- 메서드 내부에서 선언한 클래스.
- 메서드 내부에 선언되어 메서드 종료 시 메모리가 사라진다.
중첩(내부) 클래스의 접근 제한
- 내부 클래스와 외부 클래스 간에는 접근 제한이 가능하다.
- 내부에 있는 클래스들은 클래스 자신의 멤버로 여기고, 외부 클래스의 멤버는 다른 클래스의 멤버로 여기면 된다.
지역 클래스에서 사용 제한
- 메서드가 종료되어도 메서드 내 변수의 참조가 끊기지 않은 경우, 즉, 메서드 내부 클래스에서 메서드 지역 변수를 사용한 경우, 참조가 끊기지 않아서 메서드가 종료된 후에도 제거되면 안된다.
- 이전에는 변수 선언 시 final 예약어를 붙여주지 않으면 예외가 발생했지만, JDK1.8부터 메서드 내 지역변수에 final 예약어를 생략하여도 컴파일러가 자동으로 붙여주도록 바뀌었다.(final 생략 가능)
- 이러한 변수들은 선언 시, 상수 영역에 메모리가 생성되어 final 변수로 취급된다.
중첩(내부) 클래스에서 외부 클래스 참조 얻기
중첩 인터페이스
- 클래스 내부 인터페이스.
- 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 사용 가능하다. 주로 정적 멤버 인터페이스를 많이 사용하는데 UI 프로그래밍에서 이벤트 처리 목적으로 많이 활용된다.
- 클래스 내부에 인터페이스의 다형성을 이용하여, 여러 객체들을 setter를 통해 사용할 수 있다.
- 즉, 하나의 메서드로 다양한 기능을 사용할 수 있다.