[Java] 8. 인터페이스
2022. 6. 2. 19:35ㆍJava
8-1) 인터페이스
- 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.
- 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해 인터페이스를 사용한다.
- 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다는 점에서 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 가지게 된다.
- 인터페이스 선언
- 인터페이스 선언은 class 키워드 대신에 interface 키워드를 사용한다.
≫ [public] interface 인터페이스이름{…} - 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
- 인터페이스에 선언된 필드는 모두 public state final의 특성을 갖는다.
- 작성하지 않더라도 컴파일 과정에서 자동으로 붙게 됨. - 인터페이스 상수는 반드시 선언과 동시에 초기값을 지정해야 한다.
- 인터페이스의 메소드는 추상 메소드로 선언한다.
- public abstract의 특성을 갖는다.
- 인터페이스 선언은 class 키워드 대신에 interface 키워드를 사용한다.
- 인터페이스 구현
- 개발 코드가 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다.
- 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 한다.
- 구현 클래스
- 보통의 클래스와 동일하나 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야 한다.
- 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 한다.
≫ public class 구현클래스이름 implements 인터페이스이름 {
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
- 구현 클래스가 작성되면 new 연산자로 객체를 생성할 수 있다.
- 인터페이스 사용
- 클래스를 선언할 때 인터페이스는 필드, 생성자, 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.
① 인터페이스가 필드 타입으로 사용될 경우, 필드에 구현 객체를 대입할 수 있다.
② 인터페이스가 생성자의 매개 변수 타입으로 사용될 경우, new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있다.
③ 인터페이스가 로컬 변수 타입으로 사용될 경우, 변수에 구현 객체를 대입할 수 있다.
④ 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현 객체를 매개값으로 대입할 수 있다.
- 클래스를 선언할 때 인터페이스는 필드, 생성자, 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.
8-2) 타입 변환과 다형성
- 자동 타입 변환
- 구현 객체가 인터페이스 타입으로 변환되는 것.
- 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것.
- 자동 타입 변환을 이용하면 필드의 다형성과 매개 변수의 다형성을 구현할 수 있다.
- 필드와 매개 변수의 타입을 인터페이스로 선언하면 다양한 구현 객체를 대입하여 실행 결과를 다양하게 만들 수 있다.
- 필드의 다형성
- 매개 변수의 다형성
- 매개 변수의 타입이 인터페이스일 경우 어떠한 구현 객체도 매개값으로 사용할 수 있고, 어떤 구현 객체가 제공되느냐에 따라 메소드의 실행결과는 다양해질 수 있다.
- 강제 타입 변환
- 구현 객체가 인터페이스 타입으로 자동 타입 변환하면 인터페이스에 선언된 메소드만 사용 가능한 제약 사항이 따름.
- 경우에 따라 구현 클래스에 선언된 필드와 메소드를 사용해야 할 경우가 발생하는데 이때 강제 타입 변환을 하여 다시 구현 클래스 타입으로 변환한 뒤 구현 클래스의 필드와 메소드를 사용할 수 있다.
- 객체 타입 확인
- instanceof 연산자로 확인한 뒤 안전하게 강제 타입 변환하기.
* 인터페이스는 클래스와 달리 다중 상속이 가능하기 때문에 extends 키워드 뒤에 상속할 인터페이스들을 나열할 수 있다.
* 하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드 뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.
'Java' 카테고리의 다른 글
[Java] HashSet을 이용한 로또 판매 프로그램 (0) | 2022.06.23 |
---|---|
[Java] 9. 중첩 클래스와 중첩 인터페이스 (0) | 2022.06.07 |
[Java] 7. 상속 (0) | 2022.06.02 |
[Java] 6. 클래스 (0) | 2022.05.30 |
[Java] 5. 참조 타입 (0) | 2022.05.26 |