소감
- 제목만 봐도 배가 부른 느낌이다라고 육성으로 소리내서 말했다.
추상 메서드 복습
- 선언만 있고 구현은 없는 메서드를 추상 메서드라고 한다.
- abstract 키워드 사용
abstract void foo();
인터페이스
- 클래스가 블루프린트라면 추상클래스는 미완성 설계도이다. 하나 이상의 추상 메서드를 포함하면 추상클래스가 된다.
- (스펙) 인터페이스는 자바의 참조 타입 중 하나로, 인스턴스 변수가 없고 보통 하나 이상의 추상 메소드를 포함한다.
- 추상클래스보다 추상화의 정도가 높다고 말하면 괜찮을까? 자바 8이후로 명확하게 인터페이스는 이것이다라고 정의하기가 어려워졌다.
인터페이스의 선언
스펙
InterfaceDeclaration:
NormalInterfaceDeclaration
AnnotationTypeDeclaration
NormalInterfaceDeclaration:
{InterfaceModifier} interface Identifier [TypeParameters] [ExtendsInterfaces] InterfaceBody
- 기본적으로 인터페이스는 두가지 방식으로 선언할 수 있다. 일반 인터페이스 선언과 어노테이션 타입 선언이다.
- 자세한 건 어노테이션 공부를 더 해야할 듯.
- (내돈 내산 리뷰) 인프런 기선님 더 자바 코드조작의 어노테이션 강의가 짱 좋았다. 책에서 볼 때는 "그래서 어쩌라고?" 느낌이었는데 강의 내용을 보니 "아하! 이거구나!" 이런 느낌. 잘 와 닿았다.
일반 선언
inteface Hello {
public static final StringCAPTAIN = "whiteship";
public abstract void sayHello();
}
- 모든 멤버변수는 public static final이어야 하며 제어자 생략 가능
- 모든 메소드는 public abstract여야 하며 역시 제어자 생략 가능
인터페이스의 상속
- (몰랐던 사실) 인터페이스도 상속 가능하다. 클래스와 달리 다중상속 가능!
interface Talk extends Hello, Goodbye {
}
인터페이스의 구현
- implements 키워드 사용
- 추상 메소드를 구현한다.
- 상속과 동시에 구현도 가능
class Jombie extends Monster implements Walk, Attak {
@Override
public void walk() {
this.x += getXSpeed(this.speed);
}
}
인터페이스의 참조를 통해 구현체 사용
- 이건 뭘까요? 정확하게 몰라서 스터디 때 잘 들어야겠다.
- 아래 같은 코드를 말하는 게 아닐까 싶다.
Hello honux = new Hello() {
@Override
public void sayHi() {
System.out.println("Hello " + CAPTAIN + ". I am honux");
}
};
honux.sayHi();
인터페이스의 기본 메소드 (Default Method), 자바 8
- 어느 순간 인터페이스에 몸통이 들어갈 수 있게 되었구나라고 생각했는데, 자바 8부터였다.
- default 메소드도 재정의 가능하다.
default void pooh() {
System.out.println("Think, think, ... I am pooh the bear... Am I?");
}
인터페이스의 static 메소드, 자바 8
- 역시 자바 8에서 스태틱 메소드가 생겼다.
- 스태틱 메소드도 바디가 필요하다.
static void foo() {
System.out.println("foo bar");
}
- [주의] 인터페이스의 스태틱 메소드는 상속이 되지 않는다.
Hello.foo()
honux.foo()
인터페이스의 private 메소드, 자바 9
- 이게 되는구나! 자바9 처음 나왔을 때 응 되는구나 하고 지나갔던 기억이 난다.
- 메소드 분리에 사용될 수 있다.
private static
도 된다.
private void doh() {
System.out.println("Doh!");
}
private static void re() {
System.out.println("Re!");
}
참고문헌
호눅스 velog 놀러왔어요☺ 인터페이스에서도 default를 통해 구현체를 가질 수 있어서 추상 클래스와의 차이점이 뭘까 했는데 인터페이스가 추상화의 정도가 더 높다(?)고 이해할 수 있군요🤔 다중상속이 가능한 것도 차이점이 될 수 있겠네요ㅎㅎ