목표
자바의 인터페이스
학습할 것 (필수)
- 인터페이스 정의하는 방법
- 인터페이스 구현하는 방법
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
- 인터페이스 상속
- 인터페이스의 기본 메소드 (Default Method), 자바 8
- 인터페이스의 static 메소드, 자바 8
- 인터페이스의 private 메소드, 자바 9
인터페이스란?
인터페이스(interface)는
자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형이다. _by wiki
객체가 구현해야 할 행동을 정한 구현체이다.
카페에 오는 손님들을 떠올려 보면 단골 손님과 신규 손님이 있다. 이 두 손님이 공통적으로 수행하는 동작은 돈을 내고, 음료를 받는 것이다.
인터페이스는 이렇게 객체 행동의 공통점을 모아 abstract method로 설계도를 만드는 것과 같다.
(public abstract) 생략이 가능하다.
공통점을 모은 설계도가 있을 때의 장점은 어떤 손님이 와도 손님이라는 하나의 객체로 바라 볼 수 있다.
즉, 여자 손님, 남자 손님, 10대 손님, 20대 손님이 와도 돈을 내고, 음료를 받는 동작을 수행하는 사람은 손님이라 할 수 있다.
그러므로, 각 손님들의 차이점에는 전혀 신경 쓰지 않아도 된다.
손님들을 단순한 시각으로 바라 볼 수 있다.
객체의 책임이 작아지면, 유지 보수가 용이하다. 이는 객체 지향 프로그래밍의 궁극적인 목표이다.
코드로 인터페이스를 구현하는 것을 보면,
추상화의 개념도 위에서 설명한 것과 많이 다르지 않다. 클래스들의 공통점을 모아 일반화 한 것이다.
추상 클래스와 인터페이스의 공통점과 차이점
둘다 추상메서드를 구현한다는 공통점을 가지고 있다.
단,
추상 클래스를 상속 받을 때에는, extends -> 상속받는다
인터페이스를 구현 할 때에는 implements를 사용한다. -> 구현한다.
추상 클래스의 상속은 추상 클래스의 기능을 확대, 확장 하는 의미라면, 인터페이스의 구현은 말 그대로 설계도에 따라 추상 메소드를 구현 한다는 점이다.
그럼 이제부터 인터페이스를 왜 쓰는지 생각해 보겠다.
Guest 인터페이스는 그냥 두고, membership에 손님은 멤버쉽에 가입한 사람과 가입하지 않은 사람으로 나뉠수 있다.
Guest가 추상클래스라 가정하고 단골 손님이 멤버쉽에 가입 했다면
아래의 그림처럼 클래스가 다중 상속되어야 단골 손님의 객체를 잘 표현할 수 있다.
하지만, 자바에서는 클래스 간의 복잡성 때문에 다중 상속을 허용하지 않는다. 그렇다고 멤버쉽 클래스의 특성을
손님 클래스에 넣을 순 없다. 왜냐하면, 모든 손님이 멤버쉽에 가입하는 것은 아니기 때문이다.
인터페이스는 다중 상속을 허용한다.
코드로 확인 해보면,
RegularGuest를 diagram으로 살펴 보면, JoinMembership객체와 Guest객체를 상속받고 있는 것을 알 수 있다.
(클래스, 인터페이스) 상속도 가능하고, (인터페이스, 인터페이스) 상속도 가능하다.
인터페이스 레퍼런스를 통해 구현체를 생성하는 법
위에서 RegularGuest는 Guest인터페이스를 통해 생성한 구현체이다.
아래의 코드를 보면, NewGuest 도 Guest 인터페이스 를 통해 생성 한 구현체이다.
SavePoint말고 손님을 일반화한 특성을 하나 추가해보면 LoveCaffine클래스를 추가할 수 있다.
RegularGuest, NewGuest, OldGuest, YoungGuest로 나누고 각각의 클래스를 특징으로 묶어 분류할 수 있다.
인터페이스의 기본 메소드(Default method) , JAVA 8
위에서 인터페이스는 설계도이자 구현체라고 정의 했었다. 그렇다면 잘 사용하고 있던 인터페이스를 추가해야만 하는 상황이라면? 인터페이스의 구현체들에 모두 가서 새로운 기능을 추가한다는 것은 매우 귀찮은 일이다.
이를 보완하기 위해 Java8 에서는 Default method가 추가 되어 인터페이스 내에서 기능을 추가할 수 있게 되었다.
위에서 사용한 Guest 인터페이스에 문을 열고 들어오는 손님의 특성을 추가해야 한다면, 모든 클래스에 접근하여 openDoors()메서드를 추가해 주어야 한다.
인터페이스의 Static method, JAVA 8
Static method도 같은 맥락에서 생겼고,
Default method와 다른점은 구현체 내부(객체)에서 재정의가 불가능 하다는 점이다.
static메소드는 객체에서 재정의 할 수 없다
인터페이스의 Private method, JAVA 9
위에서 default, static은 그 인터페이스 안에서 기능을 편하게 추가하기 위해 만든 method 이다. 그런데 이 두 메소드 다 public으로 외부에서 접근이 가능하다.
인터페이스 내에서 특정 기능을 처리하는 메소드가 public이라면 원치않는 변경이 이뤄 질 수 있고 캡슐화가 불가능하다.
그래서 JAVA 9 에서는 Private method의 선언을 통해서 캡슐화까지 가능하게 되었다.
'Java > Study' 카테고리의 다른 글
[JAVA]백기선 라이브 스터디 10주차 - Thread (0) | 2021.01.21 |
---|---|
[JAVA] 백기선 라이브 스터디 9주차 예외처리 (0) | 2021.01.13 |
[Java]백기선 라이브 스터디 7주차 (0) | 2021.01.02 |
[Java] 백기선 라이브 스터디 6주차 과제 (0) | 2020.12.26 |
[JAVA]백기선 자바 스터디 5주차 과제 (0) | 2020.12.19 |