[Java] Interface 의 사용 시점

calis_ws·2024년 1월 30일
0

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개의 댓글