ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [java] 인터페이스 사용법
    java 2023. 7. 1. 00:59

    전 포스팅과 이어지는 내용임

    https://lee-ding.tistory.com/13

     

    [java] 인터페이스

    인터페이스는 개발코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 추상 메소드를 호출하면, 인터페이스의 추상 메소드는 각 객체의 재정의된 실체메소드를 호출한

    lee-ding.tistory.com

     

    Television.java라는 구현 클래스가 있다고 해보자. 구현 클래스가 작성되면, new 연산자로 객체를 생성할 수 있다. 

    단순히 Television tv = new Television(); 과 같이 구현 객체를 생성한것이 인터페이스를 사용하였다고 볼 수는 없다.

    인터페이스로 구현 객체를 사용하려면, 인터페이스 변수를 선언하고 구현 객체를 대입해야한다.

     

     


    1. 인터페이스 선언

    package interface_Test;
    
    //interface : RemoteControl
    public interface RemoteControl {
        //상수 필드 선언
        public int MAX_VOLUME = 10;
        public int MIN_VOLUME = 0;
    
        //추상 메소드 선언
        public void turnOn();
        public void turnOff();
        public void setVolume(int volume);
    }

    2. 구현 클래스 선언

    package interface_Test;
    
    //구현 클래스 : Television
    public class Television implements RemoteControl{
        public int volume;
    
        //turnOn()의 실체 메소드
        public void turnOn(){
            System.out.println("TV를 켭니다.");
        }
    
        //turnOff()의 실체 메소드
        public void turnOff(){
            System.out.println("TV를 끕니다.");
        }
    
        //setVolume()의 실체 메소드
        public void setVolume(int volume){
            if(volume> RemoteControl.MAX_VOLUME){
                this.volume = RemoteControl.MAX_VOLUME;
            }
            else if(volume<RemoteControl.MIN_VOLUME){
                this.volume = RemoteControl.MIN_VOLUME;
            }
            else{
                this.volume = volume;
            }
            System.out.println("현재 TV 볼륨: "+this.volume);
        }
    
    }
    package interface_Test;
    
    //구현 클래스 : Audio
    public class Audio implements RemoteControl{
        public int volume;
    
        //turnOn()의 실체 메소드
        public void turnOn(){
            System.out.println("Audio를 켭니다.");
        }
    
        //turnOff()의 실체 메소드
        public void turnOff(){
            System.out.println("Audio를 끕니다.");
        }
    
        //setVolume()의 실체 메소드
        public void setVolume(int volume){
            if(volume> RemoteControl.MAX_VOLUME){
                this.volume = RemoteControl.MAX_VOLUME;
            }
            else if(volume<RemoteControl.MIN_VOLUME){
                this.volume = RemoteControl.MIN_VOLUME;
            }
            else{
                this.volume = volume;
            }
            System.out.println("현재 Audio 볼륨: "+this.volume);
        }
    
    }

     

     

    3. 인터페이스를 사용하기 위해서는 기본적으로 구현 객체가 인터페이스 변수에 대입되어야 한다. 

    다음은 인터페이스가 사용되는 4가지 방식을 설명한다.

    package interface_Test;
    
    
    public class MyClass {
        //1. 인터페이스가 필드 타입으로 사용되는 경우
        RemoteControl rc = new Television(); //인터페이스로 구현 객체를 사용할려면, 다음과 같이 인터페이스 변수를 선언하고 구현객체를 대입해야한다.
    
        //생성자
        MyClass(){
    
        }
    
        //2. 인터페이스가 생성자의 매개 변수 타입으로 사용되는 경우
        //new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값(ex new Audio()) 으로 전달함
        MyClass(RemoteControl rc){
    
            this.rc = rc;
            rc.turnOn();
            rc.turnOff();
            rc.setVolume(5);
        }
    
    
        void methodA(){
            RemoteControl rc = new Audio();//3. 인터페이스가 특정 메소드 내부 로컬 변수 타입으로 사용될 경우, 변수에 구현객체를 대입한다,
            rc.turnOn();
    
            rc.setVolume(5);
        }
    
        //4. 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현 객체를 매개값(ex. new Television())으로 대입한다.
        void methodB( RemoteControl rc ){
    
            rc.turnOn();
    
            rc.setVolume(5);
        }
    }

    4. 위 4가지 경우에 따라main 클래스에선 어떻게 호출할까

    package interface_Test;
    
    
    public class MyClassExample {
        public static void main(String args[]) {
            //1의 경우 -> 바로 . 연산자로 사용가능
            MyClass myClass1 = new MyClass();
            myClass1.rc.turnOn();
            myClass1.rc.setVolume(5);
    
            //2의 경우 -> new연산자로 생성한, 구현 객체를 매개값으로 대입함
            MyClass myClass2 = new MyClass(new Audio());
    
            //3의 경우
            MyClass myClass3 = new MyClass();
            myClass3.methodA();
    
            //4의 경우 -> new연산자로 생성한, 구현 객체를 매개값으로 대입함
            MyClass myClass4 = new MyClass();
            myClass4.methodB(new Television());
        }
    }

     

    어떤 구현 객체를 대입하느냐에 따라, new Audio()? or new Television()? 

    인터페이스 소스 코드의 변함은 없는데.  구현 객체를 교체함으로써 프로그램의 실행결과가 다양해진다. 이것이 인터페이스 다형성이다.

    댓글

lee-ding