티스토리 뷰

Java

8. 인터페이스

kingsubin 2021. 1. 9. 13:14

목표

자바의 인터페이스에 대해 학습하세요.

학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 static 메소드, 자바 9

 


1. 인터페이스 정의하는 방법

interface <inteface_name> {
  // constant fields
  // public static final 생략가능 
  public static final int PI = 3.14;
  
  // methods that abstract
  // public static 생략 가능
  public abstract void print();
}

 

인터페이스를 왜 사용하는가 ?

  • 전체적인 추상화를 이루기 위해서 사용된다.
  • Java 의 경우 다중 상속을 지원하지 않지만 인터페이스를 이용하면 다중 상속을 구현할 수 있다.
  • 추상화를 구현하기 위해 사용되는데 그렇다면 왜 추상 클래스를 놔두고 인터페이스를 사용할까 ?
    • 추상 클래스는 non-final 변수가 포함될 수 있지만 인터페이스의 변수는 final 이기 때문이다.

 

 


2. 인터페이스 구현하는 방법

public interface Animal {
    default void run() {
        System.out.println("다그닥다드각");
    }
    void cry();
}

// 구현
class Dog implements Animal {
    @Override
    public void cry() {
        System.out.println("크르르르르르릉");
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.cry();
        dog.run();

        // 일회용 객체
        Animal animal = new Animal() {
            @Override
            public void cry() {
                System.out.println("히이이잉~");
            }
        };

        animal.cry();
    }
}

 

기본적으로 "implements" 키워드를 사용한다.

인터페이스는 인스턴스화 할 수 없지만 익명 객체를 통해 일회용 객체를 만들 수 있다.

 

 


3. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법


4. 인터페이스 상속

interface In1 extends Test1 {
    // 이런식으로 인터페이스도 상속이 가능하다
}

 


 

5. 인터페이스의 기본 메소드 (Default Method), 자바 8

6. 인터페이스의 static 메소드, 자바 8

7. 인터페이스의 static 메소드, 자바 9

 

자바 8 이전의 경우에서는 Constant variables, Abstarct methods 만 가질 수 있었다.

이때는 무조건 인터페이스를 구현한 클래스는 모든 메소드를 무조건 구현해야만 한다.

public interface TempI {
    public abstract void method(int n);
}

class Temp implements TempI {
    @Override
    public void method(int n) {
        if (n % 2 == 0)
            System.out.println("geeksforgeeks");
        else
            System.out.println("GEEKSFORGEEKS");
    }

    public static void main(String[] args) {
        TempI in1 = new Temp();
        TempI in2 = new Temp();
        in1.method(4);
        in2.method(3);
    }
}

// geeksforgeeks
// GEEKSFORGEEKS

 

 

자바 8 에서는 Default methods 와 Static methods 가 도입되었고 4가지 유형을 가질 수 있다.

1. Constant variables

2. Abstract methods

3. Default methods

4. Static methods

public interface TempI {
    public abstract void div(int a, int b);
    public default void add(int a, int b) {
        System.out.print("Answer by Default method = ");
        System.out.println(a + b);
    }

    public static void mul(int a, int b) {
        System.out.print("Answer by Static method = ");
        System.out.println(a * b);
    }
}

class Temp implements TempI {

    @Override
    public void div(int a, int b) {
        System.out.print("Answer by Abstract method = ");
        System.out.println(a / b);
    }

    public static void main(String[] args) {
        TempI in = new Temp();
        in.div(8, 2);
        in.add(3, 1);
        TempI.mul(4, 1);
    }
}

// Answer by Abstract method = 4
// Answer by Default method = 4
// Answer by Static method = 4

 

자바 9 는 인터페이스에 private methods 와 private static methods 를 도입했고 6가지 유형을 가질 수 있다.

1. Constant variables

2. Abstract methods

3. Default methods

4. Static methods

5. Private methods

6. Prviate Static methods

 

이러한 private methods 는 인터페이스 내부의 코드 재사용성을 향상시킨다.

private 메서드는 해당 인터페이스 내에서만 접근할 수 있으며 다른 인터페이스로 접근이나 클래스로 구현할 수 없다.

public interface TempI { 
    public abstract void mul(int a, int b); 
    public default void add(int a, int b) { 
        // private method inside default method 
        sub(a, b);  
  
        // static method inside other non-static method 
        div(a, b); 
        System.out.print("Answer by Default method = "); 
        System.out.println(a + b); 
    } 
  
    public static void mod(int a, int b) { 
        div(a, b); 
        
        // static method inside other static method 
        System.out.print("Answer by Static method = "); 
        System.out.println(a % b); 
    } 
  
    private void sub(int a, int b) { 
        System.out.print("Answer by Private method = "); 
        System.out.println(a - b); 
    } 
  
    private static void div(int a, int b) { 
        System.out.print("Answer by Private static method = "); 
        System.out.println(a / b); 
    } 
} 
  
class Temp implements TempI { 
  
    @Override
    public void mul(int a, int b) { 
        System.out.print("Answer by Abstract method = "); 
        System.out.println(a * b); 
    } 
  
    public static void main(String[] args) { 
        TempI in = new Temp(); 
        in.mul(2, 3); 
        in.add(6, 2); 
        TempI.mod(5, 3); 
    } 
} 

// Answer by Abstract method = 6              // mul(2, 3) = 2*3 = 6
// Answer by Private method = 4               // sub(6, 2) = 6-2 = 4 
// Answer by Private static method = 3        // div(6, 2) = 6/2 = 3
// Answer by Default method = 8               // add(6, 2) = 6+2 = 8
// Answer by Private static method = 1        // div(5, 3) = 5/3 = 1 
// Answer by Static method = 2                // mod(5, 3) = 5%3 = 2

 


※ 출처

www.geeksforgeeks.org/

 

※ 스터디

github.com/whiteship/live-study/issues/8

'Java' 카테고리의 다른 글

10. 멀티쓰레드 프로그래밍  (0) 2021.01.27
9. 예외처리  (0) 2021.01.17
7. 패키지  (0) 2021.01.02
6. 상속  (0) 2020.12.23
5. 클래스  (0) 2020.12.19