🔶 인터페이스가 가지고 있는 객체지향의 특징
▪ 인터페이스 정의 및 역할
어떤 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시
인터페이스의 메소드들을 구현해내야한다고 강제하는 것
- 참고 및 출처: 생활코딩
간단한 인터페이스 예시를 들어보자.
interface I{
public void a(); // 추상클래스 안의 추상메서드가 중괄호가 없는 것과 같다.
}
class A implements I{
public void b() {}
}
앞서 1차 과제에서 살펴봤듯 객체지향의 특징에는 추상성,다형성,상속,캡슐화가 있다.
위의 간단한 코드를 보아도, 객체지향 특징을 한 눈에 알 수 있다.
예시에 따라 어떤 부분이 객체지향의 특성을 갖고 있는지 알아보자.
1. 캡슐화 --- Interface의 접근제어자는 public만 허용한다.
- 클래스와는 달리 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 한다.
- 인터페이스는 해당 인터페이스를 구현한 클래스를 어떻게 조작할 것인가를 규정한다. 따라서 외부에서 제어 가능한 가장 개방적인 접근 제어자인 public만을 허용한다.
- public이라는 제어자는 모든 인터페이스에 공통으로 적용되는 부분이므로 생략가능하다. (제어자 자체를 생략가능)
(생략된 제어자는 자바 컴파일러가 자동 추가해줌)
2. 추상성 --- interface 자신이 직접 인스턴스 생성 불가능
abstract class wine {
public static final int year = 3;
final String color = red; // public static 생략
static int weight = 1; // public, final 생략
public abstract String getWineInfo();
void info();
}
class SubCls extends SuperCls implements TestIntfce {
......
}
- 인터페이스는 일종의 추상클래스로서, 추상화 정도가 더 높아 바디가 있는 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. (인터페이스 자신이 직접 인스턴스 생성 불가능)
- 인터페이스는 구현시 implements 키워드를 사용하는데, 만약 구현하는 인터페이스 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야 한다.
3. 상속 --- interface는 다중 상속 가능
interface IntfceA {
public void a();
}
interface IntfceB extends intfceA {
public void b();
}
class TestIntfce implements IntrceB {
public void a() {
...
};
public void b() {
...
};
}
추상성을 특징으로 들었다면 자연스럽게 상속도 특성으로 들 수 있다.
위의 예시를 보면, TestIntfce 클래스는 IntrceB의 b()와 IntfceA클래스의 b()를 반드시 구현해야한다.
▶ 인터페이스를 구현한 클래스는 모든 상위 인터페이스를 오버라이딩 해야한다.
interface Fruit extends Grape, Banana {
interface Grape {
void color(purple);
}
interface Banana {
void taste(sweet);
}
}
인터페이스는 모든 메서드가 추상메서드이므로, 구현부가 없기에 다중상속이 가능하다.
자바의 경우 A, B 라는 클래스가 모두 C()라는 메서드를 갖고 있다고 가정해보면,
C()메서드의 구현부가 다르다면 어떤 메서드가 실행 될 지 몰라 충돌(에러)이 난다.
따라서 자바는 클래스를 통한 다중상속은 지원하지 않기 때문에, 인터페이스가 이러한 부분에서 효율성을 담당하고 있다.
4. 다형성 -- 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능
인터페이스가 다중상속의 특성을 갖기에, 다형성도 갖는다.
다형성의 특성으로, 클래스의 자손객체를 해당 클래스의 부모 타입의 참조변수로 가리키는 것이 가능하다는 점을 들 수 있다.
class Transport exteds Bus implements Taxi {
public void move(int x, int y) {
...
}
public void go(Taxi t) { // 매개변수 타입이 인터페이스라는 것은, Taxi 인터페이스를 구현한 클래스의 인터페이스만 가능하다는 뜻.
...
}
// Transport 클래스는 Bus로부터 상속받고, Taxi 인터페이스를 구현한다.
Bus b = new Transport();
Taxi t = new Transport();
t.move(100,200);
t.go(new Transport());
위의 예시처럼, 인터페이스 타입인 Taxi 타입의 참조변수로 Transport 클래스를 가리키는 것이 가능하다.
또한, 인터페이스를 메서드의 리턴타입으로 지정가능하다.
Taxi method() { // Taxi는 반환타입.(Transport인터페이스를 구현한 클래스의 인스턴스를 반환)
...
Transport p = new Transport();
return p; // return new Transport(); 와 같은 문장이다.
}
(인터페이스의 다형성 속성은 아직 이해가 완전히 부족하여 설명이 미흡합니다.)
참고: 생활코딩, TCP School, velog.io/@kai6666, https://interconnection.tistory.com/129
'IT || 개발공부 > Spring' 카테고리의 다른 글
[Spring] Controller, Service , Repository의 역할 (0) | 2023.10.31 |
---|---|
[Spring] DI, IoC란? (0) | 2023.10.30 |
[Spring] API와 REST API (0) | 2023.10.27 |
[Spring] 오버라이딩 구현시 @Override가 필요한가 (0) | 2023.10.23 |
[Spring] 객체지향에 대하여 (1) | 2023.10.19 |
댓글