모던 자바 인 액션의 default method 부분을 읽던 중에 호환성이란 단어를 지나치게 되었습니다.
그러다 문득 제가 생각하는 호환성과 프로그램에서 이야기하는 호환성이 맞나? 하는 의문을 가지고 있을 때 책에서 호환성에 대해 한번 더 상세하게 설명을 해 놓았더군요. 그래서 이를 글로 작성을 해 보려고 합니다.
default method
default method는 자바 8에서 처음 나타난 기능으로 List 인터페이스에 sort() 기능이 추가되면서 입니다.
내부를 보시면 아래와 같이 default 메서드를 사용해서 기존에 List 인터페이스를 상속한 모든 클래스를 사용자들이 수정하지 않을 수 있도록 default 메서드 기능을 사용했습니다.
인터페이스에 static 메서드를 추가하지 않고 왜 default 메서드를 사용했을까요?? 기존에 있던 List 인터페이스를 상속받은 클래스들과 호환
이 되지 않기 때문입니다.
호환성
코드를 먼저 소개하고 각 호환성에 해당하는 경우를 아래에서 설명하도록 하겠습니다.
Interface
public interface TestInterface {
boolean test(String str);
}
Class
public class TestCompatibility implements TestInterface{
@Override
public boolean test(String str) {
return false;
}
}
바이너리 호환성
뭔가를 바꾼 이후에도 에러 없이 기존 바이너리가 실행 될 수 있는 상황을 바이너리 호환성이라고 합니다.(바이너리 실행에는 인증, 준비, 해석등의 과정이 포함된다.) 예를 들어 인터페이스에 메서드를 추가했을 대 추가된 메서드를 호출하지 않는 한 문제가 일어나지 않는데 이를 바이너리 호환성이라고 합니다.
위의 Interface
에 test2() 메서드를 추가하고 TestCompatibility class에는 아무런 조치를 취하지 않도록 하겠습니다.
public interface TestInterface {
boolean test(String str);
boolean test2(String str2);
}
그 후 TestCompatibility class를 호출해 보면 아래와 같이 구현하지 않은 test2() 메서드가 보이는 것을 알 수 있습니다.
(실제 실행하면 빌드 과정에서 에러가 나긴 합니다만 책의 내용을 참고했을 때 IDE 혹은 같은 패키지 내에서 실행했기에 빌드 과정에서 잡히지 않았나 합니다.)
결국 바이너리 호환성 이란 위와 같이 TestCompatibility class에서 실제 구현하지 않은 test2()를 호출하지만 않는다면 문제가 없는 경우를 말하는 듯 합니다.
소스 호환성
코드를 고쳐도 기존 프로그램을 성공적으로 재컴파일 할 수 있음을 의미합니다. 예를 들어 인터페이스에 메서드를 추가하면 소스 호환성이 아닙니다. 추가한 메스드를 구현하도록 클래스를 고쳐야 하기 때문입니다.
public interface TestInterface {
boolean test(String str);
}
위의 부분은 Interface 의 코드를 수정해야하는건지 아니면 Class 의 코드를 수정해야하는건지 잘 모르겠군요. 우선 느낌상 제공자(Interface)에서 최신 버전으로 변경(소스 변경 등)이 일어나도 사용자(Class) 입장에서 아무런 코드 수정 없이 받을 수 있는 것을 의미하는 듯 합니다.
동작 호환성
코드를 바꾼 다음에도 같은 입력값이 주어지면 같은 프로그램이 같은 동작을 실행한다는 의미입니다. 예를 들어 인터페이스에 메서드를 추가하더라도 프로그램에서 추가된 메서드를 호출할 일은 없으므로(혹은 우연히 구현 클래스가 이를 오버라이드 했을 수도 있습니다.) 동작 호환성은 유지됩니다.
동작 호환성 같은 경우 후반부의 설명은 바이너리 호환성과 비슷합니다.
이렇게 세가지 호환성에 대해서 정리해 보았습니다.
긴 글 읽어주셔서 감사합니다. 즐코!!
'Languages > java' 카테고리의 다른 글
[java] SpringBoot 사용 시 field에 변수 선언 관련 문제 (0) | 2022.11.29 |
---|---|
[java] Function을 활용하여 If문 제거하기 (2) | 2022.11.09 |
[Junit] private Method 테스트하기2(Exception 검증) (4) | 2022.09.23 |
[JUnit] private Method 테스트하기! (0) | 2022.09.07 |
[Java] 함수형 인터페이스(Functional Interface) 알아보기 (0) | 2022.08.04 |