본문 바로가기

Developer/Java-oop

#018. Interface (인터페이스) 알아보기...

#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분 이네요ㅠ

모두 자바로 개발할 수 있는 그날까지 화이팅 ^^!