본문 바로가기

Programming/JAVA

인터페이스(1) - 인터페이스의 역할

java logo image

 

 

 

개인적으로 자바의 '인터페이스(interface)' 개념은 꽤 복잡하고, 대충 넘어가다 보면 이해하기 어렵다는 인상을 많이 받습니다. 일단 추상 클래스/메서드에서부터 시작된 설계를 위한 개념에 가깝고, 지금까지 배운 대부분의 객체와 설계구조가 복합적으로 들어가 있는 성질에 가깝기 때문입니다.

 

클래스나 추상 클래스를 학습할 때는 (초심자 입장에서) 꽤 일관적인 원칙을 이해하면 됐지만, 인터페이스는 그야말로 지금까지 배운 JAVA의 언어 구조를 잘 이해하고 있다는 가정 하에 사용되는 기능이기 때문에 앞서 학습한 내용이 잘 기억나지 않는다거나 이해하지 못한 상태라면 금방 벽에 부딪힐 수 있습니다. 이해하기 어려운 개념이 나오거나, 이전에 배운 개념이 잘 생각나지 않는다면 지체 없이 앞에서 배운 내용을 다시 복습하는 것이 좋습니다. 

 

 

 


 

 

인터페이스는 어쩌면 "중개사"의 역할을 한다고 봐야할 것 같습니다. 통상적으로 JAVA의 인터페이스를 "객체 인스턴스의 사용 방법을 정의한" 타입이라고 부릅니다(물리적 레벨로 보았을 때는 클래스와 비슷한 수준의 레벨입니다).

 

만일 개발 코드에서 인터페이스의 메서드를 호출하게 되면, 그 인터페이스는 대상이 되는 객체의 메서드를 호출하게 됩니다. 그러면 객체는 그 리턴 값을 인터페이스에 전달하고, 리턴 값은 인터페이스를 통해 다시 개발코드에 전달하게 됩니다. 마치 중개사 같죠? 그래서 굳이 비유하자면, 개발 코드 레벨에서는 굳이 그 객체의 구조를 알아볼 필요 없이 인터페이스의 메서드만 알고 있으면 메서드를 정상적으로 사용할 수 있게 됩니다. 

 

하지만, 굳이 이런 방식이 왜 필요할까요? 우리는 이제까지 클래스의 인스턴스를 생성해 잘만 코드를 실행해 왔는데 말이죠. 사실 인터페이스의 사용 목적도 결국 일종의 '모듈화' 혹은 '다형성'의 성질을 활용하기 위한 개념입니다. 즉, 우리가 어떤 메서드를 호출하는 개발 코드를 건드리지 않으면서도 해당 코드가 호출하는 인스턴스를 변경할 수 있도록 하기 위해서입니다. 하나의 인터페이스가 어떤 인스턴스를 사용하는지 여부에 따라 실행 결과, 리턴 값이 달라지기 때문에 코드 입장에서는 코드 변경 없이 다양한 결과를 얻을 수 있게 되는 것이지요. 

 

 

'중개사' 인터페이스

 

 

인터페이스는 학습해야 할 레벨은 '클래스'와 물리적으로 비슷하기 때문에, 선언부터 사용 가능한 데이터의 형태까지 꽤 많은 내용을 다루어야 하므로, 다음 아티클부터 하나씩 살펴보도록 하겠습니다. 특히 추상 클래스/메서드, 다형성 관련 성질, 상속 관련 개념들이 대부분 다시 소환되는 구조이기 때문에 앞의 내용들을 잘 복습하고 따라오시기 바랍니다.

 

인터페이스 학습 이후에는 좀 더 응용된 중복 클래스/인터페이스까지 내용이 이어지기 때문에 소홀히 학습해서는 안 되는 부분입니다.