본문 바로가기

1:1 개발 공부

인터페이스 이해하기

인터페이스란?

- 쉽게 말해 연결을 뜻합니다. 통틀어서 HCI (Human Computer Interaction) 라고 합니다. 

 

인터페이스를 설명하기 앞서 말씀드릴 개념이 있는데 바로 "구성하다"와 "집합하다"입니다.

만약 학교라는 class가 있습니다. 철수 class와 영희 class를 가지고 있고 싶을 때 이러한 상황을

1)구성하다(composition) 2)집합하다(Aggregate) 라고 표현할 수 있으며 이 두 가지를 합쳐서 연간되다(Assosicate)라고 합니다.

 

1) 구성하다 : 이루고 있는 개념이라 하나라도 빠지면 안됩니다. 자동차에서 타이어 하나라도 빠지면 자동차가 아닌 것과 같은 이치입니다. 구성 같은 경우, 학교라는 클래스가 직접 철수를 new 하는 개념입니다. 

2) 집합하다 : 이루고 있는 것 중 하나가 빠져도 되는 개념입니다. 학생 10명 중 한 두 명 빠진다고 해서 학교가 아닌 것은 아닙니다. school이 아닌 다른 클래스에서 student가 생성돼서 파라미터로 넘어오는 것입니다. 

 

구성하다는 내가 생성했느냐, 집합하다는 남이 생성해서 내가 받아와 가지고 있느냐의 차이인 것입니다.

 

이 2가지 개념이 중요한 이유는 new를 해주면 직접 삭제를 해주어야합니다. 내가 객체를 사용하고 삭제 하고 싶지 싶으면 내가 생성하면 안되는 것입니다.

 

예를 들어봅시다. 수학 선생님과 국어 선생님이 있는데 둘다 영희라는 학생 객체를 사용해야할 때가 있습니다. 그런데 만약 수학 선생님에서 학생 객체를 만들어버렸다면 삭제를 해주어야하기 때문에, 국어 선생님이 학생 객체를 사용하지 못하게 되는 것이죠. 따라서 이런 경우에는 제 3자인 학교 클래스에서 학생을 만들어주는 것이 좋습니다.

학생 FACTORY

그렇다면 학생 수가 2명이 아닌 100명이 될 때, 계속해서 학생을 만들어야 되느냐? 라는 의문이 생깁니다. 위의 그림은 철수와 영희를 개개인별로 보게 되기 때문이죠. 이러한 문제를 해결하기 위해 나타난 것인 바로 "인터페이스"입니다.

 

인터페이스 예시

인터페이스는 철수와 영희를 개개인을 보지 않습니다. "학생"이라는 큰 틀로 보는 것이죠.

즉, 철수, 영희 등을 학생으로 "일반화" 한 것이고, 학교가 "나 너희들을 학생으로 볼거야"는 "추상화"했다고 합니다.

 

학생 클래스에 1)등교하다( ) 2)하교하다( ) 3)숙제하다( ) 가 있다면 "철수 클래스", "영희 클래스"도 모두 똑같이 들어가겠죠. 그러면 어떤 학생이 오더라도 그 학생은 저 3가지의 함수를 하게 되는 것이죠. 

 

학생*우리학교학생 = new 철수;   -> 등교하다( )

학생*우리학교학생 = new 영희;    ->등교하다( )

(철수를 만들어서, 우리학교학생이라는 객체에 넣고, 학생 타입인 것이죠.)

 

쉽게 말해, 우리학교 교복을 입고 있는 학생이 있다면, 등교든, 하교든, 숙제든 시킬 수 있다는 것이죠. 그게 철수인지, 영희인지, 지민이인지는 상관없이 말입니다.

 

인터페이스를 잘 활용하면, 사람을 늘릴 때마다 일일이 학생이라는 것을 계속 구현할 필요가 없는 것이죠! 

 

우리학교학생이 변수라면, 학생은 클래스(타입)이자 바로 '인터페이스'가 되는 것입니다.

상속을 사용하는 이유 중 가장 기초적인 이유는 "코드를 가져오는 것"입니다. "다루는 방법" 때문이죠.

여기서 잠깐 표현이 다른데요. 철수가 학생을 상속하는 것이라고 클래스에서는 표현한다면,  인터페이스는 구현한다고 합니다. c++은 문법에서 따로 인터페이스가 없기 때문에 자바보다 더 헷갈릴 수 있습니다.

 

예를 들어보겠습니다. 학교는 나를 선생님으로 다루고 싶습니다. 그리고 그 학교에 선생님은 '가르치다'라는 함수가 포함되어있습니다. 그런데 '나'가 구현 된 '가르치다'가 마음에 들지 않아, 코딩을 짜서 '가르치다'를 새롭게 만들어버립니다. 즉, 학교에서 바라보는 선생님의 '가르치다'와 '나'가 바라보는 '가르치다'가 달라지는 상황이 발생합니다.

 

그래서 이러한 일을 방지하기 위해, '가르치다'라는 행위만 정의해 놓는 것입니다. 대신 그건 선생님이 알아서 하라는 것이죠. 예를 들어, '가르치다'는 "이론을 먼저 설명하고 예시를 들어주고 학생에게 질문을 던지세요" 라고 내용을 정리해놓는 것이 아닌거죠. 과학 선생님의 가르치다는 "기본 개념과 예시를 같이 가르치다."라고 할 수 있고, 국어 선생님의 가르치다는 "책을 읽은 후, 내용을 설명해서 가르치다." 라고 할 수 있습니다. 학교는 "가르치다"만 있는 것입니다.

 

그래서 함수 이름만 존재하게 됩니다. => 가르치다 ( ) = 0;    (C++표현입니다.)

 

ex)

 

Abstract Teacher

가르치다 = 0;

class jy : public Teacher

{

        가르치다(  )

{

 


함수 선언과 구현

 

  class Teacher(  )                                

        {

                   생성자

                   소멸자

                   멤버함수(메소드)

          }

 

멤버함수( )  => 선언

{

    =>구현

}