자바 8 interface default method 재밋네요


(ㄴㅂㄷㄱㄷㄱ) #1

트위치에서 누가 자바로 sorting 과제하는 거 보고 도와주면서
comparator pattern 좀더 파고들고 있었는데

예시:
Student 클래스가 age, score, name 등의 field 를 가지고 있고,
그 Student 클래스를 담는 컨테이너 StudentList 가 있다면,
StudentList 를 정렬하는데
sort_by_age,
sort_by_score,
sort_by_name
이렇게 제각기 다른 함수를 만들어도 되지만 코드 중복이 심하기 때문에
Collections.sort(StudentList, age_sorter)
Collections.sort(StudentList, name_sorter)

이런식으로 모듈화해서 코드 중복을 최소화 할 수 잇음.
자세한 건
java - Sort ArrayList of custom Objects by property - Stack Overflow
참조.
참고로
python 에서는 sorted(StudentList, key=lambda x:x.age) 이런식으로 key 를 넘기는 게 가능
자바 방식을 고수한다면 cmp_to_key

문득
Collection.sort( list, comparator )

List.sort( comparator )
의 차이가 궁금하더군요

그래서 찾아본결과
후자는 자바8에 추가되엇다고 하는군요

그리고 이는 자바 8 에서 interface default method 라는 기능을 지원하기 시작했기때문에 가능했다고 함니다

오잉?
내가 배우기로는 interface 자체는 함수를 정의하면 안 될텐데? 하고 궁금했는데

알고보니 이렇음니다

interface 는 일종의 규약이라서
interface 를 implement 한 클래스들은 모두
interface 에 명시되어있는 몇몇개의 함수들을 스스로 정의해야 하는데
(이것이 인터페이스의 본래 의도였구요)
나중에
‘아차!, 실수로 추가하지 못한 게 있었네!’,
혹은 ‘아, 새로운 아이디어가 떠올랐다!’ 하고
인터페이스 함수를 추가하려고 보니 그땐 이미 늦었다는 겁니다.

왜냐하면 이미 수천수만개의 클래스들이 해당 lnterface 를 implement 하고 있기 때문에
규약을 늘려버리면 그 모든 클래스들에도 함수를 추가해줘야 한다는 거죠…

그래서 그걸 우회하려고 default method 를 만들어서 피했다고 합니다…

근데 이러면…

도대체 abstract method 를 사용한 abstract class 하고
interface 하고 차이점이 뭘까요?

실제로 이게 햇갈려서


이런 질문이 나오는 듯 합니다.

한 댓글을 보면

I suppose it’s also worth pointing out that Java 8 has finally admitted that C++ was right and that multiple inheritance can be done and can have a use and so interfaces can now define not just function signatures but also provide default implementations. As such, using an interface would be preferable.

이런말도 잇네요 ㅋㅋ

하여간 언어가 발전해나가는 과정을 지켜보는건 꿀잼임니다