본문 바로가기

프디아 백엔드

JAVA 인터페이스를 사용해야 하는 이유

JAVA에서 인터페이스를 왜 사용해야할까?

 

1. 구현체가 어떤 게 오든 받아줄 수 있게 타입 형태로 제시하기 위함 => implements Phone

     추상클래스 extends는 공통 기능 상속, 규약 구현(추상메소드)

     인터페이스는 implements 공통 규약, 구현

 

static class ApplePhone implements Phone{
// 코드 구현
}

static class SamsungPhone implements Phone{
// 코드 구현
}

 static class Person{

    Phone phone;  // ApplePhone, SamsungPhone 다 가능

     
}

 

2. 구현체(객체)를 필요 = 구현체 사용 = 메소드를 호출

    메소드 선언(이름, 매개변수) 통일 

    

 메소드의 이름과 매개변수를 통일해줘야하는데 이때, 접근제어자를 쓰지 않으면 아래와 같은 오류가 난다

'useYoutube()' in 'day03.EX06.ApplePhone' clashes with 'useYoutube()' in 'day03.EX06.Phone'; attempting to assign weaker access privileges ('package-private'); was 'public'

 

인터페이스는 메소드 public이 생략되어있기 때문에 클래스에서 메소드를 선언할 땐 접근제어자를 붙여줘야한다

필드는 프라이빗으로, 메소드는 퍼블릭으로 많이 사용한다고 한다

public interface Phone {

        int BATTERY_CAPACITY = 100;

        void charge();

        void operateKakaotalk();

        void useYoutube();

        void checkBattery();

        void turnOn();

        void turnOff();
 }

static class ApplePhone implements Phone{
        int battery=70;
        final int BATTERY_CAPACITY = 100;
        boolean isOn = true;

        ApplePhone(){

        }

        @Override
        public void charge(){
            if(battery == 100){
                System.out.println("100%");
            }else if(battery <=90){
                battery +=10;
                System.out.println(battery+"%");
            }else{
                battery += (BATTERY_CAPACITY-battery);
                System.out.println(battery+"%");
            }
        }

        @Override
        public void operateKakaotalk(){
            if(battery>5){
                battery-=5;
            } else {
                battery =0;
                turnOff();
            }
        }

        @Override
        public void useYoutube(){
            if(battery>10){
                battery-=10;
            } else {
                battery =0;
                turnOff();
            }
        }


        @Override
        public void checkBattery(){
            System.out.println(battery);
        }

        public void turnOn(){
            isOn = true;
        }

        public void turnOff(){
            isOn = false;
        }
    }

 

 

추상클래스와 인터페이스 비교

 

추상클래스

: 상속할 각 객체들의 공통점을 찾아 추상화, 같은 부모클래스를 상속하며 부모클래스가 가진 기능들을 구현해야할 경우 사용 (상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많음)

 

인터페이스

: 서로 관련성이 없는 클래스들을 묶어주고 싶을 때, 다중 상속(구현)을 통한 추상화 설계

  구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용