오늘 수업시간에는 인터페이스에 대해서 다루었습니다. 인상 깊었던 내용, 그리고 기억해둘 내용 중점으로 정리하겠습니다.
인터페이스가 뭘까요? 사전적 의미로 아래와 같은 뜻이 있습니다.
서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어 주는 부분. 또는 그런 접속 장치.
실생활에서 찾아볼 수 있는 흔한 예로 콘센트가 있는데요. 콘센트는 서로 각기 다른 것(전기와 전자기기) 사이에서 연결하게 해주죠. 또 자바에서도 찾아볼 수 있는데요. Connection.java
라는 클래스입니다. 이 클래스는 DB와 프로그램 사이에서 서로를 연결해주는 역할을 합니다. 왜냐하면 수많은 DB의 종류가 있고 수많은 프로그램이 있는데 이 각기 다른 연결을 따로따로 Custom화하면 너무나 많은 비용이 들기 때문입니다. 즉, 이 사이에서 표준을 정하고 서로 다른 성격의 것을 이에 맞추는 역할을 합니다.
아래부터는 문답 형식으로 정리하겠습니다.
인터페이스에서 default값은 public이다?
- 기본적으로 인터페이스는 구현된 부분은 따로 알 필요없이 쉽게 사용할 수 있도록 설계된 것입니다. 따라서 외부에서 쓸 수 있도록 public이 default값이고 이외 다른 접근제어자를 사용하면 오류가 발생합니다.
- 인터페이스를 사용하는 주된 이유는 이와 같이 어떤 메서드가 있는지 명세만 제공하기 위함이고 보안면에서도 안전하기 때문입니다.1
클래스 내 구현되지 않은 메서드만 있으면 추상 클래스가 아니라 인터페이스이다?
- 인터페이스와 추상 클래스의 큰 차이 중 하나는 추상 클래스는 구현된 부분이 있을 수 있다는 점입니다. 추상 클래스임에도 불구하고 추상 메서드만 있다면 이는 차라리 인터페이스로 만드는 것이 명확합니다.
인터페이스에서 인스턴스 변수 쓸 수 있을까?
- 최근 버전에서는 인터페이스에서 인스턴스 변수를 사용할 수 있습니다.
- 하지만 기본적으로 인터페이스는 상태를 정의하기 위한 목적이 아닌 행위만을 정의하기 위한 목적으로 사용됩니다.
- 따라서 자식 클래스에서 중복되는 값이 있다면 인터페이스에서 처리하는 것이 아니라 그 경우엔 추상클래스에서 처리하는 것이 바람직합니다.
인터페이스를 사용하다보면 자식클래스에서 중복되는 부분이 많이 발생할 수 있습니다. 이 경우 위와 같은 구조로 사용할 수 있습니다. 추상 클래스에서는 자식 클래스에서 중복되었던 부분에 대해 정의를 해두고 그 외에 공통된 행위는 모두 인터페이스에서 정의할 수 있습니다.
위 구조에서 알아두면 좋은 것
자식 클래스에서 추상 클래스로 값을 넘기고 싶다면 생성자를 이용해서 넘길 수 있습니다. 만약
List<Point> points
형태가 있다면super(points)
형태로 넘길 수 있는 것이죠.만약 이렇게 부모 클래스로
points
를 넘겼다면points
관련 중복 로직들이 또 부모 클래스에서 처리할 수 있는 것이 없는지 살펴보고 최대한 자식 클래스에서 중복 로직을 없애는 것이 좋습니다.인터페이스에서 반환값은
ArrayList
와 같은 구현체가 아닌List
와 같은 인터페이스 타입으로 설정하는 것이 좋습니다. 만약ArrayList
로 한정하였다가 이후에LinkedList
로 바꿔야할 상황이 발생한다면 이 인터페이스를 사용한 모든 부분에서 변경해야 하기 때문입니다.추상 클래스와 인터페이스 이름을 지을 때엔 보통 추상 클래스의 경우
이름(기능) + Abstract
, 인터페이스는이름(기능)
을 주로 쓴다고 합니다. 예전엔 인터페이스 앞에 I를 써서 인터페이스임을 명시했는데 요즘엔 그렇게 안쓴다고 하네요.만약 부모 클래스에서 자식 클래스에서 정의되어 있는 값이 필요하다면
abstract
메서드를 부모 클래스에서 정의하고 자식 클래스에선 Override하여 그 값을 넘겨줄 수 있습니다. 예를들어 부모 클래스에서size()
라는 메서드를 써야한다면 자식 클래스에서 이렇게 사용해 넣길 수 있는 것이죠.@Override int size() { return points.size(); }
'Language > Java' 카테고리의 다른 글
제네릭(Generic) (0) | 2018.11.23 |
---|---|
예외처리 (0) | 2018.10.25 |
enum (2) | 2018.10.22 |
상속(Inheritance) (3) | 2018.10.11 |
DTO와 Java Bean (2) | 2018.10.01 |