웹풀스택 공부 중
15 - 5. Java - Abstract Class vs Interface 본문
Abstract Class vs Interface
Abstract Class
예시
@Slf4j public abstract class KafkaAbstractListener<T> implements KafkaListener<T> { @PostConstruct public void instantiated() { log.info("[Abstract Class] {} is created", this.getType().name()); } @PreDestroy abstract void destroy(); }
더 쉬운 예시
abstract class MakingRamen implements RamenProcess { public void boiling() { System.out.println("- 라면을 함께 만들어볼까요?"); System.out.printf("1. 첫째로, 물은 %S 을/를 넣을게요.%n", water()); System.out.printf("2. 둘째로, 스프는 %S 을/를 넣을게요. 면보다 스프먼저!%n", soup()); System.out.printf("3. 마지막으로는, 면은 %S 을/를 투척할게요.%n", noodle()); System.out.println("- 자, 다 만들었습니다. 맛있게 드세요."); } } // using Extends class MakingSinRamen extends MakingRamen { public String water() { return "수돗물"; } public String soup() { return "신라면 스프"; } public String noodle() { return "건면"; } } class MakingJinRamen extends MakingRamen { public String water() { return "정수물"; } public String soup() { return "진라면 스프"; } public String noodle() { return "생면"; } } // using them MakingRamen letsMakingSinRamen = new MakingSinRamen(); letsMakingSinRamen.boiling(); MakingRamen letsMakingJinRamen = new MakingJinRamen(); letsMakingJinRamen.boiling();
Interface
예제
public interface KafkaListener<T> { KakfaListnerType getType(); void consume(T consumed); }
더 쉬운 예제
public interface JpaRepository<T, F> { public abstract T findById(F id) public abstract F save(T user) public abstract void delete(F id) }
Interface는 형태만 정의한다
Static 멤버 변수는 정의가 가능하다
아무것도 명시하지 않은 메서드는 “public abstract” method이다
interface IClass { public abstract void method(); }
구현이 필요하기때문에 abstract이다
- private은 아예 불가능하다!
- 구현해달라고 넘겨주는것이다!
- “껍데기 Method”
Default Method를 사용할 수 있다
- Default Method: implement 한 class에서 없었어도 default method로 호출하여 사용할 수 있다!
- Override가 가능하다
- 이 Method가 없다면 Default Method를 호출하라는 의미이다
- 두가지 구현채가 있다
- Interface Default Method
- Abstract Default Method
- framework 처럼 필수적으로 실행할 logic 이다
Interface의 진짜 목적은 다양한 구현을 위해 메서드 형태 (타입) 만 정의해주는 것이다
Abstract Class는 형태와 구현을 혼합해서 정의한다
- 데이터: Field 멤버변수 정의
- 행위: Method 정의
Interface와 Abstract Class의 차이점은
- Interface는
implemenets
로 구현되고 - abstract class는
extends
로 확장된다
- Interface는
Logger
@slf4j
을 사용해 logger 함수를 사용할 수 있다
Polymorphism (다형성)
Override: 덮어쓰기
Overload: 과적하기
- 다양한 Parameter에 맞춰서 과적이 가능하다
클래스 상속을 통한 클래스의 다형성
하나의 동일 클래스의 메서드가 다양한 구현채로 호출되는것이 다형성이다
하나의 동일 클래스의 메서드가 동일한 클래스 A의 형태를 가지고 있기에 다양한 구현체로 호출이 가능하다
다형성은 동일한 형상을 가지는것이다
Class A는
print()
메서드를 외부로 노출하고 있다 (public
)Class B도
print()
메서드를 외부로 노출하고 있다 (public
)Class A객체는 Class A의 형상을 가지고, Class B객체도 Class A의 형상을 가지고 있기때문에 Class B 객체는 Class A 타입의 변수를 넣어서 Class A 처럼 사용이 가능해진다
A a_object = new A();
A b_object = new B();
← Class B 객체이지만, Class A 타입의 변수를 넣어 사용이 가능하다!
인터페이스 구현을 통한 인터페이스의 다형성
하나의 동일칸 클래스 메서드가 동일한 인터페이스 or 형태를 가지고 있기에 다양한 구현체로 호출이 가능하다
- Interface I, Class A, Class B 전부
public print
를 가지고 있다- 이에따라 Class A객체는 Interface I의 형상을 가지고, Class B 객체도 Interface I 의 형상을 가지기 때문에,
- Class B 객체나 Class A객체 모두 Interface I 타입의 변수에 넣어서 사용이 가능하다!
- 이에따라 Class A객체는 Interface I의 형상을 가지고, Class B 객체도 Interface I 의 형상을 가지기 때문에,
- Interface I, Class A, Class B 전부
반응형
'웹개발 > Java' 카테고리의 다른 글
15 - 7. Java - Design Pattern & SOLID Principle (2) | 2024.11.04 |
---|---|
15 - 6. Java - ENUM (0) | 2024.11.04 |
15 - 4. Java - Generic & 자료 구조 (0) | 2024.11.04 |
15 - 3. Java - Static (0) | 2024.11.04 |
15 - 1. Java - Lombok (0) | 2024.11.04 |