[Java] Interface 의 사용 시점

calis_ws·2024년 1월 30일

Interface

인터페이스(interface)는 자바에서 다중 상속을 지원하지 않는 문제를 해결하고, 코드의 유연성을 높이기 위해 사용된다.

여러 클래스가 공통된 메서드를 구현하도록 강제함으로써 코드의 일관성을 유지하고, 다형성을 통해 다양한 객체를 통일적으로 다룰 수 있도록 한다.

두 객체간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
선언(설계)과 구현을 분리시킬 수 있게 한다.

사용 시점

1. 다형성 구현

인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴 값이 다를 수 있다.

다형성이란

  • 자바의 상속 구조는 단일 상속의 원칙을 갖기 때문에 하나의 클래스가 여러 부모 클래스를 상속할 수 없다.

  • 서로 다른 부모 클래스를 가지는 클래스간에도 같은 인터페이스를 구현할 수 있다.

  • 같은 인터페이스를 구현하고 있는 클래스간에는 그 인터페이스로 하여금 대표성을 갖게 할 수 있다.

public class InterfaceAssist {
    public static void main(String[] args) {
        play(new Soccer());
        play(new BassGuitar());
    }

    public static void play(IBehavior ib) {
        ib.play();
    }
}

public interface IBehavior {
    void play(); // public abstract 생략
}

public class Soccer extends Sport implements IBehavior {
    @Override
    public void play() {
        System.out.println("Playing Soccer");
    }
}

public class BassGuitar extends Guitar implements IBehavior {
    @Override
    public void play() {
        System.out.println("Playing BassGuitar");
    }
}

2. 약한 결합

약한 결합은 소프트웨어의 요소 간의 의존성을 최소화하고 유연성을 높이는 개념이다. 여러 클래스가 서로 독립적으로 존재하면서도 상호 작용할 수 있는 구조를 지원한다.

  • 하나의 프로그램의 다수의 클래스들이 서로 관계를 형성하게 되고 각 클래스들은 역할에 따라 구분한다.

  • 클래스들간에 관계를 밀접하게 구성하게 되면 특정 클래스에서 변경이 일어날 경우 많은 클래스들이 영향을 받는다. (Tight Coupling)

  • 따라서, 클래스 간에 관계를 구성할 때 그 관계를 느슨하게 관리하는 것이 중요하다. (Loose Coupling)

  • 클래스와 클래스 사이에 인터페이스를 구성하면 직접적인 접근이 없는 느슨한 관계를 구성할 수 있다.

public class Person {
    private Chicken chicken;
    
    public Person() {
        this.chicken = new Chicken();
    }

    public void startEat() {
        chicken.eat();
    }
}

public class Chicken {
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

강한 결합은 어떠한 객체가 다른 객체에 강한 의존성을 가지고 있음을 뜻한다.

public interface Food {
    void eat();
}

public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

public class Person {
    private Food food;

    public Person(Food food) {
        this.food = food;
    }

    public void startEat() {
        food.eat();
    }
}

3. 다중 상속이 필요할 때

다중 상속은 한 클래스가 여러 개의 클래스로부터 상속받는 것을 말한다. 자바에서는 클래스에서의 다중 상속이 허용되지 않지만, 인터페이스를 통한 다중 상속은 가능하다.

  • 여러 인터페이스를 구현함으로써 한 클래스가 다양한 기능을 동시에 제공할 수 있다.

  • 각 인터페이스는 독립적으로 분리된 역할을 수행한다. 이는 코드를 더욱 모듈화하고 유지보수하기 쉽게 만들어준다.

  • 여러 인터페이스의 기능을 재사용하여 새로운 클래스를 작성할 수 있다. 이는 코드의 중복을 피하고 유지보수성을 향상시킨다.

interface Swimmable {
    void swim();
}

interface Flyable {
    void fly();
}

class FlyingFish implements Swimmable, Flyable {
    public void swim() {
        // 구현 내용
    }

    public void fly() {
        // 구현 내용
    }
}

인터페이스의 장점

  • 두 대상 사이의 '중간' 역할을 해준다. -> 직접 거치지 않고 중간 단계를 거친다. (중개인)

  • 선언과 구현을 분리시킬 수 있다. -> 변경사항이 있어도 수정 범위가 적다.

  • 개발 시간을 단축할 수 있다. -> 개발시 협업 시스템에서 미완성, 추상메서드(내용없는) 를 통해 = 완성되었다고 가정하고 동시에 개발 가능

  • 변경에 유리한 유연한 설계가 가능하다. -> (선물 상자에 내용물이 바뀌어도 상관없는 것처럼)

  • 클래스들의 관계를 맺어줄 수 있다. (다형성/추상화)


출처

https://velog.io/@damiano1027/Java-강한-결합과-약한-결합

자바 기초 강의 - 3-14강 인터페이스의 활용
https://youtu.be/enD9V74_kRs?si=Mh-L7nUE2IHpQVQo

[자바의 정석 - 기초편] ch7-38인터페이스와 다형성
https://youtu.be/EnBLkMYt1XQ?si=y4VWBb5yTW4KMsjn

profile
반갑습니다람지

0개의 댓글