본문 바로가기
IT || 개발공부/Spring

[Spring] 인터페이스가 가지고 있는 객체지향의 특징

by saesong 2023. 10. 20.

🔶 인터페이스가 가지고 있는 객체지향의 특징

▪ 인터페이스 정의 및 역할
어떤 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시
인터페이스의 메소드들을 구현해내야한다고 강제하는 것

- 참고 및 출처: 생활코딩

 

간단한 인터페이스 예시를 들어보자.

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

 

댓글