예전부터 인터페이스라는 것을 잘 이해를 못하고 있었는데...이번 안드로이드 앱 개발하면서 인터페이스가 하도 여기저기 나와서... 자료를 찾아본 결과..
인터페이스라는 것은 각기 다른 경우에서 같은 동작에 대해 각각 다른 기능을 부여할 때 코드를 줄일 수 있게 해준다...라는 생각에 도달했는데요...
음.. 예를 들면 버튼이 4개 있고(각기 다른경우), 각 버튼을 클릭(같은 동작)하면 각각 A, B, C, D 액티비티로 넘어가는(각각 다른 기능) 코드를 만든다고 생각하면요...
public class A extends Activity
{
findViewById(버튼리소스1).setOnClickListener(new 리스너{onClick(View v){}});
findViewById(버튼리소스2).setOnClickListener(new 리스너{onClick(View v){}});
findViewById(버튼리소스3).setOnClickListener(new 리스너{onClick(View v){}});
findViewById(버튼리소스4).setOnClickListener(new 리스너{onClick(View v){}});
}
이렇게 해야 할 코드를
public class A extends Activity implements View.OnClickListener
{
findViewById(버튼리소스1).setOnClickListener(this);
findViewById(버튼리소스2).setOnClickListener(this);
findViewById(버튼리소스3).setOnClickListener(this);
findViewById(버튼리소스4).setOnClickListener(this);
public void onClick(View v)
{
//if 나 switch로 v가 어떤 버튼인지 체크한후 그에 따른 코드 작성
}
}
이렇게 줄일 수 있다는 거죠... 인터페이스라는 것이 이런 경우를 위해 만들어진 건가요..?
물론 onClick()으로 넘어간 View v의 리소스를 추적해서 switch 문으로 분기해서 행동을 지어주면 되긴합니다만
어쨌든
자바에서는 다중상속을 허용하지 않습니다. 상속 트리가 다이아몬드 방식으로 되면 문제가 발생할 수 있습니다.
버튼을 클릭했을때 프로그래머 니가 하고 싶은 행동이 뭔지 구현해서 나(버튼)에게 주는데 그형태는 OnClickListener 형태로 줘 라는 의미라고 생각하면 될듯합니다.
그럼 버튼이 있는곳에서는 사용자의 클릭이 감지 되었을때 사용자가 addOnClickListener()로 넣어준 모든 리스너의 onClick() 메서드를 호출하게 되죠 그럼 버튼을 클릭했을때 사용자가 구현한 내용의 코드가 실현되게 되는겁니다.
사람, 자동차, 행성 등과 같은 객체가 있을때 각각은 사람, 자동차, 행성에 대한 클래스를 상속합니다.
그런데 이 객체들은 다 움직일 수 있습니다. 여기에서 각각의 객체에서 그런 움직임에 관한 것들을 처리해줘도 되겠지만
moveable 이라는 인터페이스를 만들고 moveTo(x,y)와 같이 메소드를 지정해놓으면
각각의 객체에 이 인터페이스만을 구현해주게되면 외부에서는
사람.moveTo(), 자동차.moveTo() 등과 같이 다형성을 이용해서 하나의 움직일 수 있는 특징을 사용하게 되는 거죠.
여러가지 특징의 다형성을 구현하고 싶을때 이렇게 인터페이스를 쓰는 것 같습니다.
여러가지 특징을 다중상속 하는 것이 아닌 여러가지 인터페이스를 구현해서 사용하게 되는 거죠.
자바에서도 비슷한 예인, drawable, runnable등이 있는데요.
runnable 인터페이스만 구현해주면 쓰레드를 만들 수 있게 되는거죠, 동시에 다른 인터페이스를 구현해주면
그클래스는 쓰레드를 구현하면서 다른 특징들을 구현할 수 있게 됩니다.
위에서 말씀하신 listener도 그 인터페이스만 구현해주면 다른 작업없이도 그런 특징을 구현할 수 있는거구요.
위처럼 더 중요한 개념이 있겠지만 제생각으로 결과적으로는 노력과 코드도 줄일 수 있겠네요.