course 2021/JAVA

day16 - interface

코딩하는토끼 2021. 9. 8. 02:03

> 인터페이스 interface 

클래스가 아니므로 일반 변수, 일반 메소드 (X) 상수, 추상 메소드 (O)

    - 변수는 public static final 생략하여도 컴파일 시 자동으로 붙음 → 상수

    - 메소드는 추상메소드 형식으로 선언하면 abstract 생략하여도 컴파일 시 자동으로 붙음 → 추상 메소드

    - 추가로 static 메소드 선언 가능 (자바 1.8 이후)

인터페이스 선언 시: class  대신 interface 인터페이스명

클래스에서 인터페이스 구현 시: 클래스명 implements 인터페이스명

    - 인터페이스의 추상메소드는 반드시 클래스에서 오버라이딩 되어야 함

    - 다중 상속 시: 클래스명 implements 인터페이스명, 인터페이스명, ...

인터페이스 → 인터페이스 상속 시: 인터페이스명 extends 인터페이스명, 인터페이스명, ... 

//예시
packager interface_;
public interface Example {  //class 대신 interface
    int A = 11;  //자동으로 public static final - 상수
    void method1();  //자동으로 public abstract (실행내용 없음, 오버라이딩 필수) - 추상메소드
}
//인터페이스 Shape
public interface Shape {
    public abstract double getArea();  //추상메소드
}

//클래스 Rectangle
public class Rectangle implements Shape {  //클래스 Rectangle에 인터페이스 Shape 구현 - implements
    int width;
    int height;
    
    public Rectangle(int width, int height) {  //생성자 - 멤버변수 초기화
        this.width = width;
        this.height = height;
    }
    
    public double getArea() {  //추상메소드 오버라이딩
        return width*height;
    }
}

//main 클래스
public class MainClass {
    public static void main(String[] args) {
        Rectangle abcd = new Rectangle(10, 20);  //객체생성
        System.out.println(abcd.getArea());
    }
}
//200.0
//첫번째 인터페이스
public interface IToDo1 {
    void m1(); //추상메소드
}

//두번째 인터페이스
public interface IToDo2 {
    void m2();
}

//세번째 인터페이스 - 첫번째, 두번째 인터페이스를 상속받음
public interface IToDo3 extends IToDo1, IToDo2 {
    void m3();
}

//네번째 인터페이스
public interface IToDo4 {
    void m4();
}

//클래스 - 인터페이스1,2를 상속받은 인터페이스3과 인터페이스4를 상속받음
public class ToDo implements IToDo3, IToDo4 {
    
    //모든 추상메소드는 반드시 오버라이딩 되어야 함
    //인터페이스에서 인터페이스로 상속됐어도 메소드의 오버라이딩은 클래스에서 이루어짐
    
    public void m1() {
        System.out.println("m1 구현");
    }
    
    public void m2() {
        System.out.println("m2 구현");
    }
    
    public void m3() {
        System.out.println("m3 구현");
    }
    
    public void m4() {
        System.out.println("m4 구현");
    }
}

 

* 인터페이스의 역할

만약 위에서 Cat에게 Cute의 기능을 추가하고싶다면? 클래스는 다중 상속을 지원하지 않음

Cute를 interface로 정의하면 그 기능을 구현(상속)할 수 있음 (interface Cute)

다중상속 (class Cat extends Animal implements Cute, Pet)

 

* 메소드 명세서

인터페이스는 객체의 사용방법을 정의한 타입(메소드 명세서)으로 객체의 교환성을 높여줌 - 다형성을 구현하는 중요한 역할을 함

▶ Cat 클래스는 다음 3가지 형태가 될 수 있음 

Animal a  = new Cat();

Cute c = new Cat(); ← 인터페이스도 데이터 타입(부모 타입)이 될 수 있음

Cat cc = new Cat();

▶ Cute 인터페이스를 부모타입으로 비슷한 기능을 묶어서 사용할 수 있음

Cute c1 = new Snake();

Cute c2 = new Cat();

Cute c3 = new Daisy();

 

※ 부모클래스의 변화

일반 클래스 → 추상 클래스(오버라이딩 강제) → 인터페이스 (오버라이딩 강제 + 다중 상속)

 

사용방법이 동일한 클래스를 만드는 기술