꾸준한 스터디
article thumbnail

인터페이스의 장점

  • 자바 8 부터 인터페이스도 디폴트 메서드를 제공할 수 있다.
  • 기존 클래스도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다.
  • 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다.
  • 계층구조가 없는 타입 프레임워크를 만들 수 있다.
  • 래퍼 클래스와 함께 사용하면 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다.
  • 구현이 명백한 것은 인터페이스의 디폴트 메서드를 사용해 프로그래머의 일감을 덜어줄 수 있다.

인터페이스는 보통 타입을 정의할 때 사용하고 추상(abstract) 클래스는 인터페이스의 구현체를 일부 기본적으로 제공할 때 사용한다.

현재 챕터에서는 추상클래스를 상속하여 기능을 제공하기 보다는 인터페이스를 우선적으로 사용하는 것이 장점이 많다는 이야기이다.

추상클래스를 상속받으려면 오로지 1개의 추상 클래스만 상속 받을 수 있다. 자바에서는 다중상속을 못하게 되어있어서,

추상클래스 기능을 사용하기위해 확장하려면 기존에 다른 클래스를 상속받고 있으면 안된다.

또한 여러 클래스가 동일한 추상클래스를 상속받으려면 각 클래스간의 계층구조가 여러개가 추상클래스의 하위가 아닌 어떤 객체가 하위 밑에 추상클래스를 사용할 다른 클래스는 그 하위..

이렇듯 추상클래스를 사용하려면 제약도 많고 계층구조가 복잡해진다. 

 

인터페이스는 여러개의 클래스가 구현을 받더라도 모두 해당 인터페이스 객체가 되며 기존에 다른 클래스를 상속받고 있다 하더라도 다중 구현이 가능하여 각 인터페이스의 기능을 사용할 수 있다.

 

 

디폴트 메서드의 경우

인터페이스에 만약 추상 메서드가 새로 정의가 된다면?

명시적으로 메서드가 추가되었다고 알려주는 것은 좋으나

해당 인터페이스를 구현한 모든 클래스에서 해당 메서드를 오버라이딩 하지 않으면 컴파일 에러가 날 수 있다.

만약 디폴드 메서드로 변경하면

더 이상 오버라이딩 해야하는 추상 메서드가 아니기 때문에 메서드 오버라이딩 하지  않아도 컴파일 오류가 나지 않을 뿐더러 추가된 디폴트 메서드 기능을 사용할 수 있도록 인터페이스가 진화?! 되었다.

디폴트 메서드로 구현이 안되는 경우는 인스턴스 필드를 사용해야 하는 경우인데 그럴 경우 추상 클래스를 사용해야 한다.

인터페이스는 인스턴스화 할 수 없으니 인터페이스의 필드는 무조건 public static final인 상수이다.

디폴트 메서드는 자바8 버전부터 사용할 수 있으며 이로인해 abstract 클래스를 사용하는 일은 현저히 줄어들 것이다.

 

인터페이스에서의 mixin 사용

Mixin 이란?

  • 객체지향언어에서 다른 클래스에서 '사용'할 목적으로 만들어진 클래스.
  • '포함'으로 설명된다. Composition 혹은 Aggregation이라고 불리기도 한다.
  • 상속과 주로 비교되는 개념이다 Is-a Has-a
  • 코드 재사용성을 높여주고 상속의 단점을 해결할수도 있다.
  • 자바 코드에서는 다중 상속의 제한이 없는 인터페이스로 구현하기 용이하다.
  • 대상 타입의 주된 기능에 선택적 기능을 혼합(mixed in) 한다고 해서 믹스인이라 불린다.

클래스의 주요한 역할이 있을 때 부가적으로 기능을 추가하는 것. 다중 구현이 가능한 인터페이스에서 사용하기 좋다.

만약 필요한 부가기능을 구현한 인터페이스가 있다면 해당 인터페이스를 implements 하고 해당 메서드를 사용한다.

인터페이스는 계층구조가 명확하지 않은 타입 프레임워크를 만들 수 있는 것은

