본문 바로가기
Java/이것이 자바다

인터페이스

by k-mozzi 2023. 3. 14.
반응형
Preface

 

이번 장에선 인터페이스의 정의와 사용 방법 등을 공부했다.

 

인터페이스는 상속 파트에서 클래스 타입을 매개 변수로 사용했던 것과 비슷한 방식으로 다형성 특성을 구현하는 것 같다는 생각이 들었다.

 

추상 메소드, instanceof 연산자, 매개 변수의 타입 등 지난 장에서 이미 공부했던 내용이 대부분이라 이해하기 어려운 부분은 없었던 것 같다.

 

다만 코드를 작성할 때 사용해야 할 키워드가 점점 다양해져서 헷갈릴 때가 종종 있다.


 

1. 인터페이스의 사용

 

 

- 인터페이스: 객체의 사용 방법을 정의한 타입

1) 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.

2) 개발 코드를 수정하지 않고 사용 객체를 변경할 수 있다.

→ 객체 종류에 따라 실행 내용과 리턴값이 달라진다.

 

 

- 인터페이스 선언 방법:  영어 대소문자를 구분하며, 첫 문자를 대문자로 하고 나머지는 소문자로 작성하는 것이 관례이다.

[public] interface 인터페이스명 {...}

 

 

- 인터페이스는 상수와 메소드만을 구성 멤버로 가진다.

→ 객체로 생성할 수 없으므로 생성자를 가질 수 없다.

 

 

 

- 인스턴스의 구성 멤버

1) 상수 필드(constant field): 인터페이스에 고정된 값으로 반드시 초기값을 대입해야 한다.

2) 추상 메소드(abstract method): 객체가 가지고 있는 메소드를 설명한 것으로, 실제 실행부는 구현 객체가 지닌다.

3) 디폴트 메소드(default method): 인터페이스에 선언되지만 사실은 구현 객체가 지니고 있는 인스턴스 메소드

4) 정적 메소드(static method): 디폴트 메소드와 달리 객체 없이 인터페이스만으로 호출이 가능한 메소드

 

 

- 상수는 public static final로 선언되므로 인터페이스에서 선언된 필드는 모두 상수의 특성을 지닌다.

1) public, static, final 키워드를 생략하더라도 컴파일 과정에서 자동으로 붙는다.

2) 상수명은 대문자로 작성하되, 서로 다른 단어로 구성된 경우엔 언더바로 연결한다.

3) 반드시 선언과 동시에 초기값을 지정해야 한다.

[public static final] 타입 상수명 = 값;

 

 

- 인터페이스에 선언된 추상 메소드는 모두 public abstract 특성을 지니므로 이를 생략하더라도 컴파일 과정에서 자동으로 붙는다.

 

 

- 디폴트 메소드는 defalut 키워드가 리턴 타입 앞에 붙는다.

→ 항상 public 특성을 지니므로 생략하더라도 컴파일 과정에서 자동으로 붙는다.

[public] default 리턴타입 메소드명(매개변수, ...) {...}

 

 

- 정적 메소드는 클래스의 정적 메소드와 형태가 동일하다.

→ 항상 public 특성을 지니므로 생략하더라도 컴파일 과정에서 자동으로 붙는다.

[public] static 리턴타입 메소드명(매개변수, ...) {...}

 

 

- 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드명, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 한다.

1) 위와 같은 객체: 인터페이스의 구현 객체

2) 구현 클래스: 구현 객체를 생성하는 클래스

 

 

- 구현 클래스의 선언부에는 implements 키워드를 추가하고 인터페이스명을 명시해야 한다.

public calss 구현클래스명 implements 인터페이스명 {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

 

 

- 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 가지므로 구현 클래스에서 public보다 낮은 접근 제한으로 작성할 수 없다.

 

 

- 인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 한다.

인터페이스 변수 = 구현객체;

 

 

- 익명 구현 객체: 소스 파일을 만들지 않고도 구현 객체를 만드는 방법

1) 중괄호 안에는 인터페이스에 선언된 모든 추상 메소드들의 실체 메소드를 작성해야 한다.

2) 추가적인 필드와 메소드를 선언할 순 있지만, 익명 객체 안에서만 사용 가능하고 인터페이스 변수로 접근할 수 없다.

인터페이스 변수 = new 인터페이스() {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
};

 

 

- 다중 인터페이스를 구현할 경우 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 한다.

 

 

- 인터페이스 변수는 참조 타입이므로 구현 객체가 대입될 경우 구현 객체의 번지를 저장한다.

 

 

- 디폴트 메소드는 인터페이스에 선언되지만 인터페이스에서 바로 사용할 수 없다.

→ 인스턴스 메소드이므로 구현 객체가 있어야 사용할 수 있다.

 

 

- 인터페이스의 정적 메소드는 인터페이스로 바로 호출이 가능하다.

 

 

- 인터페이스는 메소드의 매개 변수로 자주 사용된다.

 

 

- 인터페이스 구현 클래스를 상속해서 자식 클래스를 만든 경우 자식 객체 역시 인터페이스 타입으로 자동 타입 변환시킬 수 있다.

 

 

- 매개 변수의 타입이 인터페이스인 경우, 모든 구현 객체를 매개값으로 사용할 수 있고 어떤 객체가 제공되느냐에 따라 메소드의 실행 결과가 다양해진다.

 

 

- 구현 객체를 다시 구현 클래스 타입으로 변환하는 방법

구현클래스 변수 = (구현클래스) 인터페이스변수;

 

 

- instanceof 연산자는 인터페이스 타입에도 사용할 수 있다.

 

 

- 인터페이스는 클래스와 달리 다중 상속을 허용한다.

1) 하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드와 더불어 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.

2) 구현 클래스로부터 객체를 생성한 후엔 하위 및 상위 인터페이스 타입으로 변환이 가능하다.

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {...}

 

 

- 디폴트 메소드는 기존의 인터페이스를 확장해서 이전의 구현 클래스의 코드 변화 없이 새로운 기능을 추가하기 위해 사용된다.

 

 

- 디폴트 메소드가 있는 인터페이스를 상속하는 경우, 자식 인터페이스에서 디폴트 메소드를 활용하는 방법

1) 디폴트 메소드를 단순히 상속만 받는다.

2) 디폴트 메소드를 오버라이딩해서 실행 내용을 변경한다.

3) 디폴트 메소드를 추상 메소드로 재선언한다.

 

728x90
반응형

댓글