[자바의 정석] 인터페이스

YJS·2023년 11월 30일
0

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


인터페이스란?

일종의 추상클래스이나 추상클래스보다 추상화 정도가 높아서 오직 추상메서드와 상수만을 멤버로 가질 수 있음. (일반 메서드나 멤버변수 등 어떠한 요소도 허용되지 않음)

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

→ 모든 멤버변수는 public static final 이어야하며 생략 가능.

→모든 메서드는 public abstract 이어야하며 생략 가능.

(단, JDK1.8부터 static 메서드와 디폴트 메서드는 예외)

cf. 인터페이스의 이름

: 주로 able로 끝나는 경우가 많음

= 어떠한 기능 또는 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해. 또한 해당 인터페이스를 구현한 클래스는 ~를 할 수 있는 능력을 갖추었다는 의미.

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


인터페이스 자체로는 인스턴스 생성 불가.

추상클래스와 마찬가지로 정의된 추상메서드의 몸통을 만들어주는 클래스 작성.

extends가 아닌 implements 사용(구현한다는 의미)

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

class Fighter implements Fightable{
	public void move(int x, int y){ .....}
	public void attack(Unit u) {.....}
}

→ 인터페이스 메서드 중 일부만 구현한다면 abstract 붙여서 추상클래스로 선언.

→ 상속과 구현 동시에 가능

e.g. class Fighter extends Unit implements Fightable{}

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


⇒ 인터페이스를 이용한 다형성

인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조 가능.

인터페이스 타입으로 형변환도 가능

Fightable f = (Fightable) new Fighter();
// fightable 타입의 참조변수로는 인터페이스 fightable에 정의된 멤버들만 호출 가능.

→ 인터페이스 타입의 매개변수는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공.

class Fighter extends Unit implements Fightable {
	public void move(int x, int y)
	public void attack(Fightable f)
}
//attack 메서드 호출 시 매개변수로 fightable 인터페이스를 구현한 클래스의 인스턴스를 넘겨주어야함
//fightable을 구현한 fighter 클래스가 있을때 attack메서드의 매개변수로 fighter인스턴스 넘김
= attack(new Fighter())

Fightable method()
{
		Fighter f = new Fighter();
		return f;
}
// 메서드의 리턴타입으로 인터페이스의 타입 지정 가능.
// 리턴타입이 인터페이스 = 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스 반환

4. 인터페이스 상속


인터페이스는 인터페이스로부터만 상속 가능.

→ 클래스와 달리 다중 상속 가능. Object클래스처럼 최고 조상 없음.

interface Movable{
	void move(int x, int y);
}

interface Attackable{
	void attack(Unit u);
}

interface Fightable extends Movable, Attackable{}

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


디폴트 메서드란?

추상 메서드의 기본적인 구현을 제공하는 메서드로, 추상 메서드가 아니기 때문에 디폴트 메서드가 추가되어도 해당 인터페이스를 구현한 클래스 변경하지 않아도 됨.

→JDK1.8부터 인터페이스에 디폴트메서드와 static 메서드 추가 가능.

→ 추상메서드와 달리 일반 메서드처럼 몸통이 있어야함.

→ public 접근제어자

interface MyInterface{
	void method();
	public void newMethod(){}
}

** 새로 추가된 디폴트 메서드와 기존 메서드의 이름 중복 충돌 해결 규칙

  1. 여러 인터페이스의 디폴트 메서드간 충돌

    → 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩

  2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌

    → 조상 클래스의 메서드가 상속되고 디폴트 메서드는 무시.

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


인스턴스 생성하지 않고 사용가능한 메서드

https://www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6

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


특정 기능을 처리하는 내부 메서드의 경우 다른 인터페이스 혹은 클래스가 해당 메서드에 엑세스 하지 않도록 하기 위해 사용. (캡슐화 개념)

<private 메서드 구현 규칙>

  • private 메소드는 구현부를 가져야함
  • 오직 인터페이스 내부에서만 사용 가능
  • private static 메소드는 다른 static 또는 static이 아닌 메소드에서 사용할 수 있음
  • static이 아닌 private 메소드는 다른 private static 메소드에서 사용할 수 없음
profile
우당탕탕 개발 일기

0개의 댓글