* 추상클래스와 인터페이스
- 설명을 예시를 들어 쉽게 해주시는 얄코님의 강의에서 추상클래스는 물려받는 혈통 가문과 같이 딱 하나만 받을 수 있는 나의 정체성이고, 인터페이스는 여러개를 받을 수있는 자격증과 같은 개념이라고 했다.
- 또한 아래 참고에 적어놓은 블로그에서는 "극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 역할이자 개념"이라고 정의하고있다.
- 즉, 어떠한 클래스들이 운전면허증, 복어조리자격증, 주조자격증 등과 같이 어떠한 동일한 목적을 가지고 동일한 기능을 수행할 수 있도록 그런 기능을 모아놓은 인터페이스를 적용하는 것이다.
* 인터페이스의 특징
- 다중상속 가능 (자격증은 100개라도 가질 수 있다..)
- 생성자 사용 불가: 인터페이스는 메서드의 명세를 정의하고 구현을 강제하기 위한 것이며, 실제 객체 생성은 인터페이스를 구현한 클래스에서 이루어진다.
* 인터페이스에 사용되는 4가지
- 상수 : 필드는 무조건 상수로 선언해야한다. final 키워드를 빼도 된다. 어차피 무조건 상수이니까!
- 클래스 메서드: 재정의가 불가능한 구현 메서드. 무조건 사용!!
- 디폴트 메서드: 재정의가 가능한 구현 메서드. 사용하던 말던 괜찮다
- 추상 메서드 : 메서드 이름만 정의되어있는 추상메서드. abstract 키워드는 빼도 된다.
* 구상 메서드가 추가된 이유
- 인터페이스 내에서 클래스, 디폴트 메서드는 자바8에서 추가된 기능이다.
- A라는 클래스를 사용하고 있는데 b라는 기능이 추가로 나왔을 때 이 b라는 기능을 추상메서드로 추가하게되면 A클래스를 사용하고 있는 곳에서는 모두 b라는 기능을 오버라이드 해주어야한다... 이런 문제를 해결할 수있다.
* static 메서드와 default 메서드의 차이
- static은 이미 구상되어있는 메서드이지만 무조건! 이대로 사용해야하고 수정할 수없다.
- default는 이미 구상되어있는 메서드이지만 불가피하게 변경을 해야할 때 재정의를 해서 사용할 수 있다.
*Observer pattern
- 옵저버패턴은 객체 간의 일대다 의존관계를 정의하는 패턴이다. 주로 한 객체(subject)의 상태가 변경될 때 이와 관련된 다른 객체들에게 자동으로 알림을 전달할 떄 사용된다.
=> 객체간의 결합도를 낮추고 유연성을 향상시킴.
- Subject: 상태를 관찰하고 관찰자들에게 알림을 보내는 주체. 관찰자인 옵저버를 등록하고 해제하는 메서드를 가지고 있어야함
- Observer: 관찰자는 Subject의 상태 변화를 감지하고 이에 따른 동작을 수행하는 객체.
- 자바에서는 java.util 패키지에 Observerble 클래스와 Observer 인터페이스가 기본적으로 제공되어 이를 사용해서 구현할 수 있다!
- Observable클래스는 deprecated되어서 java.beans 패키지의 PropertyChangeSupport를 사용하는 것을 권장한다고 한다......
- 그리고 Observable이 interface가 아닌 클래스여서 커스텀해서 사용할 수 없다는 단점도 또 있다!
-> 그래서 그냥 만들어서 사용하는게 낫지 않을까..~
* 공부하며 만들어본 팀 채팅 알람 기능!
- ChatSubject라는 subject interface는 observer를 등록하고 해제하고 알림을 실행할 수 있는 메서드를 가지고 있다.
- TeamChat 클래스는 ChatSubject를 implements한 클래스이고 주요 동작인 sendMessage() 를 추가해서 캡슐화를 했다.
- ChatObserver는 update()기능을 가지고 있는 interface이다.
- TeamMember는 ChatObserver를 implements한 클래스이다.
TeamChat 객체를 만들어서 TeamMember들을 넣어놓으면 TeamMember는 TeamChat에서 메세지가 오는지 감지할 수 있다.
메세지가 오는 것을 전달 전달받으면 각각 메세지를 전달받을 수 있다.
당연하게도 detach로 주제에서 member를 빼면 상태 변화를 감지할 수 없다.
** 참고자료 **
- 인프런 얄코 제대로 파는 자바
'자바 스터디' 카테고리의 다른 글
5주차 overriding, overloading + up/down casting (0) | 2024.04.11 |
---|---|
3주차 Annotation (1) | 2024.03.06 |
2주차 Optional (0) | 2024.03.06 |
1주차 Stream (0) | 2024.02.08 |