ToBe끝판왕

[ JAVA ] 인터페이스( Interface ) 본문

■ 프로그래밍 SKILLS/JAVA

[ JAVA ] 인터페이스( Interface )

업그레이드중 2022. 5. 24. 17:04
반응형

 


 

인터페이스

•  자식클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 된다.

   But, 클래스를 이용하여 다중 상속을 할 경우, 메서드 출처의 모호성 등 여러가지 문제가 발생할 수 있어

   자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.

•  하지만, 다중 상속의 이점을 버릴 수는 없기에, 자바에서는 인터페이스라는 것을 통해 다중상속을 지원하고 있다.

•  인터페이스( Interface )란 다른 클래스를 작성할 때, 기본이 되는 틀을 제공, 다른 클래스 사이의

    중간 매개 역할까지 담당하는 일종의 추상클래스 이다.

•  인터페이스( Interface ) 는 오로지 추상 메서드와 상수만을 포함할 수 있다.

   ( 추상클래스는 추상메서드 / 생성자 / 필드 / 일반메서드 포함 가능 )

•  인터페이스를 구현하는 구현 클래스로부터 생성된 객체들의 기능들을 코드의 수정없이 간편하게 사용하기 위함이다.

 

▶  인터페이스의 선언

•  인터페이스 선언

접근제어자 interface 인터페이스 이름 {
   // 상수
   public static final 타입 상수이름 = 값;
   ...

   // 추상 메서드
   public abstract 메서드이름( 매개변수 목록 );
   ...
}

※ 인터페이스 선언시, 접근제어자와 함께 interface 키워드를 사용한다.
※ 인터페이스의 모든 필드는 public static final 이어야 하며, 모든 메서드는
   public abstract 이어야 한다. ( 모든 인터페이스 공통 적용 )
※ 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

 

•  예시( 상수 필드 선언 )

 
•  인터페이스 상수 필드 선언

public interface RemoteControl {
   public int MAX_VOLUME = 10;
   public int MIN_VOLUME = 0;
}

※ 실행 시, 데이터를 저장할 수 있는 인스턴스 or 정적 필드 선언 불가능
   but, 상수는 선언 가능
※ 상수는 public static final 로 선언하지만, 이를 생략해도 자동적으로 인터페이스
   내에 붙게 된다.

 

•  예시( 추상 메서드 선언 )

 
•  인터페이스 추상 메서드 선언

public interface RemoteControl {
   // 상수 선언
   public int MAX_VOLUME = 10;
   public int MIN_VOLUME = 0;

   // 추상 메서드
   public void turnOn();
   public void turnOff();
   public void setVolume( int volume );
}

※ 추상메서드 선언은 리턴타입 / 메서드 이름 / 매개변수만 기술
   ( 중괄호 필요 X )
※ 추상 메서드 모두 public abstract의 특성 갖기 때문에, 생략해도
   컴파일 과정에서 자동으로 붙는다.

 

 

▶  인터페이스의 구현

•  개발 코드가 인터페이스 메서드를 호출하면, 인터페이스는 객체의 메서드를 호출

•  객체는 인터페이스에서 정의된 추상메서드와 동일한 메서드 이름 / 매개타입 / 리턴타입을 가진 실체 메서드를

    가지고 있어야 한다.

•  이러한 객체를 인터페이스의 구현객체( Implement ) 라고 하며, 구현객체를 생성하는 클래스를 구현클래스라고 한다.

•  구현클래스

•  구현 클래스 선언

public class 구현클래스 이름 implements 인터페이스 이름 {
    // 인터페이스에 선언된 추상 메서드의 실체 메서드 선언
}

※ 인터페이스의 모든 메서드는 기본적으로 public 접근 제한을 가지기 때문에
   public 보다 더 낮은 접근제한으로는 작성 X

 

•  예시

•  인터페이스 선언

public interface RemoteControl {
   // 상수 선언
   public int MAX_VOLUME = 10;
   public int MIN_VOLUME = 0;

   // 추상 메서드
   public void turnOn();
   public void turnOff();
   public void setVolume( int volume );
}

 

•  구현 클래스 1

public class Television implements RemoteControl [
    // 필드
    private int volume;

    @Override
    public void turnOn() {
      System.out.println( "TV를 켭니다." );
    }

    @Override
    public void turnOff() {
      System.out.println( "TV를 끕니다." );
    }

    @Override
    public void setVolume( int volume ) {
      if( volume > RemoteControl.MAX_VOLUME ) {
          this.volume = ReomoteControl.MAX_VOLUME;
      } else if( volume < RemoteControl.MIN_VOLUME ) {
          this.volume = RemoteControl.MIN_VOLUME;
      } else {
          this.volume = volume;
      }

      System.out.println( "현재 TV 볼륨 : " + this.volume );
    }
}

 

•  구현 클래스 2

public class Audio implements RemoteControl [
    // 필드
    private int volume;

    @Override
    public void turnOn() {
      System.out.println( "Audio를 켭니다." );
    }

    @Override
    public void turnOff() {
      System.out.println( "Audio를 끕니다." );
    }

    @Override
    public void setVolume( int volume ) {
      if( volume > RemoteControl.MAX_VOLUME ) {
          this.volume = ReomoteControl.MAX_VOLUME;
      } else if( volume < RemoteControl.MIN_VOLUME ) {
          this.volume = RemoteControl.MIN_VOLUME;
      } else {
          this.volume = volume;
      }

      System.out.println( "현재 Audio 볼륨 : " + this.volume );
    }
}

 

•  실행 클래스

public class RemoteContorlExample {
   public static void main( String[] args ) {
       RemoteControl rc;

       rc = new Television();
       rc = new Audio();
   }
}

