[기본 개념] 2 | (7.1) 인터페이스 상속, 구현, 다중상속

728x90

[기본 개념] 2 | (7.1) 인터페이스 상속, 구현, 다중상속

1> 인터페이스란?

2> 인터페이스의 작성

3> 인터페이스의 상속

4> 인터페이스의 구현

5> 인터페이스를 이용한 다중상속

6 인터페이스를 이용한 다형성

7 인터페이스의 장점

8 인터페이스의 이해

9 디폴트 메서드

1. 인터페이스란?

 인터페이스는 일종의 추상 클래스이다. 인터페이스는 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있다.

 

 인터페이스도 추상클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기보다는 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다.

2. 인터페이스의 작성

 class대신 interface를 사용한다는 것만 다르고 클래스를 작성하는 것과 같다. 그리고 인터페이스에도 접근제어자로 public 또는 default를 사용할 수 있다.

 

interface 인터페이스이름 {

        public static final 타입 상수이름 = 값 ;

        public abstract 메서드이름(매개변수목록) ;

}

 

일반적인 클래스의 멤버들과 달리 인터페이스의 멤버들은 다음과 같은 제약사항이 있다.

 

- 모든 멤버변수는 public static final이어야 하며, 이를 생략할 수 있다.

- 모든 메서드는 public abstract이어야 하며, 이를 생략할 수 있다.

 

생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가해준다.

3. 인터페이스의 상속

 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러 개의 인터페이스로부터 상속을 받는 것이 가능하다.

 

        interface Moveabe {

            /* 지정된 위치(x, y)로 이동하는 기능의 메서드 */

            void move(int x, int y) ;

        }

 

        interface Attackabe

            /* 지정된 대상(u)를 공격하는 기능의 메서드 */

            void attack(Unit u) ;

        }

 

        interface Fightable extends Movable, Attackable { }

 

 Fightable자체에는 정의된 멤버가 하나도 없지만 조상 인터페이스로부터 상속받은 두 개의 추상메서드, move(int x, int y)와 attack(Unit u)를 멤버로 갖게 된다.

4. 인터페이스의 구현

 인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없으며, 구현한다는 의미의 키워드 'implements'를 사용한다.

 

class 클래스이름 implements 인터페이스이름 {

        // 인터페이스에 정의된 추상메서드를 구현해야 한다.

}

 

만일 구현하는 인터페이스의 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야 한다.

5. 인터페이스를 이용한 다중상속

 인터페이스는 static상수만 정의할 수 있으므로 조상클래스의 멤버변수와 충돌하는 경우는 거의 없고 충돌한다 하더라도 클래스 이름을 붙여서 구분이 가능하다. 그리고 추상메서드는 조상클래스의 메서드와 선언부가 일치하는 경우에는 조상 클래스 쪽의 메서드를 상속받으면 되므로 문제되지 않는다.

 

 만일 두 개의 클래스로부터 상속을 받아야 한다면, 두 조상클래스 중에서 비중이 높은 쪽을 선택하고 다른 쪽을 포함시키는 방식으로 하거나 필요한 부분을 뽑아서 인터페이스로 만든 다음 구현하도록 한다.

 

 예를 들어, Tv클래스와 VCR클래스가 있을 때, TVCR클래스를 작성하기 위해 한쪽만 선택하여 상속받고 나머지 한쪽은 클래스 내에 포함시켜서 내부적으로 인스턴스를 생성해서 사용하도록 한다.

 

        public class Tv {

            protected boolean power ;

            protected int channel ;

            protected int volume ;

 

            public void power( )           { power = !power ; }

            public void channelUp( )     { channel++ ; }

            public void channelDown( )  { channel-- ; }

            public void volumeUp( )      { volume++ ; }

            public void volumeDown( )  { volume -- ; }

        }

 

        public class VCR {

            protected int counter ;    // VCR의 카운터

            public void play( ) {

                // Tape를 재생한다.

            }

 

            public void stop( ) {

                // 재생을 멈춘다. 

            }

        }

 

VCR클래스에 정의된 메서드와 일치하는 추상메서드를 갖는 인터페이스를 작성한다.

 

        public interface IVCR {

            public void play( ) ;

            public void stop( ) ;

        }

 

 이제 IVCR 인터페이스를 구현하고 Tv클래스로부터 상속받는 TVCR클래스를 작성한다. 이때 VCR클래스 타입의 참조변수를 멤버변수로 선언하여 IVCR인터페이스의 추상메서드를 구현하는 데 사용한다.

 

        public class TVCR extends Tv implements IVCR {

            VCR vcr = new VCR( ) ;

 

            public void play( ) {

                vcr.play( ) ;

            }

 

            public void stop( ) {

                vcr.stop( ) ;

            }

        }

 

 

 

 

 

출처 | Java의 정석 (남궁 성)

 

728x90