어떤게 하위이고 어떤게 상위계층이지 불분명한 객체의 경우 인터페이스는 여러개의 인터페이스를 상속받을 수 있는 장점이 있다.

가수이자 작곡가이기도 한 객체를 같이 상속받아 사용할 수 있다.

 

 

래퍼 클래스와 함께 사용하면 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다는 장점은

Item18번에서 살펴 봤다.

 

상속을 받을 경우 상위 클래스에서 메서드의 기능이 변경되었거나 구현 여부에 따라 하위 클래스의 메서드 기능에 영향을 받아 잘 동작하리란 보장할 수 없다. 캡슐화가 깨지는 상황이 발생 된다.

 

하지만 인터페이스를 활용한 경우는

인터페이스에 새로운 기능이 추가가 되도 해당 내부 구현에만 기능이 이루어지니 상속 받은 클래스에서는 영향 받을일이 없다. 중복 메서드가 추가된다고 하더라도 상속관계가 아니니 인터페이스의 기능은 인터페이스의 기능 내 기능은 내 기능으로 영향을 받지 않는다.

 

 

 

인터페이스와 추상 골격(skeletal) 클래스

  • 인터페이스와  추상 클래스의 장점을 모두 취할 수 있다.
    • 인터페이스 - 디폴트 메서드 구현
    • 추상 골격 클래스 = 나머지 메서드 구현
    • 템플릿 메서드 패턴
  • 다중 상속을 시뮬레이트 할 수 있다.
  • 골격 구현은 상속용 클래스이기 때문에 Item19에 나온 설계 및 문서화 지침을 모두 따라야 한다.

추상클래스로 인터페이스를 구현하는데 일부 로직은 완전한 구현체를 제공하고, 일부 로직은 완전한 구현체에 사이사이 끼어 들어가는 템플릿 메서드 패턴과 같은 역할을 하는 메서드가 구현된 것.

사이사이 끼어들어가는 메서드는 하위 클래스에서 오버라이딩 하여 각자의 기능으로 교체가 가능하지만

기본 골격의 로직은 변경할 수 없다.

인터페이스를 구현해야하는 모든 클래스들이 아무것도 없이 맨 땅에서 로직을 만드는 것이 아닌 추상 클래스가 제공하는 기본적인 골격이 갖춰진 기능들을 활용하면서 좀 더 쉽게 인터페이스를 구현할 수 있게 도와주는 역할. 이 것이 템플릿 메서드 패턴

 

List를 만들기 위해 AbstractList 추상 클래스를 사용하면 List를 생성할 때 List의 모든 추상 메서드를 재정의하지 않아도 된다. skeleton 역할을 하는 추상클래스인 AbstractList를 통해 구현을 하면 AbstractList 클래스를 만드는데 필요한 일부분의 메서드만 재정의 해주면 된다. 인터페이스의 장점과 추상클래스의 장점을 모두 가졌다.

 

래퍼 클래스와 비슷한 시뮬레이트한 다중 상속은

중첩 클래스로 사용할 클래스를 상속을 받으면 해당 객체는 composition으로 연관 관계를 맺어 사용할 수 있다.

 

템플릿 메서드 패턴

상속을 사용하는 디자인 패턴 

알고리즘 구조를 서브 클래스가 확장할 수 있도록 템플릿으로 제공하는 방법

추상 클래스는 템플릿을 제공하고 하위 클래스는 구체적인 알고리즘을 제공한다.

process 메서드가 알고리즘 구조를 가지고 있는 메서드이고 큰 구조는 바뀌지 않고 알고리즘에 사용하는 일부 메서드를 상속받은 하위 클래스에서 별도로 구현하게 만든 구조
알고리즘에 사용되는 getResult를 오버라이딩한 ConcreteClass

템플릿 메소드 패턴은 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의한다. 알고리즘이 단계별로 나누어지거나, 같은 역할을 하는 메소드이지만 여러곳에서 다른 형태로 사용이 필요한 경우 유용하며 상속을 통해 슈퍼 클래스의 기능을 확장이 용이하다. 변하지 않는 기능은 슈퍼 클래스에 만들어두고 자주 변경하며 확장할 기능은 서브 클래스에서 만들도록 한다.

 

 

