앞에서 객체 지향 프로그래밍(Object-Oriented Programming, OOP)이 가지고 있는 4가지 핵심인 추상화, 캡슐화, 상속, 다형성을 알아보았다.
그렇다면 이러한 4가지 특징 중에서 인터페이스가 가지고 있는 객체지향의 특징에는 어떠한 것들이 있을까?
📌 인터페이스와 추상화
앞에서 추상화의 예시를 인터페이스로 든 적이 있다.
public interface Animal {
public void eat(); // 추상메서드
}
인터페이스는 메서드의 세부내용을 보여주지 않고, 메서드이름, 파라미터, 반환타입등을 통해서 어떠한 동작을 수행하는지에 대한 정보만을 보여준다.
사용자는 이러한 추상적인 정보만을 이용해서 기능을 사용하고, 실제 구현은 개발자가 구현체에서 구현하고 있다.
인터페이스는 "나를 사용하기 위해서는 이러한 특징들을 반드시 구현해줘야 해"라고 명시해주고 있다.
📌 인터페이스와 캡슐화
캡슐화는 접근제어자를 통해서 필요한 내용은 노출시키고, 중요한 내용은 숨긴다는 특징을 가지고 있다.
그렇다면 인터페이스에서 필요한 내용을 숨기고, 노출시킬 수 있을까??
접근 제어자의 관점에서 살펴볼 수 있다.
- 인터페이스의 모든 필드는 public static final 이 된다.
- 즉, 필드를 숨길 수 없다.
- 인터페이스의 메서드는 기본으로 public 접근제어자가 적용된다.
- default 접근제어자를 통해 직접 구현할 수도 있다.
- 메서드에 privated은 사용할 순 있지만, 외부로의 노출을 막기 위한 목적이 아닌 인터페이스 내부의 default의 메서드의 중복 부분을 제거하기 위한 용도로 사용한다.
그러므로 인터페이스는 자체적으로는 접근제어자를 통해서 공개하거나, 비공개의 특징을 제공하는 캡슐화와는 멀다.
📌 인터페이스와 상속
- 인터페이스에서 정의한 메서드는 자식객체들이 반드시 재정의 해줘야 한다.
- 인터페이스는 항상 부모의 역할을 하게 되고, 자식을 필요로 하기 때문에 상속의 특징을 가지고 있다.
- 아래와 같이 다중 인터페이스를 구현할 수 있다.
public class 구현클래스명 implements 인터페이스A, 인터페이스B {
// 인터페이스A와 B의 모든 추상메서드를 정의해야한다.
}
- 아래와 같이 다중 인터페이스들을 다중 상속할 수 있다.
public interface 자식인터페이스 extends 부모인터페이스A, 부모인터페이스B {
}
📌 인터페이스와 다형성
인터페이스를 왜 사용하는 걸까?
곧바로 생간나는 대답은 "같은 메서드이름, 반환타입, 파라미터를 가지지만 실제 동작하는 방식은 다르게 구현하고 싶을 때 인터페이스를 사용합니다."이다.
상속에서 여러 명의 자식이 공통된 부모의 메서드를 재활용했다면, 인터페이스는 부모의 기능을 자식들이 서로 다른 방식으로 구현하는 것과 같다.
즉, 같은 타입의 부모를 가지지만 서로 다른 구현체를 통해 다른 동작을 수행할 수 있다.
매개변수에서도 다형성을 확인할 수 있다.
아래와 같이 Animal 인터페이스와, Animal 인터페이스를 구현한 클래스 Cat, Dog 이 있다고 했을 때,
Animal 타입을 매개변수로 받는 곳에는 자리에는 cat, dog 인스턴스 모두가 들어갈 수 있다.
public interface Animal {
void eat();
}
public class Cat implements Animal {
public void eat() {
System.out.println("냠냠");
}
}
public class Dog implements Animal {
public void eat() {
System.out.println("촵촵");
}
}
Animal cat = new Cat();
Animal dog = new Dog();
public void drink(Animal animal) { // 매개변수에는 Animal 타입을 가지는 다양한 구현체가 올 수 있다.
animal.eat();
}
drink(cat);
drink(dog);
정리하면 인터페이스는 캡슐화를 제외하고, 추상화, 상속, 다형성의 특징을 가지고 있다.
'Java' 카테고리의 다른 글
[Java] ConcurrentHashMap (0) | 2024.07.23 |
---|---|
[Java] 오버라이딩을 구현할 때 @Override이 꼭 필요할까? (1) | 2023.10.23 |
[Java] 객체 지향 프로그래밍의 4가지 특징 (0) | 2023.10.19 |
String과 StringBuffer/StringBuilder (0) | 2023.09.12 |