티스토리 뷰

JVM/JAVA

[JAVA] 인터페이스에 대해서

글을 쓰는 개발자 2021. 11. 20. 11:53
반응형

자바에서 추상화 할 수 있는 방법은 추상화 클래스(abstract class)와 인터페이스 두가지 방법이 있다.

그렇다면 전자와 후자 둘 중 어떤 방법이 더 좋은 방법일까? 

바로 인터페이스다.

그러한 이유를 설명해보도록 하겠습니다.

 

  추상화 클래스 인터페이스
상속 갯수 1 N
확장성 이미 구현되어 있는 클래스에서 추상화클래스를 추가할려고 했을 때에는 기존 클래스가 이미 상속받고 있는 지 그리고 이미 명시되어 있는 메소드와 겹쳐 있는 지 확인해야 하는 작업이 필요하다. 추상화 클래스와 다르게 기존 클래스에서 상속받고 있는 지 확인하지 않아도 된다. 인터페이스의 메소드와 기존 클래스 메소드에서 겹친 것이 있더라도 오버라이딩 되면서 문제가 발생하지 않는다.(1)
방향 수직적 수평적

심지어 인터페이스에서 JDK1.8부터 디폴트 메서드를 제공하면서 추상화클래스에서 할 수 있는 것들을 할 수 있게 되면서 추상화클래스가 할 수 있는 파트를 할 수 있게 되었다.

 

Java Effective
Item 20 추상화 클래스보다는 인터페이스를 우선하라.

인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 크래스의 장점을 모두 취하는 방법이 있는데, 인터페이스로는 타입을 정의하고, 필요하면 디폴트 메서드 몇 개도 함께 제공한다. 그리고 골격 구현 클래스는 나머지 메서드들까지 구현한다. 이렇게 해두면 단순히 골격 구현을 확장하는 것만으로 이 인터페이스를 구현하는 데 필요한 일이 대부분 완료된다. [템플릿 메서드 패턴] -> (인터페이스에서 구현할 부분을 추상화클래스가 implements하여 대부분을 구현하는 방향으로 진행한다.)


정리
일반적으로 다중 구현용 타입으로는 인터페이스가 가장 적합하다. 복잡한 인터페이스라면 구현하는 수고를 덜어주는 골격 구현을 함께 제공하는 방법을 꼭 고려를 해보자. 골격 구현은 '가능한 한' 인터페이스의 디폴트 메소드로 제공하여 그 인터페이스를 구현한 모든 곳에서 활용하도록 하는 것이다. '가능한 한'이라고 하는 이유는,  인터페이스에 걸려 있는 구현상의 제약 때문에 골격 구현을 추상 클래스로 제공하는 경우가 더 흔하기 때문이다.

(1)

(2)

public class TestList {
    public static List<Integer> intArrayAsList(int[] a){
        Objects.requireNonNull(a);

        return new AbstractList<Integer>() {
            @Override
            public Integer set(int index, Integer element) {
                int oldVal = a[index];
                a[index] = element; //auto unboxing
                return oldVal; // auto boxing
            }

            @Override
            public Integer get(int index) {
                return a[index];
            }

            @Override
            public int size() {
                return a.length;
            }
        };
    }
}
    @Test
    void test(){
        int[] a = {1,2,3,4,5,6,7,8};
        List<Integer> b = TestList.intArrayAsList(a);
        for (int i = 0; i < a.length; i++) {
            System.out.printf(b.get(i)+", ");
        }
        b.set(3,40);
        System.out.println();
        System.out.println(b.get(3));
        System.out.println(b.size());
    }
1, 2, 3, 4, 5, 6, 7, 8, 
40
8

위와 같이 필수적으로 구현하는 것은 제외하고 왠만한 메소드들은 구현하는 방식이 템플릿 메서드 패턴 방식이다.

Java Effective
Item 21 인터페이스는 구현하는 쪽을 생각해 설계하라( 디폴트 메서드를 잘 활용하자!)

자바 8에서 디폴트 메서드가 추가되었는데 그 이유는 람다를 활용하기 위해서다. 자바 라이브러리의 디폴트 메서드는 코드 품질이 높고 범용적이라 대부분 상황에서 잘 작동하지만 생각할 수 있는 모든 상황에서 불변식을 해지지 않는 디폴트 메서드를 작성하기란 어려운 법이다.
디폴트 메서드는(컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다.
기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니라면 피해야 한다.
디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아님을 명시해야 한다. 이런 형태로 인터페이스를 변경하면 반드시 기존 클라이언트를 망가뜨리게 된다.

디폴트 메서드가 생겼더라도 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다.

 

2. 다형성

interface를 활용하여 다형성을 사용한 예는 collection 프레임워크를 들 수가 있다. 

 

1. List

List는 인터페이스로 구현되어 있습니다.

 

2. ArrayList

ArrayList는 List를 상속 받아 구현된 클래스 입니다.

 

3.  LinkedList

LinkedList도 또한 List를 상속받아 구현된 클래스 입니다.

 

다형성 예시

public class TestList {
    public static void list(){
        List<List<Integer>> arr2d = new ArrayList<>();
        arr2d.add(new ArrayList<>());
        arr2d.add(new Vector<>());
        arr2d.add(new LinkedList<>());
        arr2d.get(0).add(1);
        arr2d.get(1).add(1);
        arr2d.get(2).add(1);
        for (int i = 0; i < 3; i++) {
            System.out.println(arr2d.get(i));
        }

    }
}
class SimpleTestList {
    @Test
    void test(){
       TestList.list();
    }

}

자바의 정석

리턴 타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.

인터페이스의 장점
1. 개발시간을 단축시킬 수 있다.
2. 표준화가 가능하다.
3. 서로 관계없는 클래스들에게 관계를 맺어줄 수 있다.
4. 독립적인 프로그래밍이 가능하다.(-> 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.)

 

인터페이스 활용하는 방법은 정적 팩토리 메서드도 있다. 

https://vixxcode.tistory.com/186 

 

[Java][Python] Static Factory Method (정적 팩토리 메서드)

1. JavaEffective 장점 1. 이름을 가질수 있다. 반환될 객체의 특성을 쉽게 묘사할 수 있다. Enter(int, int, Random) 과 Enter.minimumLevel 중 어느 것이 더 잘 설명이 되는지 생각해보자. 2. 호출 될 때마다 인..

vixxcode.tistory.com

위의 글을 보면 쿠팡 클래스라는 제3의 클래스를 통해 제공받는 방식으로 사용할 수 있다.

 

참고: javaeffective

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/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
글 보관함