인터페이스란,
객체지향 프로그래밍에서 다형성을 구현하는 방법 중 하나이다. 일종의 추상 클래스이며, 추상 메소드와 상수만을 가지고 있다. 클래스와 달리 다중 상속이 가능하며, 클래스에서 인터페이스를 상속받을 수 있다.
인터페이스는 클래스가 구현해야 하는 메소드의 명세를 정의한다. 즉, 인터페이스는 어떤 클래스가 구현해야 할 메소드의 이름과 파라미터, 반환 타입을 정의한다. 이때, 인터페이스에 정의 된 메소드는 메소드의 구현 내용이 없으며, 구현하는 클래스에서 해당 메소드를 구현해야 한다.
인터페이스가 가지고 있는 메소드를 하나도 구현하지 않는다면, 해당 클래스는 추상 클래스가 된다. 그리고 추상 클래스는 인스턴스를 만들 수 없다. 참조변수의 타입으로 인터페이스를 사용 할 수 있다.
인터페이스는 계층적인 관계는 없지만, 비슷한 기능을 하는 클래스가 공통적으로 가져야 할 멤버를 정의하여 구현을 강제하는 것이다.
인터페이스를 사용하는 이유는?
다형성(polymorphism)을 구현하는 데에 매우 유용하다. 예를 들어, 여러 종류의 동물이 있을 때 이들이 공통적으로 가지는 특징을 인터페이스로 정의하면, 이 인터페이스를 구현하는 모든 클래스는 해당 인터페이스에서 정의한 메소드를 구현해야 하므로, 같은 이름의 메소드를 가진 클래스들은 이를 동일한 방식으로 호출할 수 있다.
예를 들어, IAnimal 인터페이스가 있다고 가정해보자. 이 인터페이스는 eat() 메소드를 정의하고 있다. 그리고 Dog 클래스와 Cat 클래스가 이 인터페이스를 구현한다고 가정해보자.
interface IAnimal {
void eat();
}
class Dog implements IAnimal {
public void eat() {
Console.WriteLine("Dog is eating.");
}
}
class Cat implements IAnimal {
public void eat() {
Console.WriteLine("Cat is eating.");
}
}
이제, IAnimal 인터페이스를 사용하여 eat() 메소드를 호출해보자.
IAnimal animal1 = new Dog();
IAnimal animal2 = new Cat();
animal1.eat();
animal2.eat();
위 코드에서 animal1 변수는 IAnimal 인터페이스 타입으로 선언되었지만, 실제 객체는 Dog 클래스의 인스턴스이다. 마찬가지로, animal2 변수는 IAnimal 인터페이스 타입으로 선언되었지만, 실제 객체는 Cat 클래스의 인스턴스이다.
이제 eat() 메소드를 호출해보면, 각각 "Dog is eating."과 "Cat is eating."이 출력된다. 이는 인터페이스를 사용하여 클래스들이 같은 이름의 메소드를 구현하도록 강제하였기 때문에, 다형성을 구현할 수 있게 된 것이다.
이처럼 인터페이스를 사용하면, 코드의 유연성과 확장성을 높일 수 있다. 인터페이스는 클래스 간의 결합도를 낮추고, 코드의 재사용성을 높일 수 있는 중요한 개념 중 하나이다.
Q1. 인터페이스와 추상 클래스는 어떤 차이가 있을까?
1. 인스턴스화 여부
- 추상 클래스는 인스턴스화 될 수 없으며, 자식 클래스가 추상 클래스를 상속 받아 구현한 후에 해당 자식 클래스를 인스턴스화 할 수 있다.
- 인터페이스는 인스턴스화 될 수 없으며, 자식 클래스가 인터페이스를 구현한 후 해당 자식 클래스를 인스턴스화 할 수 있다.
2. 멤버 변수의 존재 여부
- 추상 클래스는 멤버 변수를 가질 수 있다.
- 인터페이스는 멤버 변수를 가질 수 없다.
3. 메소드의 구현 여부
- 추상 클래스는 추상 메소드 뿐만 아니라 일반 메소드도 가질 수 있다. 추상 클래스를 상속받은 자식 클래스는 추상 메소드를 구현하거나 일반 메소드를 재정의할 수 있다.
- 인터페이스는 추상 메소드와 디폴트 메소드, 정적 메소드만 가질 수 있으며, 구현 클래스는 반드시 모든 추상 메소드를 구현해야 한다.
4. 상속 구조
- 추상 클래스는 상속을 받아 확장하는 것이 목적이며, 인터페이스는 구현을 강제하는 것이 목적이다.
따라서, 추상 클래스는 클래스 계층 구조를 만들기 위해 사용되며, 공통된 기능을 제공하고자 할 때 주로 사용된다. 반면 인터페이스는 구현 클래스들이 구현해야 할 행동을 명시하기 위해 사용되며, 다양한 클래스들이 동일한 인터페이스를 구현하게 하여 유연성을 제공하고자 할 때 주로 사용된다는 차이가 있다.
Q2. 인터페이스와 상속의 차이점
- 상속: 클래스 간의 계층적인 관계를 나타내며, 부모 클래스의 멤버를 자식 클래스가 물려받아 사용할 수 있도록 한다. 즉, 상속을 받은 자식 클래스는 부모 클래스의 모든 멤버를 사용할 수 있다.
- 인터페이스: 클래스 간의 계층적인 관계는 없지만, 비슷한 기능을 하는 클래스가 있을 때 공통적으로 가져야 할 메서드나 속성 등을 정의할 수 있다. 인터페이스는 메서드, 속성, 이벤트 등의 멤버를 가질 수 있지만, 실제 구현 내용은 없고 단지 인터페이스에서 정의된 멤버들만을 구현하도록 강제하는 역할을 한다.
'TIL > ☕️ JAVA' 카테고리의 다른 글
TDD 방식으로 자바 연습하기 (0) | 2023.03.12 |
---|---|
Equals()와 == 연산자 (0) | 2023.03.12 |
'참조한다'라는 건 (0) | 2023.03.03 |
About 다형성: 클래스 형변환을 하는 이유 (1) | 2023.03.03 |
오버로딩과 오버라이딩 차이 (0) | 2023.03.03 |