반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

웹풀스택 공부 중

15 - 5. Java - Abstract Class vs Interface 본문

웹개발/Java

15 - 5. Java - Abstract Class vs Interface

lukeit 2024. 11. 4. 13:14

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 로 확장된다

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 타입의 변수에 넣어서 사용이 가능하다!
반응형

'웹개발 > 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