본문 바로가기
Java의 정석/객체지향 프로그래밍 II

인터페이스의 장점

by Hwanii_ 2023. 7. 10.
728x90

1.

두 대상 (객체) 간의 ' 연결, 대화, 소통 ' 을 돕는 ' 중간 역할 ' 을 한다.

 

interface = inter + face

 

inter : ~ 사이 (between)

 

face : 대상

 

 

 

2.

예시)

 

자판기를 예시로 들면,

 

자판기 하드웨어를 둘러싸고 있는 겉부분 (껍데기) 가 인터페이스 이다.

 

자판기 기능을 감싸고 있는 외부 철판에 있는 여러 기능들을 쉽게 조작 할 수 있고,

그로 인해 음료를 쉽게 뽑아 먹을 수 있게 된다.

 

 

 

3.

예시 2)

 

컴퓨터를 예시로 들면,

 

컴퓨터의 하드웨어를 직접 다룬다 ?

>> 어려운 일이다.

 

기계를 사람이 직접적으로 다루는게 어려운 이유는,

기계의 언어와 사람의 언어가 다르기 때문 이다.

 

그래서, 컴퓨터를 쉽게 다루기 위해 윈도우 같은 GUI를 사용 한다.

 

GUI : Graphic User Interface

 

마우스로 해당 화면을 클릭하면, 사용자가 내린 명령이 컴퓨터에게 전달 된다.

 

컴퓨터와 사람의 ' 중간 역할 '을 해주는 아이 == GUI (껍데기 / 인터페이스) 이다.

 

컴퓨터의 본체가 바뀌여도,

GUI 가 같다면, 

새로운 본체의 컴퓨터를 사용해도, 사용하는데 전혀 문제 될게 없다.

 

이 개념은, 변경을 해도 전혀 문제가 없기에, 변경에 유리함을 의미 한다.

 

이것이 인터페이스의 장점 이다.

 

 

 

4.

선언 (설계) 과 구현을 분리 시킬 수 있게 한다.

 

선언 (설계) : 껍데기.

 

구현 : 알맹이.

 

즉, 껍데기와 알맹이를 분리 시킨다는 의미인데, 이것이 변경에 유리함을 의미 한다.

 

예시)

 

class B {
		
    public void method() {
        System.out.println("methodInB");
    }
}

 

위와 같은 B 클래스가 있다고 가정 해보자.

 

이때, 이것을 인터페이스를 사용해서, 껍데기와 알맹이를 분리 시켜보자.

 

interface I {
//	I라는 인터페이스. => 선언 (껍데기) (외부) 
		
    public void method();	//	추상 메서드. 
}
		
class B implement I {
//	I라는 인터페이스를 구현한 B 클래스. => 구현 (알맹이) (내부)
		
    public void method() {
        System.out.println("methodInB");
    }
}

 

I라는 이름을 가진 인터페이스가 있고,

 

B라는 이름을 가진 클래스는 I라는 이름을 가진 인터페이스를 구현한 상황 이다.

 

인터페이스는 껍데기 이고, (외부)

 

껍데기를 구현한 B 클래스는 알맹이에 해당 한다. (내부)

 

이것이 정확히 무엇을 의미 하는지 아래에서 정리 하겠다.

 

 

 

5.

예시)

 

직접적인 관계의 두 클래스. ( A - B )

 

class A {
		
	public void methodA(B b) {
        b.methodB();
    }
}
		
class B {
		
    public void methodB() {
        sysout("methodB()");
    }
}

 

만약에 클래스 B를 C로 변경 해야 한다고 가정 해보자.

 

그러면, 현재 클래스 A 내부에 메서드의 인자로,

B타입의 매개변수만 받을 수 있게 되어 있기 때문에,

 

클래스 B를 C로 변경 해야하고,

 

클래스 A의 메서드의 매개변수 타입도 C로 변경 해야한다.

 

class A {

	public void methodA(C c) {
		c.methodC();
	}	
}

 

즉, 두 클래스는 직접적인 관계 이기 때문에,

 

변경을 할 때, 번거롭고 높은 결합도를 가지고 있음을 의미 한다.

 

이는, 유지보수가 불리 해지는 것을 의미 한다.

 

 

 

간접적인 관계의 두 클래스. ( A - I - B )

 

interface I {			//	인터페이스 I. (== 껍데기)
		
    void methodB();		//	추상메서드.
}
		
class B implements I {	//	인터페이스 I를 구현한 B 클래스. (== 알맹이)
		
    public void methodB() {
				
        sysout("methodB()");
    }
}

 

위와 같이, B 클래스가 가지고 있는 methodB() 메서드를,

추상 메서드로 지니고 있는 인터페이스를 구현 한다.

 

껍데기와 알맹이를 분리 하면,

 

A 클래스는 아래와 같이 작성 할 수 있게 된다.

 

class A {
		
    public void methodA(I i) {
			
    	i.methodB();
    }
}

 

 

 

인터페이스 덕분에, B 클래스가 변경 되어도, A 클래스는 변경 할 필요가 없게 된다.

 

이는, A 클래스와 B 클래스가 더이상 관계되는 것이 없음을 의미 하며,

 

이것은, 낮은 결합도를 의미 한다.

 

 

 

6.

개념

 

A (User) ----- B (Provider)

 

위는, A가 B를 사용 하는 상황 이다.

 

이런 상황을 보고, A가 B에 의존 한다 고도 한다.

 

A가 B를 직접적으로 사용하도록 코드를 작성 했기 때문 이다.

 

만약에, B를 C로 변경하면, A도 변경 해줘야 한다.

 

하지만,

 

인터페이스를 사용해서, 껍데기와 알맹이를 분리 한다면,

 

A (User) ----- I (인터페이스) 가 B (Provider) 을 품고 있다.

 

즉, 껍데기가 알맹이를 품고 있는 상황인데,

 

B가 어떻게 변경 되던, A는 오로지 I 만 사용 하기 때문에,

 

A를 변경할 필요가 없게 된다.

 

이렇게, A 클래스는 알맹이가 뭔지도 알 필요도 없고, 몰라도 사용이 가능 하다.

 

왜냐하면, I (인터페이스) 만 사용 하기 때문에 이다.

 

이는, 낮은 결합도를 의미 하며, 유지 보수가 용이한 코드 라는 것을 의미 한다.

 

 

 

7.

인터페이스를 사용하면, 인터페이스를 한단계 거치기 때문에,

직접적으로 A 클래스와 B 클래스를 직접관계로 두는 코드 보다,

한단계 느릴 수 밖에 없다.

(사실상 체감을 할 수가 있나.. ?)

 

하지만, 변경에 유리하고 (유지 보수 용이), 유연한 코드가 된다는 장점이 있기 때문에,

인터페이스를 사용 한다.

 

 

 

8. 

예제를 통해 확인 하기.

 

 

 

인터페이스를 사용한, 예제를 확인 하기.

 

 

 

 

반응형