자바 스터디 8주차

김성훈·2022년 9월 19일
0
post-thumbnail

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


학습할 것 (필수)

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


인터페이스(interface)

Java에서 interface란 추상화를 달성하는 방법 중 하나이다.

일종의 추상클래스 라고도 하지만, 인터페이스는 추상클래스처럼 추상메서드를 가지지만 추상클래스보다 추상화의 정도가 높아서 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.

오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다.

추상클래스가 미완성 설계도라고 하면 인터페이스는 밑그림만 그려져 있는 기본 설계도 라고 볼 수 있다.

Interface 정의하는 방법

interface 인터페이스이름{
    public static final <타입> <이름> = <>;
    public abstact 메서드이름(매개변수목록);
}

아까 말한 거 처럼 인터페이스는 오로지 추상 메서드, 상수만을 포함할 수 있다.

예약어로 class 가 아닌 interface 키워드를 사용한다.

그리고 interface에도 클래스와 같이 접근제어자를 사용할 수 있다.(public, default)

모든 멤버변수는 public static final 이어야 하고, 이를 생략할 수 있다

모든 메서드는 public abstract 이어야 하고, 이를 생략할 수 있다, 단 static 메서드와 default 메서드 제외(자바8부터)

생략된 제어자는 컴파일러가 자동적으로 추가해준다.

Interface 구현하는 방법

인터페이스도 추상클래스 처럼 그 자체로는 인스턴스를 생성할 수 없다.

추상클래스가 상속을 통해 추상메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 하는데 그 방법은 추상클래스와 같다.

단, 키워는 extends 가 아닌 구현한다는 의미의 implements를 사용한다.

class <클래스이름> implements <인터페이스 이름>{
    @Overriide
    public String 메서드이름(){
        return "ok";
    }
}

선언 후에는 interface에서 선언한 메서드들을 Override를 통해 정의해야 한다.

Interface 레퍼런스를 통해 구현체를 사용하는 방법

다형성에 의해 자손클래스의 인스턴스를 조상타입의 참조변수로 참조하는 것이 가능하다는 사실을 알고 있다.

인터페이스 타입으로 객체를 생성할 수 있으며 해당 객체에 구현 클래스로 인스턴스화 할 수 있다.

인터페이스 타입의 매개변수가 가지는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.

  interface Champion {
        void ChampName(String champName);
    }

    class LaneCheck {
        public static Champion getLane(String lane) {
            if(lane.equals("Bottom")) {
                return new Marksman();
            } else if(lane.equals("Mid")) {
                return new Nuker();
            } else {
                Champion c = new Jungle();
                return c;
            }
        }
    }

    class Marksman implements Champion {
        public void ChampName(String champName) {
            System.out.println(champName + " 바텀이요.");
        }
    }

    class Nuker implements Champion {
        public void ChampName(String champName) {
            System.out.println(champName + " 미드 선");
        }
    }

    class Jungle implements Champion {
        public void ChampName(String champName) {
            System.out.println(champName + " 정글감");
        }
    }

    class App {
        public static void main(String[] args) {
            Champion champion = LaneCheck.getLane("Bottom");
            champion.ChampName("미스포츈");
            champion = LaneCheck.getLane("Mid");
            champion.ChampName("르블랑");
            champion = LaneCheck.getLane("Anywhere");
            champion.ChampName("마스터 이")
        }
    }
// 미스포츈 바텀이요
// 르블랑 미드 선
// 마스터이 정글감

위 보기 중 메서드의 리턴타입으로 인터페이스의 타입을 지정한 부분이 있는데,

리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.

Interface 상속

인터페이스는 인터페이스로부터만 상속을 받을 수 있고 다중상속이 가능하다.

클래스의 상속과 마찬가지로 자손 인터페이스는 조상 인터페이스에 정의된 멤버를 모두 상속받는다.

   interface Movable {
        void move(int x, int y);
    }

    interface Attackable {
        void attack(Unit u);
    }

    interface Fightable extends Movable, Attackable { }

인터페이스는 클래스와 달리 Object 클래스와 같은 최고 조상이 없다.

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

원래 Java 8 이전의 Interface의 메서드는 선언만 가능하고 구현할 수 없었다.
하지만 Java8 이후부터 Default 메서드를 이용하면 메서드가 구현부를 가질 수 있다.

  • 추상메서드가 아니기 때문에 Default 메서드가 새롭게 추가 되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.
  • Default 메서드는 상속받는 클래스에서 필수로 구현하지 않아도 된다.
    interface MyInterface {
        void method();
        // void newMethod();  추상 메서드
        default void newMethod() { }
    }


디폴트 메서드는 앞에 키워드 default를 붙이며, 추상 메서드와 달리 일반 메서드처럼 몸통 { }이 있어야 한다. 접근 제어자는 public이며, 생략이 가능하다.

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

Java 8부터 인터페이스에 static 메서드 추가가 가능해졌다. 클래스에서 작성하는 방법과 동일하게 작성할 수 있고, 접근 제어자는 항상 public이며 역시 생략이 가능하다.

interface study{

 /* static 메소드 */ 
 static String nameStaticCheck(){
  return "nameStaticCheck"
  
}

인터페이스의 private 메소드, 자바 9

인터페이스의 메서드는 public이다.
하지만 자바9 부터는 private으로 사용함으로써 외부에 공개하지 않게 하며 코드의 중복을 파하고 interface에 대한 캡슐화를 유지할 수 있게 해준다.

  • private, private static 사용 가능 하지만 각각 호출 가능한 메서드가 다르다.

    private method : private, abstract, default, static 메서드 호출 가능
    private static method : static, private static 메서드만 호출 가능

<출처>

https://youn12.tistory.com/31

https://yadon079.github.io/2021/java%20study%20halle/week-08

profile
"한 명이 걷는 천 걸음 보다 천 명이 함께 걷는 한 걸음이 성공의 시작이고 완성이다"

0개의 댓글