본문 바로가기

Java/Study

[JAVA]백기선 라이브 스터디 8주차

목표

자바의 인터페이스

학습할 것 (필수)

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

인터페이스란?

인터페이스(interface)는 

자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형이다. _by wiki

 

객체가 구현해야 할 행동을 정한 구현체이다.

 

카페에 오는 손님들을 떠올려 보면 단골 손님과 신규 손님이 있다. 이 두 손님이 공통적으로 수행하는 동작은 돈을 내고, 음료를 받는 것이다.

인터페이스는 이렇게 객체 행동의 공통점을 모아 abstract method로 설계도를 만드는 것과 같다.

(public abstract) 생략이 가능하다.

공통점을 모은 설계도가 있을 때의 장점은 어떤 손님이 와도 손님이라는 하나의 객체로 바라 볼 수 있다.

즉,  여자 손님, 남자 손님, 10대 손님, 20대 손님이 와도 돈을 내고, 음료를 받는 동작을 수행하는 사람은 손님이라 할 수 있다.

그러므로, 각 손님들의 차이점에는 전혀 신경 쓰지 않아도 된다.

손님들을 단순한 시각으로 바라 볼 수 있다.

 

객체의 책임이 작아지면, 유지 보수가 용이하다. 이는 객체 지향 프로그래밍의 궁극적인 목표이다.

코드로 인터페이스를 구현하는 것을 보면,

 

Guest 인터페이스

추상화의 개념도 위에서 설명한 것과 많이 다르지 않다. 클래스들의 공통점을 모아 일반화 한 것이다.

 

추상 클래스와 인터페이스의 공통점과 차이점

둘다 추상메서드를 구현한다는 공통점을 가지고 있다. 

단,  

추상 클래스를 상속 받을 때에는, extends  ->  상속받는다 
인터페이스를 구현 할 때에는 implements를 사용한다.  ->  구현한다.

추상 클래스의 상속은 추상 클래스의 기능을 확대, 확장 하는 의미라면, 인터페이스의 구현은 말 그대로 설계도에 따라 추상 메소드를 구현 한다는 점이다.

 

그럼 이제부터 인터페이스를 왜 쓰는지 생각해 보겠다.

 

JoinMembership 추상 클래스

Guest 인터페이스는 그냥 두고, membership에 손님은 멤버쉽에 가입한 사람과 가입하지 않은 사람으로 나뉠수 있다.

Guest가 추상클래스라 가정하고 단골 손님이 멤버쉽에 가입 했다면

 아래의 그림처럼 클래스가 다중 상속되어야 단골 손님의 객체를 잘 표현할 수 있다.

다중상속X in Java

하지만, 자바에서는 클래스 간의 복잡성 때문에 다중 상속을 허용하지 않는다. 그렇다고 멤버쉽 클래스의 특성을

손님 클래스에 넣을 순 없다. 왜냐하면, 모든 손님이 멤버쉽에 가입하는 것은 아니기 때문이다.

인터페이스는 다중 상속을 허용한다.

코드로 확인 해보면,

 

RegularGuest를 diagram으로 살펴 보면, JoinMembership객체와 Guest객체를 상속받고 있는 것을 알 수 있다.

RegularGuest의 밴다이어그램

 

(클래스, 인터페이스) 상속도 가능하고, (인터페이스, 인터페이스) 상속도 가능하다.

 

인터페이스 레퍼런스를 통해 구현체를 생성하는 법

위에서 RegularGuest는 Guest인터페이스를 통해 생성한 구현체이다.

아래의 코드를 보면, NewGuest 도 Guest 인터페이스 를 통해 생성 한 구현체이다.

 

Newbyinterface 구현

SavePoint말고 손님을 일반화한 특성을 하나 추가해보면 LoveCaffine클래스를 추가할 수 있다.

RegularGuest, NewGuest, OldGuest, YoungGuest로 나누고 각각의 클래스를 특징으로 묶어 분류할 수 있다.

 

모든 객체를 표현한 다이어그램

 

인터페이스의 기본 메소드(Default  method) , JAVA 8

 위에서 인터페이스는 설계도이자 구현체라고 정의 했었다. 그렇다면 잘 사용하고 있던 인터페이스를 추가해야만 하는 상황이라면? 인터페이스의 구현체들에 모두 가서 새로운 기능을 추가한다는 것은 매우 귀찮은 일이다.

이를 보완하기 위해 Java8 에서는 Default method가 추가 되어 인터페이스 내에서 기능을 추가할 수 있게 되었다.

 

default 메소드 추가

위에서 사용한 Guest 인터페이스에 문을 열고 들어오는 손님의 특성을 추가해야 한다면, 모든 클래스에 접근하여 openDoors()메서드를 추가해 주어야 한다.

인터페이스의 Static method, JAVA 8

Static method도 같은 맥락에서 생겼고, 

Default method와 다른점은 구현체 내부(객체)에서 재정의가 불가능 하다는 점이다.

 

static매소드 추가
static메소드X

static메소드는 객체에서 재정의 할 수 없다

인터페이스의 Private method, JAVA 9

위에서 default, static은 그 인터페이스 안에서 기능을 편하게 추가하기 위해 만든 method 이다. 그런데 이 두 메소드 다 public으로 외부에서 접근이 가능하다.  

인터페이스 내에서 특정 기능을 처리하는 메소드가 public이라면 원치않는 변경이 이뤄 질 수 있고 캡슐화가 불가능하다.

그래서 JAVA 9 에서는 Private method의 선언을 통해서 캡슐화까지 가능하게 되었다.