※ 구현클래스가 작성되면, new 연산자로 구현클래스의 객체 생성 가능
※ 인터페이스 변수는 참조타입이기 때문에, 구현 객체가 대입될 경우
   객체의 번지를 저장한다.

 

 

 

▶  다중 인터페이스 구현 클래스

•  인터페이스 A와 인터페이스 B

-  객체의 메서드를 호출할 수 있으려면, 객체는 이 두 인터페이스를 모두 구현해야한다.

-  다중 인터페이스를 구현할 경우, 구현 클래스는 모든 인터페이스의 추상메서드에 대해 실체 메서드를 작성해야 한다.

•  예시

•  구현클래스 작성

public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
    // 인터페이스 A에 선언된 추상메서드의 실체메서드 선언
    // 인터페이스 B에 선언된 추상메서드의 실체메서드 선언
}

 

•  새로운 인터페이스 정의

public interface Searchable {
    void search( String url );
}

•  다중 인터페이스 구현하는 구현클래스 작성

public class SmartTelevision implements RemoteControl, Searchable {
    // 필드
    private int volume;
 
    @Override
    public void turnOn() {
       System.out.println( "TV를 켭니다." );
    }

    @Override
    public void turnOff() {
       System.out.println( "TV를 끕니다." );
    }

    @Override
    public void setVolume( int volume) {
       if( volume > RemoteControl.MAX_VOLUME ) {
             this.volume = RemoteControl.MAX_VOLUME;
       } else if( volume < RemoteControl.MIN_VOULUME ) {
             this.volume = RemoteControl.MIN_VOLUME;
       } else {
             this.volume = volume;
       }
       System.out.println( "현재 TV 볼륨: " + this.volume );
    }

    @Override
    public void search( String url ) {
       System.out.println( url + " 을 검색합니다." );
    }
}

•  구현 객체 인터페이스 변수에 대입

public class SmartTelevisionExample {
    public static void main( String[] args ) {
        SmartTelevision tv = new SmartTelevision();

        RemoteControl rc = tv;
        Searchable searchable = tv;
    }
}

 

 

 

▶  인터페이스의 사용

•  클래스를 선언할 때, 인터페이스는 ( 필드, 생성자 ) 또는 ( 메서드의 매개변수, 생성자 ) 또는 ( 메서드의 로컬변수 ) 로

   선언될 수 있다.

1) 인터페이스가 필드 타입으로 사용될 경우, 필드에 구현 객체를 대입할 수 있다.

2) 인터페이스가 생성자의 매개변수 타입으로 사용될 경우, new 연산자로 객체를 생성할 때 구현 객체를 생성자의

     매개값으로 대입 할 수 있다.

3) 인터페이스가 로컬 변수 타입으로 사용될 경우, 변수에 구현 객체를 대입할 수 있다.

4) 인터페이스가 메서드의 매개변수 타입으로 사용될 경우, 메서드 호출 시 구현 객체를 매개값으로 대입할 수 있다.

•  예제1

public class MyClass {
    // 필드1번
    RemoteControl rc = new Television();

    // 생성자 2번
    MyClass( RemoteControl rc ) {
       this.rc = rc;
    }

    // 메서드
    void methodA() {
       // 로컬변수 3번
       RemoteControl rc = new Audio();
    }
    // 메서드의 매개변수 타입 4번
    void methodB( RemoteControl rc ) {
    }
}
•  필드로 선언된 rc 사용 -- 1번

MyClass myclass = new MyClass();
myclass.rc.turnOn()           // Television의 turnOn() 실행
myclass.rc.setVolume(5);      // Television의 setVolume(5) 실행
•  생성자의 매개변수 타입 선언 rc 사용 -- 2번

MyClass( RemoteControl rc ) {
   this.rc = rc;
   rc.turnOn();
   rc.setvolume(5);
}
•  로컬변수로 선언된 rc 사용 -- 3번

void methodA() {
   RemoteControl rc = new Audio();
   rc.turnOn();          // Audio의 turnOn() 실행
   rc.setvolume(5);      // Audio의 setVolume(5) 실행
}
•  메서드의 매개변수 타입 선언 rc 사용 -- 4번

void methodB( RemoteControl rc ) {
   rc.turnOn()
   rc.setVolume(5);
}

 

•  예제2

•  실제 사용 예시

public class MyClass {
    // 필드
    RemoteControl rc = new Television();

    // 생성자
    MyClass() {}
  
    MyClass( RemoteControl rc ) {
       this.rc = rc;
       rc.turnOn();
       rc.setVolume(5);
    }

    // 메서드
    void methodA() {
        RemoteControl rc = new Audio();
        rc.turnOn();
        rc.setVolume(5);
    }
 
    void methodB( RemoteControl rc ) {
        rc.turnOn();
        rc.setVolume(5); 
    }
}
•  실행 클래스

public class myClassExample {
    public static void main( String[] args ) {
       System.out.println( "1번)----------------- );

       MyClass my1 = new MyClass();
       my1.rc.turnOn();
       my1.rc.setVolume(5);

       System.out.println( "2번)----------------- );
       
       myClass my2 = new MyClass( new Audio() );

       System.out.println( "3번)----------------- );

       MyClass my3 = new MyClass();
       my3.methodA();

       System.out.println( "4번)----------------- );

       MyClass my4 = new myClass();
       my4.methodB( new Television() );
    }
}
•  출력결과

1번)-------------------
TV를 켭니다.
현재 TV 볼륨 : 5
2번)-------------------
Audio를 켭니다.
현재 Audio 볼륨 : 5
3번)-------------------
Audio를 켭니다.
현재 Audio 볼륨 : 5
4번)-------------------
TV를 켭니다.
현재 TV 볼륨 : 5

 

반응형
Comments