반응형

목표

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

 

학습할 것

 

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

 

 

 


인터페이스 정의하는 방법

인터페이스는 어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체를 반드시 인터페이스의 메소드를 구현해야 한다.  

 

특징 

  • 인터페이스의 모든 메소드는 추상 메소드로 간주된다.
  • 인터페이스는 고용 API를 정의하기 때문에 암시적으로 public 이므로 생략하는 것이 일반적이다.
  • 필드는 앞에 public static final이 생략되어있다. 
  • 인터페이스는 인스턴스화 할 수 없으므로 생성자가 필요없다.
  • 인터페이스는 중첩될 수 있다.
  • 키워드는 interface 사용한다.
  • implements 키워드로 인터페이스를 구현할 수 있다.

Animal이라는 인터페이스를 생성하였다.

interface 키워드를 사용하였고, getType()메소드에서 에러가 발생했다. 인터페이스에서는 기본적으로 구현 로직을 만들 수 없기 때문에 에러가 발생하였다.

하지만 java8 이후부터 인터페이스에서도 유연함을 추구하기 위해서 default method와 static method가 추가되었다.

두 메소드에 대해서는 아래에서 살펴보겠다. 

인터페이스 구현하는 방법

 

강아지 클래스 생성

상속은 확장하는 의미로 사용하였다면 인터페이스는 구현하는 의미이기 때문에 implements를 사용한다.

 Animal에 선언한 getName() 메소드는 추상 메소드이기 때문에 구현체인 Dog 클래스에서는 강제로 구현해 주어야 한다.

 

AnimalFuc 이라는 새로운 inferface

다중 인터페이스를 구현할 수도 있다. 마찬가지로 강제적으로 두 개의 인터페이스의 메소드을 구현해 줘야 한다.

 

 

익명 구현 객체

구현 클래스를 만들어 사용하는 것이 일반적이지만 일회성의 구현 객체를 만들기 위해서 클래스를 생성하는 것 또한 비효율적이기 때문에 구현 객체를 만들 수 있는 방법 또한 제공하고 있다. 이것을 "익명 구현 객체"라고 한다.

 

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

다형성을 이용해서 자식 클래스 인스턴스가 부모 클래스 타입으로 참조가 가능하듯이 인터페이스에서도 해당 인터페이스 타입을 참조할 수 있다.

 

고양이 클래스 생성

 

 

결과 값

다형성을 이용해서 printName 메소드에 Animal 타입으로 파라미터를 받음으로서 Cat, Dog 객체의 이름을 출력할 수 있다.

 

인터페이스 상속

인터페이스는 다른 인터페이스를 상속 받아서 확장할 수 있다.

 

위에서 다중 인터페이스 구현에 사용되었던 AnimalFuc 인터페이스를 Animal 인터페이스가 상속 받도록 수정하였습니다.

 

Cat 클래스에서는 이제 AnimalFuc에 있는 sound() 메소드도 구현해 주어야 되기 때문에 에러가 발생합니다.

클래스에서는 불가능했던 다중 상속이 인터페이스에서는 가능합니다. (인터페이스로 부터 상속만 가능합니다. 클래스는 불가능합니다.)

하지만 상위 인터페이스에 있는 메소드 중에서 메서드 명과 파라미터 형식은 같지만 리턴 타입이 다른 메소드가 존재하다면 상속이 불가합니다. 규칙에 어긋나기 때문입니다.

 

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

인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없다고 위에서 말씀드렸습니다. 하지만 자바8에서 Default Method를 통해서 이러한 규칙을 벗어날 수 있도록 수정하였습니다.

메소드 선언시에 default를 명시하게 되면 인터페이스 내부에서 로직을 구현할 수가 있습니다.

 

접근제어자에서 사용하는 default와 같은 키워드이지만, 접근제어자는 아무것도 명시하지 않은 접근제어자를 default라 하면 인터페이스 default method는 default 키워드를 명시해줘야 합니다.

getType()이라는 메소드를 default로 선언해 줌으로써 interface 메소드 안에 구현 로직을 넣을 수 있게 되었습니다.

getType()을 사용하기 위해서는 해당 인터페이스 구현체를 인스턴스 만들어서 호출할 수 있습니다.

 

무슨 이유로 자바8에서 default method가 생긴걸까?

 

이유는 하위 호환성에 있다.

기존에 존재하던 인터페이스를 이용하여서 구현해서 사용하고 있던 클래스가 있다고 생각해 보자

인터페이스를 보완하는 과정에서 추가적으로 추상 메소드를 생성하게 된다면 구현하고 있던 클래스들은 강제로 구현해 줘야 하기 때문에 오류가 발생할 것이다. 이러한 이유로 호환성을 유지하기 위해서 default method가 생겨난 것이다.

 

 

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

인스터스 생성과 상관없이 인터페이스 타입으로 호출하는 메소드이다.

static 키워드를 사용하고, 접근제어자는 항상 public이며 생략 할 수 있다.

  

static mothod 생성

 

 

 

 

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

java8의 default method와 static method는 여전히 불편하게 만든다.

단지 특정 기능을 처리하는 내부 method일 뿐인데도 외부에 공개되는 public method로 만들어야하기 때문이다.

자바8에서 기본 메소드 사용이 가능해졌기 때문에 로직을 분리하기 위해서 사용할 수 있습니다.

 

인터페이스 private 메소드 특징

  • private 메소드 이기 때문에 인터페이스에서 구현이 되어 있어야하고, 추상 메소드일 수 없습니다.
  • 구현체에서 구현할 수 없고, 자식 인터페이스에서도 상속이 불가능 합니다.
  • static 메소드도 private 가능합니다.

 

 

참조

- www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6

 

인터페이스

목표

www.notion.so

- blog.baesangwoo.dev/posts/java-livestudy-8week/

 

[Live Study] 8주차 과제: 인터페이스

이 스터디는 백기선님께서 Github와 유튜브로 진행하시는 스터디 입니다.

blog.baesangwoo.dev

- dev-coco.tistory.com/13

 

온라인 자바 스터디 #8 - 인터페이스

목표 자바의 인터페이스에 대해 학습하세요. 학습할 것 (필수) 인터페이스 정의하는 방법 인터페이스 구현하는 방법 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 인터페이스 상속 인터

dev-coco.tistory.com

 

728x90
반응형

+ Recent posts