#018. Interface (인터페이스) 알아보기...
1. 인터페이스의 특징은 추상메서드 와 상수 만 가질 수 있다. 이전시간에 알아봤듯이 추상(abstract)메서드의 특징상 상속받는 자식은 꼭 같은 이름으로 오버라이딩을 사용해 구현을 해야 한다. (구현하지 않으면 컴파일이 안 된다.)
인터페이스끼리는 다중상속(extends)이 가능하며, 클래스에서 여러개의 인터페이스를 구현 (implements) 할 수 있다.
2. 이번 시간엔 interface 를 테스트 하기 위해 아래와 같은 작업을 할 것이다.
1. MP3를 듣기 위해서는 play(), stop() 기능이 필요하다. 2. IPod 의 클래스를 만들어 이곳 저곳에 사용을 하고 싶다. IPod에는 MP3 기능을 구현해야 한다. 3. MP3Player 의 클래스는 IPod의 MP3 기능을 사용하려고 한다. 1번: MP3 Class를 Interface로 구현한다. 2번: IPod Class를 만들고 MP3 Interface Class를 implements 한다. 3번: MP3Player Class를 만들고 MP3에 IPod 객체를 생성해서 사용한다. |
3. 위 가정을 생각하며, oop2 패키지에 MP3.java / IPod.java / MP3Player.java 를 구현 해보자.
1) MP3 Class (MP3.java)
코드 | package oop2; // MP3은 인터페이스로 구현이 되었습니다. public interface MP3 {
// 플레이 기능 public abstract void play();
// public abstract 생략 가능.. 추상이 아닌것은 사용할수 없기에 생략이 가능함. void stop();
} |
설명 | 문장3: interface Class 임을 정의한다. 문장6: 추상(abstract)메서드 play를 만든다 문장9: interface 특성상 추상 메서드만 존재하기 때문에 public abstract 를 생략이 가능하다. |
2) IPod Class (IPod.java)
코드 | package oop2; // IPod 는 MP3의 인터페이스를 구현 합니다. public class IPod implements MP3{ @Override public void play() { System.out.println("음악을 플레이합니다."); } @Override public void stop() { System.out.println("음악을 멈춥니다."); } } |
설명 | 문장3: MP3 Interface Class 를 사용한다고 선언을 한다. 문장5,9: MP3 클래스에서 선언된 play, stop 각 메서드를 재정의(오버라이딩) 한다. 이때 추상(abstract)메서드 특성상 재정의 하지 않으면 컴파일이 안 된다. |
3) MP3Player Class (MP3Player.java)
코드 | package oop2; public class MP3Player { public static void main(String[] args) { MP3 mp3;
mp3 = new IPod(); mp3.play(); mp3.stop(); } } |
설명 | 문장6: mp3 의 객체에 IPod 으로 부터 객체를 생성한다.(upcasting) 문장7,8: Overriding의 특성상 자식의 메서드를 호출한다. IPod에 정의된 play, stop 메서드를 호출한다. |
4. 그런데.. 두둥....
1. IPotTouch 가 등장 했다. 우리는 IPodTouch 에도 MP3 기능을 구현해야 한다. 하지만, IPotTouch에는 더 좋은 뮤직비디오를 play, stop 할 수 있다. 2. MP3Player 의 클래스는 IPodTouch의 MP3 기능을 사용하려고 한다. 1번: IPodTouch Class를 만들고 MP3 Interface Class를 implements 한다. 2번: MP3Player Class를 만들고 MP3에 IPodTouch 객체를 생성해서 사용한다. |
5. 위 추가된 가정을 생각하며, oop2 패키지에 IPodTouch.java / MP3Player.java 를 구현 해보자.
1) IPodTouch Class (IPodTouch.java)
코드 | package oop2; // IPodTouch 는 MP3의 인터페이스를 구현 합니다. public class IPodTouch implements MP3 { @Override public void play() { System.out.println("뮤직비디오를 플레이 합니다."); } @Override public void stop() { System.out.println("뮤직비디오를 멈춥니다."); } } |
설명 | 문장3: MP3 Interface Class 를 사용한다고 선언을 한다. 문장5,9: MP3 클래스에서 선언된 play, stop 각 메서드를 재정의(오버라이딩) 한다. 이때 추상(abstract)메서드 특성상 재정의 하지 않으면 컴파일이 안 된다. |
2) MP3Player Class (MP3Player.java)
코드 | package oop2; public class MP3Player { public static void main(String[] args) { MP3 mp3;
mp3 = new IPod(); mp3.play(); mp3.stop(); // 위 코드 변경된 내용 없음.. mp3 = new IPodTouch(); mp3.play(); mp3.stop(); } } |
설명 | 문장10: mp3 의 객체에 IPodTouch 로 부터 객체를 생성한다.(upcasting) 문장11,12: Overriding의 특성상 자식의 메서드를 호출한다. IPod에 정의된 play, stop 메서드를 호출한다. |
위 예제를 보면 IPod 을 사용하다가, IPodTouch 로 변경이 되었을 경우, 기존 돌아가는 소스를 변경하지 않고, 새로운 기능을 추가가 가능하다는 것을 볼 수가 있다.
다음 시간엔 final 예약어에 대해서 알아보자..
잡담: 점점 어려워지네요 ^^; 자자.. oop 의 끝이 보입니다. 오늘도 새벽 1:10분 이네요ㅠ
모두 자바로 개발할 수 있는 그날까지 화이팅 ^^!
'Developer > Java-oop' 카테고리의 다른 글
#020. Collection Set / List / Map 알아보자... (0) | 2011.04.08 |
---|---|
#019. final 예약어 알아보기... (0) | 2011.04.08 |
#017. abstract (추상화) 알아보기... (0) | 2011.04.06 |
#016. method overriding (메서드 재정의) 알아보기... (0) | 2011.04.01 |
#015. upcasting / downcasting 알아보자... (0) | 2011.03.31 |