※ 주의: 뇌피셜 적당량 함유
삐슝빠슝
java 에서 interface에 대해 간단히 정리해보자면...
1. 선언되는 멤버 변수는 모두 상수, public static final 이 생략된 형태로 선언된다.
2. 선언되는 메소드는 모두 추상, public abstract 가 생략된 형태로 선언된다.
근데... 놀랍게도 JDK1.8 부터는 추상이 아닌 메소드를 작성할 수 있게 된다...
그 역사에 대해 간단히 말하자면...
원래 있던 수 많은 라이브러리 중, 기존 interface에 "어 하나만 추가할까..." 하면 와르르멘션이 된다.
왜냐면 그 interface를 구현하던 수 많은 클래스들이 그 추가한 하나의 추상 메소드를 정의해줄 의무를 갖게 되면서 다 빨간줄이 그일 것이기 때문...
그래서 대안으로, "아예 interface에서 구현까지 해버리면 어떨까..." 라는 아이디어가 나왔다고 한다. (강사님 피셜...)
각설하고, 두 가지가 있다.
(1) default method
default [타입] method ([타입] [매개변수명]) {
[몸통];
}
이런 식으로 구현을 할 수 있다.
default라고 해서 범위가 default 인게 아니라, public이다.
default method 라는 뜻인듯.
(1-1) 하지만 엄청난 문제가 발생한다...
그 동안 interface가 다중 상속에 대한 책임이 면제됐던 이유는...
- interface는 어차피 메소드를 완성하지 않으니까, 게다가 구현하는 클래스가 정의해주면 되니까! 그러니까 충돌의 여지가 없으니까.
하지만? interface가 default로 인해 메소드를 구현하게 되는 순간... 충돌이 발생할 가능성이 생겨버리는 것이다.
더 이해하기 쉽게 예를 들자면,
Parent라는 클래스가 하위 클래스로 Child 클래스를 갖는다 할 때...
Child가 또 인터페이스인 Study를 구현한다고 할 때...
또 Parent는 멤버 메소드로 study()를 가지고 있으며, 인터페이스 Study 또한 메소드 study()를 default로 구현하고 있다고 할 때.......... !!!!!!!!!! 충돌이 발생할 것을 에상할 수 있다.
어쩔건가??
- 답: super 클래스 승!
- 그냥 클래스가 이긴다고 생각하자. 즉, Child 에서 study()를 호출하면, Parent 클래스의 그것이 호출된다.
(2) static method
일반 static 메소드와 마찬가지로, 별도의 객체를 생성할 필요 없이 호출이 가능한 메소드이다. (할 수도 없나 무튼)
얘는 재정의 자체가 불가능하다. 그냥 static으로 선언된 interface가 있으면, 이를 구현하는 클래스는 그 메소드를 오버라이드할 수 없다.
그러면 어케 쓰냐? 직접 호출해야 한다. 이를테면 Interface.static_method(); 이런식이다.
그러니까... 충돌할 수도 없다고 봐야겠지??
쓰다보니 뇌피셜이 더 다량 함유되게 된 것 같아서...
나중에 더 제대로 배우게 된다면 수정하러 오겠다....
근데 아마 전반적인 컨셉이나 흐름은 참고해도 문제 없지 않을까.... 싶다.
'코딩 > Java' 카테고리의 다른 글
Java - JVM 구조와 메모리 영역 (Method, Heap, Stack) (0) | 2023.06.11 |
---|---|
Java - Static에 대하여... (0) | 2023.06.11 |
Java Singleton Pattern(싱글톤 패턴) (0) | 2022.01.26 |
java - 왜 인터페이스? (0) | 2022.01.26 |
java - 다형성에 대한 이해 (0) | 2022.01.23 |