Skip to Content
Suffering builds character

13. 인터페이스

1. 인터페이스(interface)

인터페이스는 추상 클래스보다 추상화 정도가 더 높은 추상 클래스를 말함

추상 클래스는 구현부를 갖춘 일반 메서드나 변수도 가질 수 있지만,
인터페이스는 추상메서드와 상수만을 멤버로 가질 수 있음

인터페이스 역시 다른 클래스로부터 해당 인터페이스(미완성 설계도)구현을 요구하는 목적으로 사용되며, 그 자체만으로는 거의 사용되진 않음

2. 인터페이스 작성 방식

클래스를 작성할 때는 키워드로 class를 사용했음 인터페이스를 작성할 때는 키워드로 class 대신 interface 를 사용

인터페이스
interface 인터페이스명 { public static final 타입 상수이름 = 값; public abstract 메서드명(매개변수 목록); }

2-1. 인터페이스의 작성 규칙

  1. 모든 멤버 상수는 public static final로 지정해야 하며, 생략하면 컴파일러가 자동으로 추가해줌
  2. 모든 메서드는 public abstract 이어야 하며, 이 역시 생략 가능
PlayingCard.java
interface PlayingCard { public static final int SPADE = 4; final int DIAMOND = 3; static int HEART = 2; int CLOVER = 1; public abstract String getCardNumber(); String getCardKind(); }

3. 인터페이스의 구현, implements interface

→ 해당 인터페이스를 실제로 구현할 구현 클래스를 작성한다는 의미

인터페이스 역시 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없음

추상 클래스가 자신의 멤버로써 선언부만 정의한 메서드를 상속 받은 클래스에서 완성시키는 것처럼,

인터페이스 역시 자신에게 정의되어 있는 추상 메서드의 구현을 담당할 클래스를 작성함으로써 인터페이스의 기능을 수행할 수 있게 됨

단지, 클래스는 상속받을 때 클래스를 확장한다는 의미의 extends라는 키워드를 사용했지만,

해당 인터페이스를 실제 구현(메서드 완성 등)할 구현 클래스(implementation)는 extends 대신 해당 인터페이스를 구현한다는 의미implements 를 사용

인터페이스 구현 규칙
class 클래스명 implements 인터페이스명 { //구현한 인터페이스에 정의되어 있는 추상 메서드를 구현해야함 } // 예시 abstract class Shark implements Fightable { public void move(int x, int y){ ... } public void attack(Unit target) { ... } }

만약 구현하려는 인터페이스의 메서드들(move(), attack() 총 2개) 중 일부만(move()) 구현하려고 할 경우에는 class Shark의 앞에 abstract 키워드를 사용함으로써 추상 클래스로 선언해야 함

→ 클래스에 추상 메서드(인터페이스를 통해 구현해야 하는 메서드)가 하나라도 있으면 그 클래스는 추상 클래스로 선언해야 하기 때문

다음처럼 상속과 구현을 동시에 할 수도 있음

Shark.java
class Shark extends Animal implements Fightable { public void move(int x, int y){ ... } public void attack(Unit target) { ... } }

4. 인터페이스 네이밍 컨벤션

인터페이스의 이름은 주로 ~을 할 수 있는을 의미하는 ~able로 끝나는 것이 많은 편

→ 어떠한 기능을 하는데 필요한 메서드를 제공해준다는 의미를 부각시키기 위함

마찬가지로 그 인터페이스를 구현한 클래스 역시 ‘~를 할 수 있는’ 능력을 갖추었다는 의미가 되기도 하기 때문

모든 인터페이스의 이름이 반드시 ~able로 끝나야 하는 것은 아님

Last updated on