인터페이스는 약속된 행위를 하도록 정의 한 후 실제 내부를 어떻게 구현할지는 각 Implements 에 따라 따로따로 만들 수 있게 하는 것이 인터페이스이다.
실제 다형성을 구현할 때 인터페이스를 많이 사용하게 된다.
Implements 가 많아서 그것을 인터페이스 하나로 정의하여 사용하고 싶거나, 해당 소스코드가 라이브러리가 되어 외부사람한테 제공할 때 유용하게 쓰일 수 있다.
(* 다형성 : 실제 오브젝트의 형태는 하나인데, 거기서 함수를 호출했을때 각 구현에 따라 그 행태가 달라지는 것 )
단점은 코드가 읽기 어려워지고, 디버깅이 어렵다.
비지니스 요구가 계속 바뀌는 업종일 경우 인터페이스를 무작위로 추가하게되면 Implements 와 인터페이스 두 개다 계속해서 바꿔야 하는 상황이 와서 불편하다. 특히나 인터페이스와 Implements의 관계가 1 to 1 일 땐 더 더욱 불편하다.
인터페이스에 대한 설계가 완벽하지 않아서 다른 Implements 를 추가할 때 기존 Implements 와 맞지 않은 상황도 여럿 발생할 수 있다.
오히려 개발코드 수정과 프로그램 유지보수성이 떨어질 수 있다.
일단 Implements 로 구현 후에 인터페이스가 필요할 때 추가하는 것도 방법.
비지니스 요구가 계속해서 바뀌는 업종이라면 계속해서 소스코드가 바뀔 가능성이 높은데, 그럴려면 읽기 쉽고 디버깅 쉬운게 최고이다.
정말 필요할 때만 적용하고 그게 아니라면 단순하게 가는것이 옳은 선택이 될 수 있다.
Java8 & Interface
Java8 이전까지는 Interfcae 에서 상수(public static final) 와 추상 메서드 (public abstract) 만 선언이 가능했지만,
이 후 부터는 default , static method 도 선언할 수 있게 추가되었다.
이를 통하여 interface 에서 메소드 구현이 가능하다.
default method
- interface에서도 메소드 구현이 가능하다.
- 참조 변수로 함수를 호출할 수 있다.
EX : gil.defaultmethod(); - implements한 Class에서 재정의가 가능하다.
static method
- interface에서 메소드 구현이 가능하다.
- 반드시 클래스 명으로 메소드를 호출해야 한다.
EX : Gillog.staticmethod(); - 재정의가 불가능하다.
오버라이드 자체가 상위 클래스에 정의된 동일한 메서드에 대해 다른 동작을 하위 클래스에서 재정의 할때 사용되는 건데 static 메서드는 클래스의 인스턴스와 연결되지 않으므로 개념을 적용할 수 없어 재정의가 불가능하다.
추가적으로 자바9 부터는 private method 도 정의할 수 있도록 지원하고 있다.
Script
인터페이스는 약속된 행위를 하도록 정의한 후 실제 내부를 어떻게 구현할지는 각 Implements 에 따라 따로따로 만들 수 있게 하는 것이 인터페이스이다.
주로, 다형성을 구현할 때 인터페이스를 많이 사용하며, Implements 들이 많아서 이것을 하나의 규격으로 정의하고 싶을때, 해당 소스코드가 라이브러리가 되어 외부인에게 제공할 때 유용하게 쓰일 수 있다.
(다형성 : 실제 오브젝트 형태는 하나인데, 함수를 호출 했을때 각 구현에 따라 그 행태가 달라지는것.)
단점은 코드가 읽기 어려워지고, 디버깅이 어려워질 수 있다. 소스코드를 개발할때 그 구현부까지도 봐야하는 상황들이 종종 있는데 추적을 하려하면 인터페이스 파일을 열어준다거나, 비지니스 요구가 계속해서 바뀌는 업종 혹은 인터페이스 설계가 제대로 되지 않은 경우에는 인터페이스와 그 구현부 모두를 계속해서 수정해야하는 불편함이 있을 수 있다.
Java8 이전에는 상수의 변수, 추상화 메서드만 정의할 수 있도록 하였다면 이후부터는 default 와 static method 도 정의할수 있도록 지원하며, 구현부까지 작성이 가능해져 인터페이스에서 메서드를 구현하고 impletments 에서 사용할 수 있도록 기능이 추가되었다.
추가적으로 Java9 부터는 private 선언도 가능해졌다.
'프로그래밍 > Java' 카테고리의 다른 글
JVM 구조 (0) | 2022.04.30 |
---|---|
JDK, JRE, JVM 이해하기 (0) | 2022.04.29 |
Java 8 Funtional 스터디 (0) | 2021.09.23 |
Inner class 정리 (1) | 2021.09.10 |
StringBuilder (0) | 2021.08.21 |