인터페이스(interface)는 자바에서 다중 상속을 지원하지 않는 문제를 해결하고, 코드의 유연성을 높이기 위해 사용된다.
여러 클래스가 공통된 메서드를 구현하도록 강제함으로써 코드의 일관성을 유지하고, 다형성을 통해 다양한 객체를 통일적으로 다룰 수 있도록 한다.
두 객체간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
선언(설계)과 구현을 분리시킬 수 있게 한다.
인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴 값이 다를 수 있다.
자바의 상속 구조는 단일 상속의 원칙을 갖기 때문에 하나의 클래스가 여러 부모 클래스를 상속할 수 없다.
서로 다른 부모 클래스를 가지는 클래스간에도 같은 인터페이스를 구현할 수 있다.
같은 인터페이스를 구현하고 있는 클래스간에는 그 인터페이스로 하여금 대표성을 갖게 할 수 있다.
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");
}
}
약한 결합은 소프트웨어의 요소 간의 의존성을 최소화하고 유연성을 높이는 개념이다. 여러 클래스가 서로 독립적으로 존재하면서도 상호 작용할 수 있는 구조를 지원한다.
하나의 프로그램의 다수의 클래스들이 서로 관계를 형성하게 되고 각 클래스들은 역할에 따라 구분한다.
클래스들간에 관계를 밀접하게 구성하게 되면 특정 클래스에서 변경이 일어날 경우 많은 클래스들이 영향을 받는다. (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();
}
}
다중 상속은 한 클래스가 여러 개의 클래스로부터 상속받는 것을 말한다. 자바에서는 클래스에서의 다중 상속이 허용되지 않지만, 인터페이스를 통한 다중 상속은 가능하다.
여러 인터페이스를 구현함으로써 한 클래스가 다양한 기능을 동시에 제공할 수 있다.
각 인터페이스는 독립적으로 분리된 역할을 수행한다. 이는 코드를 더욱 모듈화하고 유지보수하기 쉽게 만들어준다.
여러 인터페이스의 기능을 재사용하여 새로운 클래스를 작성할 수 있다. 이는 코드의 중복을 피하고 유지보수성을 향상시킨다.
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