반응형

인터페이스의 특징

   - 인터페이스의 형을 대상으로 참조변수의 선언이 가능하다.

   - 인터페이스의 추상메소드와 이를 구현하는 메소드 사이에 오버라이딩 관계가 성립한다.

     어노테이션 @Override의 선언이 가능하다.

 

   - 인터페이스에 선언되는 메소드

     -> 인터페이스의 모든 메소드는 public이 선언된 것으로 간주한다.

   - 인터페이스 내에 선언되는 변수 ( 상수 )

     -> 반드시 선언과 동시에 값으로 초기화를 해야 한다.

     -> 모든 변수는 public, static, final이 선언된 것으로 간주한다.

 

interface Printable {
	int DOC_WIDTH = 270;
	int DOC_HEIGHT = 120;
	void print(String doc);
}

 

※ 인터페이스를 구현하는 클래스는 인터페이스에 존재하는 모든 추상 메소드를 구현해야한다.

   하나라도 구현하지 않으면 해당 클래스를 대상으로는 인스턴스 생성이 불가능하다.

※ 인터페이스 간에도 상속이 가능하다.

※ 클래스에서 인터페이스를 구현하려면 implements 키워드를 사용한다.

※ 인터페이스에서도 상속을 지원한다.

 

   인터페이스의 디폴트 메소드

   - 기능 보강을 위해 모든 인터페이스에 추상 메소드를 추가해야 하는 상황이 생겼을 때,

     이 문제를 인터페이스의 상속으로 처리하면 인터페이스의 수는 엄청나게 늘어나게 된다.

     인터페이스의 수가 늘어나면 사용자가 알아야 할 인터페이스가 많아져 개발에 불편을 초래한다.

     이런 상황을 해결하기 위해 인터페이스에서 디폴트 메소드 지원한다.

 

      디폴트 메소드의 특징

      - 인터페이스에 추상 메소드를 추가해야 하는 상황에서, 이전에 개발해 놓은 코드에 영향을 미치지

        않기 위해 등장한 문법이다.

      - 인터페이스 내에 정의되어 있지만 그 자체로 완전한 메소드이다.

        따라서 해당 인터페이스를 구현하는 클래스가 디폴트 메소드를 오버라이딩 하지 않아도 된다.

 

interface Printable {
	void print(String doc);
	default void printCMYK(String doc) {  
			... 
			...
			...
	}
}

 

처음 인터페이스를 설계하는 과정에서 디폴트 메소드를 사용하는 것은 디폴트 메소드를 잘못 이해하고     잘못 사용하고 있는 것이다.

인터페이스에 디폴트 메소드가 사용되었다면, 구현하는 모든 클래스들이 해당 디폴트 메소드를 사용할 수 있기 때문에 특정 기능을 특정한 클래스에만 추가하려면 인터페이스의 디폴트 메소드가 아닌 추상클래스를 사용해야 한다.

 

   인터페이스의 static 메소드(클래스 메소드)

   - 자바 8부터 인터페이스에도 static 메소드를 사용 가능하다.

   - 인터페이스의 static 메소드 호출 방법은 클래스의 static 메소드 호출 방법과 같다.

 

interface Printable { 
	static void printLog(String log) { 
		System.out.println(log); 
	} 
	default void print(String doc) { 
		printLog(doc); // 인터페이스의 static 메소드 호출 
	} 
}

인터페이스의 또 다른 사용 용도 : Marker Interface

- 인터페이스는 클래스에 특별한 표식을 다는 용도로도 사용이 된다.

  이렇게 사용되는 인터페이스를 마커 인터페이스라 한다.

- 마커 인터페이스에는 아무런 메소드도 존재하지 않는 경우가 많다.

 

예) 인터페이스 Printable을 구현한 클래스의 인스턴스만 printContents 메소드의 인자가 될 수 있다.

   - public void printContents( Printable doc ) {  . . . }

 

[참고자료]

윤성우의 열혈 Java 프로그래밍

반응형

'Java > 기본' 카테고리의 다른 글

자바(Java) - 예외처리  (0) 2020.03.01
자바(Java) - 추상 클래스  (0) 2020.02.29
자바(Java) - 인스턴스 접근 가능 멤버 결정 규칙  (0) 2020.02.27
자바(Java) - 상속  (0) 2020.02.26
자바(Java) - 다차원 배열  (0) 2020.02.26

+ Recent posts