인터페이스 정의, 구현하기 , default 메서드, private & static 메서드
객체를 사용한다는 의미
객체를 사용 = 메서드 호출
클래스 -호출-> 다른 클래스.메서드()
클래스 -호출-> 인스턴스.메서드()
객체 사용을 통일한다 = 메서드 호출을 통일한다
객체는 문맥에 따라 해석해야한다
메서드, 인스턴스, 등등
객체지향이란 결국엔 클래스단위로 명령을 쪼개고 메서드를 호출하면서 코드를 짜는 것
인터페이스 정의하기, 구현하기
인터페이스 정의 규칙
규칙1) 인터페이스에 선언되는 모든 메서드는 public 이다.
- 인터페이스에 정의하는 메서드는 호출 규칙이다.
- 규칙은 공개되어야 한다.
규칙2) 인터페이스에 선언되는 모든 메서드는 추상 메서드로 선언한다.
- 인터페이스에 선언하는 메서드는 호출 규칙을 정의한 것이다.
- 규칙은 클래스가 따라야 한다.
- 그래서 인터페이스에 선언되는 모든 메서드는 몸체를 구현하지 않는다.
인터페이스 구현
public 보다 접근 범위를 좁힐 수는 없다.
인터페이스의 모든 메서드를 구현해야 한다.
한 개라도 빠뜨린다면 concrete 클래스가 될 수 없다.
인터페이스의 일부만 구현한다면 구현하지 않은 인터페이스의 다른 메서드는 추상메서드로 남아있다.
때문에, 인터페이스의 일부 메서드만 구현한 클래스는 추상 클래스로 선언해야 한다.
인터페이스 필드 선언
인터페이스 필드는 public static final 이다.
- 인스턴스를 생성할 수 없기 때문에 인스턴스 필드를 선언할 수 없다.
- 규칙이기 때문에 무조건 public 이다.
- 인스턴스 필드가 아니기 때문에 값을 변경할 수 없다.
public, static, final 을 생략할 수 있다.
인터페이스 default 메서드
인터페이스 메서드는 바디를 가질수없으나
default메서드는 바디를 가질 수 있다.
default method:
- 기존 프로젝트에 영향을 끼치지 않으면서 기존 규칙에 새 메서드를 추가할 때 유용한다.
- 인터페이스에서 미리 구현한 메서드이기 때문에 클래스에서 구현을 생략할 수 있다.
- 반대로 구현을 강제할 수 없다는 것이 단점이다.
어차피 새 메서드는 새 프로젝트의 구현체가 오버라이딩 할 것이니 default 메서드 안에서는 자세하게 정의하지 않는다.
다만 이 인터페이스를 구현한 예전 프로젝트에 영향을 끼치지 않으면서 새 메서드를 정의할 때 사용하는 문법이다.
인터페이스 private 메서드
인터페이스 내부에서 사용할 메서드라면 private 접근 범위를 갖는 구현 메서드를 정의할 수 있다.
인터페이스 static 메서드
인터페이스도 클래스처럼 static 메서드를 정의할 수 있다
접근 범위는 기본이 public 이다. 다른 접근 범위를 가질 수 없다. public은 생략이 가능하다.
다음 메서드는 public 이 생락된것이지, package-private 접근 범위가 아니다
interface MyInterface5 {
// 인터페이스도 클래스처럼 static 메서드를 정의할 수 있다.
static void m1() {
System.out.println("MyInterface5.m1()");
}
}