개요
이번 주제는 인터페이스에 대한 내용이다. 많은 책을 통해 인터페이스에 대해 공부를 했고, 개념을 명확이 잡으려고 노력했었다. 그리고 현재 프로젝트를 진행할 때 인터페이스 클래스를 도입해서 사용하고 있다. 그런데 막상 누군가가 인터페이스를 왜 사용해야 되는가? 목적인 뭔가? 라고 물어봤을 때 명쾌한 답을 할 수 없었다. 그래서 다시 한번 상기하는 의미에서 implements 라는 키워드와 함께 사용되는 인터페이스에 대해서 알아보도록 하겠다.
인터페이스를 사용하는 이유는 크게 두가지로 분류해본다. 이 내용은 내가 책을 통해 습득한 인터페이스 용도에 대한 지극히 개인적인 글이기 때문에 혹시 이 글을 읽다가 잘못된 내용이 있다면 바른 지적 부탁드립니다. ^^:
인터페이스의 핵심기능 하나
객체가 다양한 데이터타입을 사용할 수 있도록 만들어 주는 기능이다. 그럼 왜 하나의 객체가 다양한 타입이 필요할까? 그 이유는 아래 예제처럼 데이터타입이 다른 객체가 하나의 공통된 변수를 사용한다고 생각해보자.
예제)
var item: 데이터타입;
swich( code )
{
case "1":
item = new 호랑이();
break;
case "2":
item = new 토끼();
break;
case "3":
item = new 사자();
break;
}
위 상황에서 item 타입을 어떻게 결정해야 할지 고민이 될것이다. 간단한 방법으로 와일드 카드 '*' 곱하기 표시를 해도 된다. 하지만 이 방법은 좋지 않다. 그 이유에 대해서는 잠시 후에 설명하기로 한다.
하나의 변수에 다양한 변수의 타입을 넣기 위해서는 뭔가 공통적인 데이터타입이 필요하다. 클래스가 자기 자신의 타입외에 다른 데이터타입을 갖기 위해서는 두가지 방법이 있다. 하나는 extends 키워드를 이용한 부모클래스를 상속받는 것이요, 다른 한가지는 implements 키워드를 이용한 인터페이스(구현) 상속이다. 전자인 extends 키워드는 약간에 문제가 있다. 호랑이, 토끼, 사자 클래스 각각의 부모클래스 용도가 같을 경우엔 상관없지만, 다르다면 데이터타입을 빌려 쓰기위한 용도로 전락할 수 있기 때문이다. 문제가 된다. 그 이유에 대해서는 is a 상속에 대해서 더 알아보기 바란다.^^::
그래서 각각의 호링이, 토끼, 사자가 가지고 있는 공통적인 특징을 찾아서, 데이터타입을 만들어 줘야한다. 바로 있때 공통적으로 사용할 수 있는 인터페이스를 정의해서 각각 클래스가 상속받게 하고, item 변수의 타입을 인터페이스 타입으로 맞춰주면 된다. 아래 구현예제를 참고
예제)
//각각 클래스는 공통타입을 갖기 위한 IAnimal 인터페이스를 상속한다.
interface IAnimal
{
//동물이 갖고 있는 공통적인 행동을 메서드로 정의한다.
function move(): void;
function eat(): void;
}
호랑이 implements IAnimal;
토끼 implements IAnimal;
사자 implements IAnimal;
//각각 타입을 모두 수용할 수 있는 공통타입을 IAnimal 로 설정한다.
var item: IAnimal;
//해당 코드에 맞는 객체를 item에 저장한다.
swich( code )
{
case "1":
item = new 호랑이();
break;
case "2":
item = new 토끼();
break;
case "3":
item = new 사자();
break;
}
return item;
이렇게 인터페이스를 사용해서 각각의 다른 타입들을 공통특징을 갖는 동일한 타입으로 만들어 주므로써, 하나의 변수에 다양한 객체를 저장하여 사용할 수 있게 만들어 줍니다.
인터페이스의 핵심기능 두울
유지보수 시 클래스 용도를 쉽게 파악할 수 있다. 조금 전 '와일드 카드'를 이용해서 타입을 지정하는 방식은 좋지 않다'라고 얘기를 했다. 어떤 부분에 문제가 있을까? 바로 유지보수 측면에서 문제가 있을 수 있다고 생각한다. 예를 들어서 A라는 개발자가 호랑이, 토끼, 사자 클래스를 개발해서 사용을 했고, 개인사정으로 B라는 개발자에게 해당 프로젝트를 인수인계를 했다. 그리고 B라는 개발자가 각각 클래스를 이용하려고 한다고 가정해보자.
우선 해당 객체의 기능을 알기위해 각각의 클래스를 열어서, 외부에 제공된 메서드를 파악해야되는데 인터페이스가 없으면 일일이 public 키워드를 사용한 메서드를 파악해 가면서 확인을 해야한다. 이렇게 되면 몇가지 문제가 발생하는데, B입장에선 해당 객체의 기능을 파악하는데 시간이 오래걸린다는 것과, 각각의 클래스에서 제공되는 메서드가 공통적으로 구현되있는지 파악하기가 어렵게 되고, 사용 시 메서드 실행 에러가 발생될 확률이 높아진다.
이럴 때 인터페이스를 사용하면 각 클래스들의 골격을 제공해 주므르써 공개된 메서드를 쉽게 파악할 수 있게 해준다.
여기까지가 지금 내가 알고 있는 인터페이스를 사용하는 목적이다.
'액션스크립트 3.0' 카테고리의 다른 글
메모리최적화 : 풀링기법 (0) | 2011.08.13 |
---|---|
문자열을 이용한 함수제어법 (0) | 2010.11.21 |
디스플레이 엔진 : Vector기반 Blitting 구현하기 (0) | 2010.10.25 |
디스플레이 엔진 : Bitmap기반 Blitting 구현하기 (0) | 2010.10.25 |
렌더링 최적화 : 성능에 따른 렌더링 주기 조정 (0) | 2010.10.25 |