solgitae 2022. 7. 30. 22:00
728x90

목표

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

학습할 것

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

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

‘class’대신 ‘interface’를 사용한다는 것 외에는 클래스 작성과 동일하지만 구성요소(멤버)는 추상메서드와 상수만 가능하다.
# interface

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

1. 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
2. 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.

interface PlayingCard {
			public static final int SPADE = 4;
			final int DIAMOND = 3; //public static final int DIAMOND = 3;
			static int HEART = 2; //public static final int HEART = 2;
			int CLOVER = 1; //public static final int CLOVER = 1;
						

			public abstract String getCardNumber();
			String getCardKind(); //public abstract String getCardKind();
}

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

인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다. 다만 ‘extend’ 대신 ‘implements’를 사용한다.
# interface

1. 인터페이스에 정의된 추상메서드를 구현해야한다.

class 클래스이름 implements 인터페이스이름 {
		...
}

class Fighter implements Fightable {
			public void move(int x, int y){ /*내용 생략*/ }
			public void attack(){ /*내용 생략*/}
}

interface Fightable {
			void move(int x, int y);
			void attack(Unit u);
}

2. 상속과 구현이 동시에 가능하다.

class Fighter extends Unit implement Fightable {
public void move (int x, int y) { /*내용 생략*/}
public void attack(Unit u) { /*내용 생략*/}
}

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

해당 인터페이스(역할)를 구현하는(부여받은) 클래스를 구현체 클래스라 한다. 구현체 클래스는 모든 추상 메소드를 오버라이딩(재정의)해야 한다.
# interface

*인터페이스도 추상클래스와 비슷하게 사용이 된다. 인터페이스가 좀 더 추상적이다라는 차이점.. 
 그외에도 여러 개의 차이점이 있지만..
 그렇기 때문에 인터페이스도 내부에 추상메서드만 작성해야 한다. 
 그리고 나서 인터페이스를 implement하려는 클래스에서 구현을 해야 한다.
 그리고 인터페이스의 경우 내부 추상 메서드가 정의 되어있지 않으므로 new 키워드를 통해 인스턴스화 할 수 없으며
 이를 구현한 구현체를 사용하여 사용할 수 있다. 상속과 마찬가지로 인터페이스와 이를 구현한 구현체에서 다형성이 적용되어질 수 있기에 인터페이스 자체를 타입으로 지정할 수 있다.

ex)

interface Human {
  void say()
}

class User implements Human {
  @Override
  public void say() {
    System.out.println("Hi!")
  }
}

* 위와 같이 Human이란 인터페이스와 그에 대한 구현체가 존재할 때, 다음과 같이 생성하여 사용할 수 있다.

class App {
  public static void main(String[] args) {
    Human jongnan = new User(); // Human인터페이스타입의 레퍼런스를 가지고 Human을 구현한 User 인스턴스를 생성할 수 있다?
    jongnan.say();
  }
}

4.인터페이스 상속

인터페이스도 일반 클래스처럼 상속이 된다.
#interface

* Java에서 다중 상속은 불가능하지만 interface는 예외이기 때문에, 다중 상속을 구현할 일이 생기면
interface로 구현하면 된다.

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

# Java8, default method

1. 인터페이스에 정의했지만, 객체(구현 객체)가 가지고 있는 인스턴스 메서드라고 생각해야 한다.
2. Java8에서 디폴트 메서드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위함이다.

6.인터페이스의 static 메소드, 자바 8

# Java8, static method

1. private 접근 지시자를 반드시 사용해야 함
2. private 과 abstract 키워드를 동시에 사용할 수 없다(동시에 사용시 컴파일 에러가 발생함)

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

Java8의 default method와 static method의 불편함을 개선하기 위해 추가된 메소드
# Java9, private method

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