자바에서 추상 클래스, 인터페이스 차이를 자세히 알고 싶습니다.
사실 이와 같은 질문은 인터넷 검색으로도 충분히 나오는 내용입니다.
하지만, 대부분의 초보자들은 공감하실 거라고 생각하는데요.
답변의 내용들이 조금 추상적이라 이해하기가 어렵습니다.
공통점은 둘다 새로운 인스턴스(객체)를 생성할 수 없다.
이 정도 인것 같고,
차이점으로는,
첫 번째로, 인터페이스는 다중 상속이 되고,
추상 클래스는 다중 상속이 되지 않는다.
이거는 확실히 이해가 되었습니다.
그리고 두 번째 차이점으로는,
예전에는 추상 클래스에서는 추상 메소드 말고도 일반 메소드를 생성할 수 있고,
인터페이스는 추상 메소드 선언과 상수 정의만 가능하다는 차이로 이해를 했었는데요.
자바 8 버전이 나오면서 인터페이스에서도
default 메소드와 static 메소드를 생성할 수 있게 되면서
인터페이스에서도 구현 부분을 작성할 수 있게 되었잖아요.
그래서 제가 생각한 둘 사이의 차이점이 모호해졌습니다.
어디에서 보니 인터페이스와 추상 클래스의 차이를 목적의 차이라고 말하는데요.
추상 클래스는 공통적인 기능을 하는 객체의 추상화,
인터페이스는 관련 없는 객체들의 추상화에 사용을 한다고 하는데
이게 정확한 것인가요?
질문이 너무 길어졌네요.
결론을 말씀드리자면,
인터페이스와 추상 클래스의 차이점이 궁금합니다.
java는 잘안다루고 C/C++ 유저라.. 질문이라 답변하기가 망설여 지긴하네요,
우선 크게는 개념과 설계적으로 접근을 해야 할 것으로 보이네요.
우선 예시를 하나들겠습니다,
c++에서 현재 struct 에서도 함수를 선언할 수 있습니다.
즉 클래스와 거의 동일한 상태이지요.
하지만 작성자 분께서는 아마도 구조체와 클래스는
어느때 클래스를 쓰고, 어느때 구조체를 쓰는지에 대해서는
크게 고민하지 않고 코드를 작성하실 것으로 보입니다.
왜냐면 우리는 C -> C++ 에 과정에서부터 들어왔듯
데이터의집합은 struct,
데이터+함수는 class,
이것이 발전하여 OOP기준에서 하나의 독립적 인스턴스의 기준으로 class를 사용하죠.
왠만한 class와 struct는 현재 c++에서 치환이 가능하지만
분명 너무나 명확히 쓰는 패턴은 다릅니다.
질문하신 부분이 이것과 크게 다르지 않을것 같네요.
우선 java 8 버전에서
디폴트 함수가 추가된 이유는
인터페이스 기능 추가시에 상속받는 모든 하위 클래스들이
해당 기능을 구현해야 하는 일이 발생하죠.
코드 유지보수의 로딩이 많이 드는 일이죠. 이러한 로딩을 위하여 추가된 것으로 들었습니다.
즉, 간단한 common한 추가사항에 대해서는 인터페이스에서 default함수로 구현해서
"쓸 수도 있다"
라는 관점에서 말이죠.
다만 이것은 사용할 수 있다의 개념이지 개인적으로는
사실 이러한 추가사항들도 결국 개발의 편의를 위한것이고 사용여부는 선택적인 부분이니까요.
이러한 관점에서 일부 개발자들은 default함수 사용을 한다는 것은 설계가 잘못되었다 라고 말하기도 합니다.
(어느정도 공감합니다, 최소단위를 잘못 뽑았다고나 할까요?..)
즉, 분명 말씀하신 모호성은 존재합니다.
다만 자바에서는 쓸 수 있게 열어준 것이고 해당 기능 사용은 개발자의 선택에 달려있습니다.
현재 질문하셨던 내용처럼,
간단히 생각하면
기능적인 차이에서는 다중상속 가능여부의 차이가 있겠으나
위의 질문에서 말씀하신 것 처럼 목적에 따라 구분하여 사용하시면 될 것 같습니다.
추상 클래스는 공통적인 기능을 하는 객체의 추상화,
인터페이스는 관련 없는 객체들의 추상화에 사용을 한다고 하는데
위 부분이 어찌보면 정답같다고 생각하네요.
감사합니다.
안녕하세요.
이미 다 알고 계시는 내용 같습니다. ^^
원 목적은 말씀하신게 맞고요. Java 진영에서 인터페이스 내 default 메서드와 static 메서드에 대한 사양을 추가하는데 꽤나 고민을 했던 것으로 알고 있습니다.
최근엔 프로그래밍 언어끼리 서로 닮아가는 경향이 보이는데요. 대세(?)가 된 함수형 프로그래밍의 개념을 Java에 포함시키기 위해서, 그러면서도 하위 호환성을 깨뜨리지 않기 위해선 인터페이스 내 default 메서드, static 메서드를 사용할 수 있게 해야했던 것으로 알고 있습니다.
학교에서는 is-a 관계면 추상 클래스를, has-a 관계면 인터페이스를 쓰라고 가르치지요. 개인적으론 애매하다 싶으면 인터페이스만 쓰셔도 무방하다고 생각합니다. 성급한 추상화가 발목을 잡더라고요.
안녕하세요.
이미 검색하신것에 답이 있는 것 같습니다. 즉 둘은 목적이 완전히 다릅니다.
class와 interface의 정의의 차이가 아닐까 합니다.
class는 말 그대로 class의 body와 method가 있고, 이 중에 abstract method가 포함된 경우 또는 abstract class인 경우입니다.
class는 하나의 독립된 오브젝트라고 보시면 되구요,
interface는 method만의 집합으로 interface의 이름은 유지하되, 그 구현을 강제하기 위함입니다. 즉 소프트웨어적입 독립성과 의존성을 낮추기 위한 목적입니다.
관련 없는 객체의 추상화에 사용한다는 것은 다소 잘못된 이야기입니다. SOLID라는 설계의 규칙을 보면 I에 해당하는 것이 interface segregation principle인데요, 서로 의미적으로 관계없는 것은 모아놓지 말라는 이야기 입니다. 좀더 정확히는 클라이언트가 쓰는 인터페이스에 관계없는 것들의 의존을 시키지 말라는 이야기인데요, 관계없는 것의 추상화를 하게되면 이 principle에 위배가 됩니다.
자바가 다중 상속을 지원안하기에 인터페이스를 써서 다중 상속을 사용하고 있지만 본래의 목적이 다르니 사용 방법보다는 의미가 무엇인지에 집중하시면 될것 같습니다.
감사합니다.