인터페이스는 클래스가 가져야 할 메서드(함수)들의 청사진(설계도)을 제공한다. 인터페이스 내에서는 메소드의 선언부만 있고, 구체적인 구현은 없다
클래스는 인터페이스에서 선언된 메서드를 구현하는 실제 로직을 담고 있다. 즉, 인터페이스는 "이런 메소드가 있어야 해!"라고 선언하고, 클래스는 "이 메소드는 이렇게 동작할 거야"라고 구체적인 동작 방식을 제공한다.
인터페이스
public interface Animal {
void sound(); // 동물 소리를 내는 메소드 (구현은 없음)
void move(); // 동물이 움직이는 메소드 (구현은 없음)
}
Animal 인터페이스는 모든 동물이 가져야 할 공통된 메서드를 선언해 둔다. 각 동물이 소리를 내거나 움직이는 방법이 다를 수 있지만, 공통적으로 소리와 움직임이라는 행동을 수행해야 한다는 것을 선언한다.클래스
public class Dog implements Animal {
@Override
public void sound() {
System.out.println("The dog barks: Woof Woof!");
}
@Override
public void move() {
System.out.println("The dog runs.");
}
}
Dog 클래스는 Animal 인터페이스를 구현(implements) 한다sound() 메소드를 구체적으로 정의해서 "강아지가 짖는 소리"로 구현하고, move() 메소드는 "강아지가 뛰는" 동작으로 구현한다.public class Bird implements Animal {
@Override
public void sound() {
System.out.println("The bird chirps: Tweet Tweet!");
}
@Override
public void move() {
System.out.println("The bird flies.");
}
}
Bird 클래스가 Animal 인터페이스를 구현한다. 새는 짖는 대신 짹짹 소리를 내고, 뛰는 대신 날아다니는 동작을 한다.public class Main {
public static void main(String[] args) {
Animal dog = new Dog(); // 인터페이스 타입으로 객체를 생성
Animal bird = new Bird(); // 인터페이스 타입으로 다른 객체를 생성
dog.sound(); // 결과: The dog barks: Woof Woof!
dog.move(); // 결과: The dog runs.
bird.sound(); // 결과: The bird chirps: Tweet Tweet!
bird.move(); // 결과: The bird flies.
}
}
Animal 인터페이스를 통해 Dog와 Bird 객체를 동일한 타입으로 취급할 수 있다.Dog와 Bird는 서로 다른 클래스지만, 공통적으로 Animal 인터페이스를 구현했기 때문에, Animal 타입으로 다룰 수 있다.Main 클래스는 Animal 인터페이스를 통해 동물 객체를 다루기 때문에 Dog나 Bird의 구체적인 구현에 의존하지 않는다. 이는 나중에 새로운 동물(예: Cat)이 추가되더라도 Main 클래스를 변경할 필요 없이 새 객체를 바로 사용할 수 있다는 의미이다.Animal 타입 변수가 Dog나 Bird 객체를 참조할 수 있는 것이 바로 다형성이다.Dog 클래스의 sound() 메소드가 나중에 "멍멍"에서 "왈왈"로 바뀐다면, 다른 코드에 영향을 주지 않고 Dog 클래스만 수정하면 된다.자바에서 인터페이스와 클래스의 구분은 객체지향 프로그래밍 원칙을 따르는 것이며, 코드의 유연성과 확장성, 다형성을 극대화하는 데 중요한 역할을 한다.
따라서, 인터페이스를 통해 메소드의 설계도를 먼저 정의하고, 이를 여러 클래스가 각각 구체적인 방식으로 구현함으로써, 더 모듈화되고 관리하기 쉬운 코드를 작성할 수 있다.