brunch

You can make anything
by writing

C.S.Lewis

인터페이스 - 1

* 이 내용은 철저히 초심자를 위해 알기 쉽게 설명하는 것을 목적으로 하고 있습니다.

* 더 정확하고 자세한 개념은 다른 고수님들의 글들을 참고하시길 바랍니다.

* 그리고 이 글에서는 코드 최소한으로 다루고 있습니다.


이번엔 추상화를 구현하기 위한 두 번째 수단인 인터페이스를 알아보겠습니다.

인터페이스는 API에서 한번 다뤘던 내용인데 다시 한번 상기해 볼까요?


인터페이스는 실제로 하면 복잡한 일을 간단히 할 수 있도록 만들어놓은 어떤 장치를 의미한다고 했습니다.

그래서 브레이크의 예를 들었습니다. 

차를 세우고 싶을 때 페달을 밟으면 차를 세우는 어려운 일을 할 수 있었죠?

잘 생각해 보면 차를 세울 때 ‘브레이크를 밟는다.’ 고 표현을 합니다.

대부분의 양산차들은 브레이크를 밟으니까요.


즉, 밟는다 라는 규격이 정해진 것이죠.

그리고 브레이크라는 인터페이스를 사용하기 위해서는 밟는 행위를 할 수 있도록 만들어야 합니다.


이런 규격을 만드는 행위는 추상클래스로도 얼마든지 가능합니다.


물론 인터페이스로도 가능하고요. 

추상클래스와 인터페이스, 같은 듯 다른 둘의 차이점을 한번 살펴보겠습니다.


우선 다이어그램을 살펴보자면 위는 Break 클래스를 BreakPedal 클래스가 상속받아 오버라이드 했습니다.

아래는 Break 인터페이스를 BreakPedal 클래스가 구현받아 오버라이드 했습니다.

이렇게 둘의 용어와 다이어그램상 표시가 다릅니다.


코드로도 볼까요?

추상 클래스는 우리가 앞에서 살펴봤던 대로 abstract라는 키워드가 class 앞에 붙게 됩니다.

하지만 인터페이스는 interface라는 키워드만 붙게 됩니다.

그리고 추상 클래스에서는 추상 메서드에 abstract라는 키워드가 붙지만 인터페이스는 붙지 않습니다.


이번에는 추상 클래스나 인터페이스를 사용하는 클래스들을 비교해 보겠습니다.

추상 클래스는 상속을 받기에 extends 키워드를 사용하지만, 인터페이스는 구현받는다고 하여 implements라는 키워드를 사용합니다.


추상 클래스로도 규격을 만들 수 있는데 굳이 인터페이스를 만든 이유가 무엇일까요?

그 이유는 인터페이스와 클래스의 개념이 다르기 때문입니다.

클래스는 분류를 위해 만든 개념이지만, 인터페이스는 어떤 접점과 규격을 위해 만들어진 개념입니다.

이 개념은 처음엔 사소하지만 뒤로 갈수록 엄청난 차이라는 걸 여러분도 느끼게 되실 겁니다.


추상클래스와 인터페이스의 차이를 설명하기 위해 간단한 예를 하나 들어보겠습니다.

사용자가 PC에 입력하여 무언가를 사용하는 장치는 무엇이 있을까요? 바로 키보드와 마우스 일 것입니다.

이 녀석들은 PC에 어떤 문자나 실행에 대한 신호를 간단하게 버튼을 클릭하거나 특정 키를 타이핑하여 보내는 인터페이스입니다.

그래서 마우스는, 마우스의 움직임과 클릭이라는 규격을 가지고 있고, 키보드는 키를 타이핑하는 규격을 가지고 있습니다.


이 규격을 추상 클래스로 만들어 보겠습니다.

클래스는 분류의 개념이기에 한 번에 하나의 분류만 상속받을 수 있다고 하였습니다.

그래서 규격이 여러 개가 될수록 상속을 해야 하는 횟수가 많아집니다.

규격이라는 게 하나만 들어가는 게 아닌데 이럴 때 난감합니다.


하지만 인터페이스는 필요한 규격을 모듈처럼 가져다 쓰는 개념입니다.

그렇기 때문에 스펙상으로만 정해져 있는 규격들을 조합하여 실제로 ‘구현’ 하는 것이죠.

그래서 한 번에 여러 인터페이스를 가져다 구현하는 것이 가능합니다.


그래서 이렇게 다중 구현이 가능합니다.


그 외에 다른 차이점도 확인해 보겠습니다.

표를 보면 새로운 사실들을 알 수 있습니다.

우선 인터페이스는 객체화가 불가능하네요.

이유는 표준만 잡아 놓은 개념이기에 이것을 복사해서 쓴다기보다는 가져다가 참조해서 쓰기 때문이죠.

그리고 인터페이스에서는 기본 메서드가 추상메서드 이기 때문에, 일반 메서드를 사용할 수 없습니다.

그리고 static 이 붙은 정적(static) 메서드도 사용이 불가합니다.


하지만 자바 1.8 버전이 되면서 몇 가지 변화가 생겼습니다.

바로 일반 메서드와 정적 메서드에 대한 내용입니다.


변화 사항을 눈으로 확인해 보시죠!

왼쪽은 1.8 이전의 내용이고, 오른쪽은 1.8 버전부터 변화된 내용입니다.

이로써 추상 클래스와 인터페이스 와이 차이점은 보다 줄어들었습니다.


이렇게 인터페이스의 개념에 대해서 다시 한번 알아보고, 추상 클래스와의 차이점에 대해서도 알아보았습니다.

개념들이 많이 나오다 보니 다소 헷갈리고 머리 아플 수 있습니다.

하지만 하나씩 살펴보고, 한번 나왔던 개념들은 나시 확인해 보면 점점 이해가 될 것입니다.

무엇보다 우리가 배우는 이 OOP의 4대 특성은 앞으로도 계속 등장할 예정입니다.

그렇기 때문에 계속 이 내용을 읽다 보면 저절로 복습이 될 것이니 당장 이해가 안 된다고 포기하지 마세요.

매거진의 이전글 추상클래스
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari