2018-3-8 TIL Interface

인터페이스

인터페이스의 형태
interface Printable {
	public void print(String doc);
    // 추상메소드
}
  • 인터페이스의 기본골격은 class와 같지만, class 대신 interface, 메소는 몸체 없이 세미콜론만 쓴다.
  • 몸체가 비어있는 메소드를 ‘추상 메소드’라고 한다
  • 인터페이스는 인스턴스 생성이 불가능하다. 다만 다른 클래스에 의해 상속이 될 뿐이다
class Printer implements Printable {
	public void print(String docs) {
    // Printable 인터페이스의 print 메소드 구현
    	System.out.println(doc);
    }
}

  • 클래스가 인터페이스를 상속하는 행위는 ‘상속’이 아닌 ‘구현(Implements)’라고 한다. 문법관계는 상속 그러나 본질은 ‘구현’이기때문..
  • 한 클래스는 둘 이상의 인터페이스를 동시에 구현할 수 있다
  • 상속과 구현 동시에 가능하다.
class Robot extends Machine implements Movable, Runnable { ... }
  • 인터페이스는 ‘연결점’ 또는 ‘접점’으로 둘 사이를 연결하는 매개체의 역할을 한다.
package yoon;

interface Printable {
    public void print(String doc);
}

class Printer implements Printable {
    // Printable을 구현하는 Print클래스
    @Override
    public void print(String doc) {
        System.out.println(doc);
    };
}

class PrintableInterface {
    public static void main(String [] args){
        Printable prn = new Printer();
        // Printable형 참조변수 선언 가능
        prn.print("Hello java");
    }
}
  • MS Window는 삼성 LG 프린터를 대상으로 출력을 진행할 수 있다.
  • 인터페이스를 만들어서 모든 프린터 업체에게 제공을 해야된다.
interface Printable {
	public void print(String doc);
}
  • MS는 위와 같이 print 인터페이스를 만들어준다. 그리고 각 회사는 회사별로 print메소드를 만들면 된다.
class SPrinterDriver implements Printable {
	@Override
    public void print(String doc) { ... }
}

class LPrinterDriver implements Printable {
	@Override
    public void print(String doc) { ... }
}

Printer드라이버 구현하기

package yoon;

interface Printable {
    // MS가 정의하고 제공한 인터페잇
    public void print(String doc);

}

class SPrinterDriver implements Printable {
    // S사가 정의한 클래스
    @Override
    public void print(String doc) {
        System.out.println("From Samsung printer");
        System.out.println(doc);
    }
}

class LPrinterDriver implements Printable {
    @Override
    public void print(String doc) {
        System.out.println("From LG printer");
        System.out.println(doc);
    }
}

public class PrinterDriver {
    public static void main(String [] args) {
        String myDoc = "This is a report about...";

        //삼성프린터
        Printable prn = new SPrinterDriver();
        prn.print(myDoc);
        System.out.println();

        prn = new LPrinterDriver();
        prn.print(myDoc);
    }
}
//result
From Samsung printer
This is a report about...

From LG printer
This is a report about...

인터페이스 문법

interface Printable {
	int PAPER_WIDTH = 70;
    int PAPER_HEIGHT = 120;
	public void print(String doc);
}
  • 인터페이스 내에 위치하는 메소드는 자동으로 pulic이 된다.
  • 인터페이스 내에 선언되는 변수는 반드시 선언과 동시에 초기화를 해야한다.
  • 모든 변수는 public, static, final이 선언된 것으로 간주
  • 인터페이스 내에 선언된 변수는 상수이다.
package yoon;

class Prn204Drv implements Printable {
    @Override
    public void print(String doc) {
        // S사의 흑백프린터
        System.out.println("From MD-204 Printer");
        System.out.println(doc);
    }
}

class Prn731Drv implements Printable {
    // L사의 흑백프린터
    @Override
    public void print(String doc) {
        System.out.println("From MD-731 printer");
        System.out.println(doc);
    }
}

public class PrintDriver2 {
    public static void main(String [] args) {
        String myDoc = "This is a report about...";

        Printable prn = new Prn204Drv();
        prn.print(myDoc);
        System.out.println();

        prn = new Prn731Drv();
        prn.print(myDoc);
    }
}
//result
From MD-204 Printer
This is a report about...

From MD-731 printer
This is a report about...
  • 위와 같이 수정을 하면 기존에 있던 인터페이스를 기반으로 개발한 드라이버를 모두 수정을 해야 된다. 따라서 인터페이스를 수정하지 않고, 상속으로 해결을 해야한다.
package yoon;

interface ColorPrintable extends Printable {
    // Printable을 상속하는 인터페이스
    void printCMYK(String doc);
}

class Prn909Drv implements ColorPrintable {
    @Override
    public void print(String doc) {
        System.out.println("From MD-909 black & whtie ver");
        System.out.println(doc);
    }

    @Override
    public void printCMYK(String doc) {
        System.out.println("From MD-909 CMYK ver");
        System.out.println(doc);
    }
}
public class PrinterDriver3 {
    public static void main(String [] args) {
        String myDoc = "This is report about...";
        ColorPrintable prn = new Prn909Drv();
        prn.print(myDoc);
        System.out.println();
        prn.printCMYK(myDoc);
    }
}
//result
From MD-909 black & whtie ver
This is report about...

From MD-909 CMYK ver
This is report about...
  • 두 인터페이스 사이의 상속도 extends로 명시
  • 인터페이스와 클래스 사이의 구현만 implements

인터페이스의 디폴트 메소드

interface Printable {
	void print(String doc);
    default void printCMYK(String doc) { ... } /// default method
}
디폴트 메소드의 특징
  • 자체로 완전한 메소드이기때문에, 이를 구현하는 클래스가 오버라이딩을 하지 않는다

인터페이스의 static 메소드

package yoon;

public class SimplePrinter {
    public static void main(String [] args) {
        String myDoc = "This is a report about...";
        Printable prn = new Printer();
        prn.print(myDoc);

        // 인터페이스의 static을 직접호출
        Printable.printLine("end of line");
    }
}
//result
This is a report about...
end of line

오늘의 느낀점

  • 3월에 레벨2가 개강하고 나서 첫QnA시간을 가졌다. 함께 공부하는 사람들이 정말 잘 하시는구나 싶었다. 나는 지지난달에 자바를 처음 시작했을때, get method, set method가 있는줄도 몰라서 포비의 말을 듣고서 직접 다 구현을 했었는데.. 자바를 하고 3달째야 get, set method가 있는줄 알았다… 공부는 끝이 없구나.. 인터페이스와 상속을 적용을 공부를 했다. 상속에서 super로 부모생성자를 호출하는 부분이 익숙하지 않았다. 개념을 공부할때는 그냥 타이핑을 해서 봤다면, 지금은 좌표계산기를 만들기 위해서 직접 사용을 해야되기때문에 많이 찾아보았는데 되는게 신기하다. 전에는 포비가 이야기를 해주시면 잘 이해가 안됬는데, 전보다는 훨씬 이해가 수월하고 메소드를 구현하는데 있어서도 많이 거리낌이 없어졌다. 그럼에도 불구하고 오늘 private를 이용해서 외부에서 points를 접근하지 못하도록 했는데, 사실 굳이 private를 해야되나 싶었는데. 금방 get메소드를 이용을 해서 좌표값들을 불러오고, 거리 넓이 등을 다 구했다. 이 부분은 뿌듯 :) 어제는 집에서 쉬고 그저께는 PR을 못날려서 걱정을 했는데 오늘은 잘 되서 감사 :)
Written on March 8, 2018