본문 바로가기
Language/Java

JAVA 8주차 : 인터페이스

by CleanCoder 2021. 2. 14.

 

목표

자바의 인터페이스에 대해 학습하세요.

학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

1. 인터페이스 정의하는 방법

 

 인터페이스는 객체의 사용 방법을 정의한 타입이다. 객체와 개발 코드 사이에 인터페이스를 두어서 코드 변경 없이 실행 내용과 리턴 값을 다양화할 수 있다.

 

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

public interface PersonControl{...}

 

클래스는 필드, 생성자, 메서드를 구성 멤버로 가지는데에 비해, 인터페이스는 상수와 메서드만을 구성 멤버로 가진다.

인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

 

interface 인터페이스명{
	//상수
	타입 상수명 = 값;
	//추상 메서드
	타입 메서드명(매개변수,...);

}

 

상수 필드(Constant Field)

인터페이스는 런타임 시 저장할 수 있는 필드를 선언할 수 없지만 상수 필드는 선언 가능하다.

상수는 인터페이스에 고정된 값으로 런타임 시에 데이터를 바꿀 수 없다.

반드시 초기값을 대입해야 한다.

 

추상 메서드(Abstract Method)

추상 메서드는 객체가 가지고 있는 메서드를 설명한 것으로 호출할 때 어떤 매개 값이 필요하고, 리턴 타입이 무엇인지만 알려준다. 실제 실행부는 객체(구현 객체)가 가지고 있다.

 

추상 클래스와 인터페이스의 차이점

  1. 추상 클래스는 일반 메서드와 추상 메서드 둘 다 가질 수 있다.

    → 인터페이스는 오로지 추상 메서드와 상수만을 가진다. (구현 로직을 작성할 수 없다.)

    but. java8 부터는 default methodstatic method를 작성할 수 있다.

  2. 인터페이스 내에 존재하는 메서드는 무조건 "public abstract" 로 선언되며, 이를 생략할 수 있다.

  3. 인터페이스 내에 존재하는 변수는 무조건 "public static final" 로 선언되며, 이를 생략할 수 있다.

// interface 의 제약 조건을 따르지 않았기 때문에 오류가 발생합니다.
private int a = 1;       

// 컴파일러가 자동적으로 public static final b = 2로 추가해줍니다.
public int b = 2;        

// 컴파일러가 자동적으로 public static final c = 3으로 추가해줍니다.
static int c = 3;         

// 컴파일러가 자동적으로 public static final d = 4로 추가해줍니다.
int d = 4;        

 

 

2. 인터페이스 구현하는 방법

 

 개발 코드가 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다.

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

이러한 객체를 인터페이스의 구현(implements) 객채라고 하며, 구현 객체를 생성하는 클래스를 구현 클래스라 한다.

 

 

구현 클래스

 

보통의 클래스와 동일한데, 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스명을 명시해야 한다.

보통의 클래스와 동일한데, 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스명을 명시해야 한다.

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

그리고 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 한다.

 

익명 구현 객체

 

 구현 클래스를 만들어 사용하는 것이 일반적이고, 클래스를 재사용할 수 있기 때문에 편리하지만, 일회성의 구현 객체를 만들기 위해 소스파일을 만들고 클래스를 선언하는 것은 비효율적이다.

자바는 소스 파일을 만들지 않고도 구현 객체를 만들 수 있는 방법을 제공하며 이것이 "익명 구현 객체" 이다.

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

인터페이스에 선언된 추상 메소드를 실체 메소드로 선언해야 하며, 그렇지 않으면 오류가 발생한다.

 

 

3. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

 

인터페이스의 상속 구조에서는

→ 서브 인터페이스는 슈퍼 인터페이스의 메서드까지 모두 구현해야 한다.

→ 인터페이스 레퍼런스는 인터페이스를 구현한 클래스의 인스턴스를 가리킬 수 있고,

해당 인터페이스에 선언된 메소드(슈퍼 인스턴스 메소드 포함)만 호출할 수 있다.

 

 다형성을 공부하면 자손 클래스의 인스턴스를 부모 타입의 참조 변수로 참조하는 것이 가능하다는 것을 알 수 있다.

인터페이스도 이를 구현한 클래스의 부모라 할 수 있으므로 해당 인터페이스 타입의 참조 변수로 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로 형 변환도 가능하다.



4. 인터페이스 상속

 

 자바에서 다중 상속은 불가능하지만, 인터페이스는 예외이다.

인터페이스는 다중 상속, 즉 여러 개의 인터페이스로부터 상속받는 것이 가능하다.

인터페이스는 인터페이스로부터만 상속받을 수 있다.


5. 인터페이스의 기본 메소드 (Default Method), 자바 8

 

자바 7 이전까지는 인터페이스의 메서드는 실행 블록이 없는 추상 메서드로만 선언이 가능했지만, 자바 8부터는 디폴트 메서드와 정적(static) 메서드의 선언이 가능하다. 

 

interface 인터페이스명{
	//디폴트 메서드
	default 타입 메서드명(매개변수,...){...}
	//정적 메서드
	static 타입 메서드명(매개변수){...}
}

디폴트 메서드(Default Method)

디폴트 메서드는 인터페이스에 선언되지만 사실은 객체(구현 객체)가 가지고 있는 인스턴스 메서드라 생각해야 한다. 자바 8에서 디폴트 메서드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위함이다.

 

정적 메서드(Static Method)

디폴트 메서드와는 달리 객체가 없어도 인터페이스만으로 호출이 가능하다.

인스턴스 생성과 상관없이 인터페이스 타입으로 호출하는 메소드이다.

static 예약어를 사용하고, 접근제어자는 항상 public이며 생략할 수 있다.

 

 

7. 인터페이스의 private 메소드, 자바 9

 

java9 에서는 private method와 private static method가 추가되었다.

 

java8의 default method와 static method는 여전히 불편하게 만든다.

단지 특정 기능을 처리하는 내부 method일 뿐인데도, 외부에 공개되는 public method로 만들어야 하기 때문이다.

interface를 구현하는 다른 interface 혹은 class가 해당 method에 엑세스 하거나 상속할 수 있는 것을 원하지 않아도, 

그렇게 될 수 있는 것이다.

 

java9 에서는 위와 같은 사항으로 인해 private method와 private static method라는 새로운 기능을 제공해준다.

→코드의 중복을 피하고 interface에 대한 캡슐화를 유지할 수 있게 되었다.

 

'Language > Java' 카테고리의 다른 글

자바 10주차 : 멀티쓰레드 프로그래밍  (0) 2021.03.05
자바 9주차 : 예외 처리  (0) 2021.02.14
JAVA 7주차 : 패키지  (0) 2021.02.14
JAVA 6주차 : 상속  (0) 2021.02.13
JAVA 5주차 : 클래스  (0) 2021.02.12

댓글