템플릿 메소드 패턴 장단점

장점

  1. 중복코드를 줄일 수 있다.
  2. 자식 클래스의 역할을 줄여 핵심 로직의 관리가 용이하다.
  3. 좀더 코드를 객체지향적으로 구성할 수 있다.

 

단점

  1. 추상 메소드가 많아지면서 클래스 관리가 복잡해진다.
  2. 클래스간의 관계와 코드가 꼬여버릴 염려가 있다.

 

상속을 사용하지 않은 확장 가능한 클래스로 만드는 템플릿 콜백 패턴

https://siyoon210.tistory.com/131

 

템플릿/콜백 패턴이란?

개요아주 간단하지만 아주 끔찍한(?) 클래스를 하나 보겠습니다. class MyClass { void myMethod1() { System.out.println("A"); System.out.println("B1"); System.out.println("C"); } void myMethod2() { System.out.println("A"); System.out.pr

siyoon210.tistory.com

 

 

디폴트 메서드와 Object 메서드

Object 메서드를 재정의 할 경우 컴파일 에러

왜 인터페이스 디폴트 메서드에 Object 메서드를 재정의 할 수 없을까?

디폴트 메서드가 추가된 이유는 인터페이스의 진화의 목적을 가지고 있다. 위험을 가져다 주기 위한 용도가 아니다.

또 복잡도를 증가시키는데  인터페이스에 정의된 메서드보다 클래스에 정의된 메서드가 우선순위를 갖는다. 

구체적으로 구현한 인터페이스가 덜 구체적인 인터페이스보다 우선순위를 갖는다.

서브 인터페이스에서 재정의한 메서드가  상위 인터페이스 메서드 보다 우선순위를 갖는 것이다. 인터페이스끼리 상속이 가능하니. 

이렇듯 내가만든 클래스에서 메서드를 사용하는지 아니면 내가 만든 인터페이스의 메서드를 사용해야 하는지 아니면 Object 클래스의 메서드를 사용해야 하는지 명확한 기준이 없기 때문에 혼란스럽기만 하다.

인터페이스에서 Object 메서드를 정의만 하는것은 가능하다 해당 인터페이스를 구현하면 반드시 equals 메서드가 다르게 동작해야하거나 hashCode가 다른식으로 구현되어야 될 떄 보통은 Collection에서 찾아볼 수 있다.

 

 

 

 

 

 

https://ckddn9496.tistory.com/137

 

(모던 자바 인 액션) Chapter 13 디폴트 메서드

자바 8에서는 기본 구현을 포함하는 인터페이스를 정의하는 두 가지 방법을 제공한다. 첫 번째는 인터페이스 내부에 정적 메서드를 사용하는 것이다. 두 번째는 인터페이스의 기본 구현을 제공

ckddn9496.tistory.com

 

https://www.inflearn.com/course/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-2/dashboard

 

이펙티브 자바 완벽 공략 2부 - 인프런 | 강의

자바 학습의 끝판왕 “이펙티브 자바”를 보다 쉽고 완벽하게 학습하세요. 이 강의를 수강하시면 여러분의 자바 프로그래밍 지식과 실력뿐 아니라 학습 능력 또한 향상시킬 수 있습니다., - 강

www.inflearn.com

 

https://jake-seo-dev.tistory.com/30

 

자바 믹스인(mixins)이란?

믹스인이란? 객체지향언어에서 다른 클래스에서 '사용'할 목적으로 만들어진 클래스이다. '포함'으로 설명된다. '상속'과 주로 비교되는 개념이다. (is-a vs has-a) Composition 혹은 Aggregation 이라고 불

jake-seo-dev.tistory.com

https://coding-factory.tistory.com/712

 

[Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)에 대하여

템플릿 메소드 패턴(Template Method Pattern)이란? 템플릿 메소드 패턴이란 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용

coding-factory.tistory.com

 

profile

꾸준한 스터디

@StudyRecord

포스팅이 유익하셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!