티스토리 뷰

Study !/JAVA

JAVA 정리 5. 인터페이스

저유 2018. 9. 14. 18:04

인터페이스(interface)는 객체의 사용 방법을 정의한 타입니다. 클래스와 유사하지만 메소드의 구현부가 없이 구현할 클래스의 뼈대를 만들어준다. 인터페이스에서 뼈대 (객체가 가져야할 특징,특성)를 잡아주면 클래스는 인터페이스를 implements 하여 살을 붙인다. 인터페이스가 뼈대 만 잡아주기때문에 메소드의 선언만할 수 있고 구현할 수 없다. 또한 필드를 선언할 수 없지만 상수 필드는 선언이 가능하다. 이러한 특징떄문에 인터페이스는 객체화 할 수없다 (생성자도 없다) 인터페이스를 사용하는방법은 구현 클래스를 만들어 사용하는 방법 뿐이다.


선언

인터페이스 선언은 class키워드 대신 interface 키워드를 사용한다.

interface 인터페이스명 {
  //상수
  타입 상수명 = 값;
  //추상 메소드
  타입 메소드명(매개변수);
  //디폴트 메소드
  default 타입 메소드명(매개변수) {  }
  //정적 메소드
  static 타입 메소드명(매개변수) {  }
}

상수 필드(Constant Field)

인터페이스에서는 상수 필드만 선언이 가능하다. 상수는 public static final의 특징을 가지고 있고 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다. 상수명은 대문자로 작성하고 단어사이에는 언더바로 연결하는 형식으로 사용한다. (ex. MOVE_UP)


추상 메소드(Abstract Method)

객체가 가지고 있는 메소드를 설명한 것으로 리턴타입, 매개변수가 무엇인지 선언해준다. 실제 실행부는 객체 (구현객체)가 가지고 있다.


디폴트 메소드(Default Method)

디폴트 메소드는 default 키워드를 사용한다. 인터페이스에서 선언과 구현을 모두한 메소드이다. 상속의 개념과 비슷하다. 자바 8에서 부터 사용할 수있다. 디폴트 메소드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추기하기 위해서이다. 기존에 A라는 인터페이스와 이를 구현한 B와 C라는 클래스가 있다. 시간이 흘러 A인터페이스에 기능을 추가해야 할 필요성이 생겨 A인터페이스에 추상 메소드를 추가했다면 B클래스에서 추상메소드에 대한 실체메소드가 없어 문제가 발생한다. A를 수정할 여건이 안되거나 모든 구현클래스를 손볼수 있는 여건이 안될경우 디폴트 메소드를 사요하면 ㅇ아무런 문제 없이 사용이 가능하다.


정적 메소드(Static Method)

정적메소드는 static 키워드를 사용한다 디폴트 메소드와 마찬가지로 선언과 구현을 모두한 메소드이고 자바 8부터 사용할 수있다.

디폴트 메소드와 구분되는점은 객체가 없어도 인터페이스만으로 호출이 가능하다.


구현

코드에서 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다. 객체는 인터페이스에서 정의된 추상메소드와 동일한 메소드명, 리턴타입, 매개변수 를 가지고 있어야 한다. 이런한 객체를 구현 객체, 구현 클래스 라고 한다. 구현 클래스는 implements 키워드를 추가하고 인터페이스 명을 명시하면된다.

public class 구현클래스명 implements 인터페이스명 {
  //추상 메소드 구현
}
public abstract class 구현클래스명 implements 인터페이스명{ } //추상클래스

만약 인터페이스에 선언된 추상 메소드에 대응하는 실제메소드를 작성하지 않으면 구현 클래스는 자동적으로 추상 클래스가 된다. 그렇기때문에 이런 경우에는 abstract 키워드를 추가해야 한다.


사용

인터페이스 변수를 선언하고 구현 객체를 대입하여 사용한다.

개발 코드에서 인터페이스는 클래스의 필드, 메소드의 매개변수, 메소드의 지역변수로 선언 될 수 있다.

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

Phone = phone;
phone = new IPhone();
phone = new GalaxyPhone();

익명 구현 객체

구현 클래스를 만들어 사용하는 것이 일반적이고 재사용할 수 있기 떄문에 편리하지만, 일회성 구현 객체를 만들기 위해 클래스를 만드는것은 비효울적이다. 자바에서는 클래스 소스파일을 만들지 않고 구현 객체를 만들 수 있는 방법을 제공한다. 사용방법은 다음과 같다.

인터페이스 변수 = new 인터페이스() {
  //추상 메소드 구현
}

상속

인터페이스도 다른 인터페이스를 상속할 수 있다. 인터페이스는 클래스와 달리 다중 상속을 허용한다. 하위 인터페이스르 구현하는 클래스는 하위 인터페이스의 메소드 뿐만아니라 사우이 인터페이스 모든 추상메소드를 구현 해야한다. 이렇게 구현된 클래스는 하위 인터페이스부터 상위 인터페이스까지 모든 타입으로 변환이 가능하다.

interface 하위인터페이스 extends 상위인터페이스A, 상위인터페이스B {   }

하위인터페이스 변수명 = new 구현클래스();
상위인터페이스A 변수명 = new 구현클래스();
상위인터페이스B 변수명 = new 구현클래스();

디폴트 메소드가 있는 인터페이스르 상속 받은경우 활용 방법은 3가지가 있다

단순히 상속만 받는다

오버라이드해서 실행 내용을 변경한다.

추상 메소드로 재선언한다

'Study ! > JAVA' 카테고리의 다른 글

JAVA 정리 7-1. 쓰레드(Thread)란?  (0) 2018.10.05
JAVA 정리 6. 예외(Exception) try-catch-finally  (0) 2018.10.05
JAVA 정리 4-3. 추상클래스  (0) 2018.09.13
JAVA 정리 4-2. 다형성  (0) 2018.09.13
JAVA 정리 4-1. 상속과 Override  (0) 2018.09.13
댓글