ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java 자바] 8. 인터페이스 ① 선언과 구현
    Programming/Java 2022. 8. 9. 00:24
    반응형

    8-1. 인터페이스의 역할

    인터페이스: 객체의 사용 방법을 정의한 타입
    - 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능함
    - 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스
    - 오로지 추상메소드와 상수만 포함 가능

    8-2. 인터페이스 선언

    8-2-1. 인터페이스 선언

    [접근제한자] interface 인터페이스명 {
    
    // 상수, 선언되는 변수는 모두 상수로 적용되기 때문에 public static final과 같게 취급
    데이터타입 상수명 = 값;
    (public static final)데이터타입 상수명 = 값;
    
    // 메소드, 선언되는 메소드는 모두 추상 메소드로 적용되기 때문에 public abstract와 같게 취급
    반환값 메소드명() {...}
    public abstract 반환값 메소드명() {...}
    
    // 디폴트 메소드
    default 데이터타입 메소드명() {...}
    
    // 정적 메소드
    static 데이터타입 메소드명() {...}

    8-2-2. 상수 필드 (Constant Field)

    - 인터페이스에 고정된 값으로 런타임 시 데이터를 바꿀 수 없으며, 선언 시 반드시 초기값을 대입해야 함
      (인터페이스는 객체 사용 설명서이므로 런타임 시 데이터를 저장할 수 있는 일반 필드는 선언이 불가)
    - 인터페이스에 선언된 필드는 모두 public static final의 특성을 가지며, 생략하더라도 컴파일 과정에서 자동으로 붙음
    - 상수명은 대문자로 작성하되, 단어 구분은 언더바(_)로 연결

    public interface Test {
      public int MAX_VALUE = 10;
    }

    8-2-3. 추상 메소드 (Abstract Method)

    - 객체가 가지고 있는 메소드를 설명한 것으로 호출할 때 어떤 매개값이 필요하고 리턴 타입이 무엇인지만 알려줌
    - 실제 실행부는 구현 객체에서 작성 필요
    - 인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 생략하더라도 컴파일 과정에서 자동으로 붙음

    8-2-4. 디폴트 메소드 (Default Method)

    - 인터페이스에 default 키워드로 메소드를 선언하면 메소드를 구현할 수 있음(선언부부터 구현부까지)
    - public 특성을 갖기 때문에 생략하더라도 컴파일 과정에서 자동으로 붙음
    - 해당 내용은 상속 받은 객체에서 따로 오버라이딩하지 않아도 사용이 가능하며, 오버라이딩해서 사용할 수도 있음

    8-2-5. 정적 메소드 (Static Method)

    - 객체를 생성하지 않아도 인터페이스명.메소드명 으로 접근 가능
    - public 특성을 갖기 때문에 이를 생략하더라도 컴파일 과정에서 자동으로 붙음

    //Calculator.java
    public interface Calculator {
      static int add(int x, int y) {
        return x + y;
      }
    }
    
    //CalcTest.java
    public class CalcTest {
      public static main(String[] args) {
        System.out.println(Calculator.add(20,30));
      }
    }

    8-3. 인터페이스 구현

    8-3-1. 구현 클래스

    - implements 키워드 사용
    - 구현클래스는 인터페이스가 가지고 있는 추상 메소드에 대한 실체 메소드를 가지고 있어야 함
    - 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public보다 낮은 접근 제한으로 구현 작성 불가
    - 인터페이스에 선언된 추상 메소드에 대응하는 실체 메소드를 구현하지 않으면 구현클래스는 자동적으로 추상클래스가 됨

    [접근제한자] class 구현클래스명 implements 인터페이스명 {
      @Override
      // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    }

    - 인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 함
    - 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장

    //RemoteControl.java
    public interface RemoteControl {
      public int MAX_VOLUME = 10;
      
      public void trunOn();
    }
    
    //Television.java
    public class Television implements RemoteControl {
      @Override
      public void turnOn() {
        System.out.println("TV를 켭니다.");
      }
    }
    
    //RemoteControlTest.java
    public class RemoteControlTest {
      public static void main(String[] args) {
        Remotecontrol rc;
        rc = new Television();
      }
    }

    8-3-2. 익명 구현 객체

    - 일회성으로만 사용할 구현 객체를 만들 수 있는 방법
    - 컴파일하면 클래스명$1.class 형태로 클래스 파일이 만들어짐(생성 번호는 1부터 시작)

    public class RemoteControlTest {
      public static void main(String[] args) {
        RemoteControl rc = new RemoteControl() {
          public void turnOn() { */실행문/* }
        };
      }
    }

    8-3-3. 다중 인터페이스 구현 클래스

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

    public class 구현클래스명 implements interfaceA, interfaceB {
      //interfaceA에 선언된 추상 메소드의 실체 메소드 선언
      //interfaceB에 선언된 추상 메소드의 실체 메소드 선언
    }
    반응형

    댓글

Designed by Tistory.