본문 바로가기

Java

인터페이스 (Interface)

인터페이스 (Interface)?

인터페이스는 객체의 사용방법을 정의한 타입. 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다. (추상메서드와 비슷하다 메인코드를 객체와 직접연결하지 않고 인터페이스를 통하게 해 객체를 교체하더라도 큰 수정없이 작동할수있게끔 하는것.)

자바 8 이 나오고나서 더욱 중요해졌다고 한다. 

인터페이스의 역할 ??

인터페이스는 개발 코드와 객체가 서로 통신하는 접점역할을 한다. 

개발코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.

이렇게 되기 때문에 위에서 말한것처럼 개발코드는 객체의 내부구조를 알 필요없다 왜? 인터페이스의 메소드만 알고 있으면 인터페이스에서 객체에 접근해 메소드를 실행한뒤 리턴된 결과값만을 개발코드로 전해주기때문.

인터페이스가 중간 타워 역할을 하는것이다.

그냥 개발코드가 직접 객체에 접근하면 안되는가?? 된다 안될것없다.

하지만 나중에 객체를 교체해야하는 상황이 오면 개발코드를 뒤집던가 엄청난 수정을 해야 할 것이다.  

하지만 인터페이스를 만든다면? 개발코드는 인터페이스의 메소드만 호출하면 그만이기 때문에 객체가 교체되든 말든 신경쓸필요가 없다 개발코드의 수정없이도 얼마든지 객체를 교체할 수 있게된다. 그러면 개발코드의 변경없이도 다양한 리턴값, 결과값을 얻을수 있게된다.

인터페이스의 선언

일단 클래스와 마찬가지로 소스코드를 만든다<< 이과정은 그냥 이클립스상에서 클래스대신 인터페이스버튼을 누르면 알아서 해준다.

.java소스파일로 작성 .class취급되기 때문에  전체적인 모습은 클래스와 같으나 코드 내부에서 멤버를 호출하는 방법이 다르다.

-인터페이스 선언 

인터페이스 선언의 경우 클래스대신 인터 페이스를 넣으면된다

[public] interface 인터페이스명{.........}

이름을 선언 하는것은 클래스와 동일하다 첫머리를 대문자로 두가지 단어가 합쳐지면 두번째단어 시작을 대문자로 하는것

예)

public interface RemoteControl{.......}

클래스는 필드, 생성자 메소드 등을 구성멤버로 가지지만 인터페이스는 상수와 메소드만을 구성멤버로 가진다. 

인터페이스는 객체로 생성 할 수 없기 때문에 생성자는 가질수 없다.

자바7이전까지는 상수와 추상메소드 두가지 뿐으로 실행문없는 메소드만을 사용할 수 있었지만

자바8로 오면서 디폴트, 정적메소드를 사용할 수있게 되고 실행문도 사용하게 되었다.


interface 인터페이스명{

//상수

타입 상수명(대문자) = 값;

//추상 메소드

타입 메소드명(매개변수,...);

//디폴트 메소드

default 타입 메소드명 (매개변수.....){.........}

//정적 메소드

static 타입 메소드명 (매개변수.....){.........}

}


-상수필드 (Constant Field)

인터페이스는 객체 사용설명서이기 때문에 런타임(실행중) 시 데이터를 저장 할 수 있는 필드를 선언하지못한다. 하지만 상수필드는 선언이 가능하다. 값이 고정되있는 상수는 런타임때 데이터를 바꿀 필요가 없기 때문에 따로 저장 공간이 필요없다.

단, 상수 필드를 선언 하면 무조건 선언 후 바로 초기값을 주서 초기화 해야한다. 


인터페이스는 데이터의 저장이 안되기 때문에 데이터 저장을 위한 인스턴스 또는 정적필드 선언이 불가능하다. 대산 상수필드만 선언이 가능하다.


상수는 public static final로 선언된다. 인터 페이스에서 선언된 필드는 모두 public static final의 특성을 가지고 public static final를 생략하더라고 컴파일러에서 자동으로 있는 것으로 인식한다. 

[public static final] 타입 상수명 = 값;

상수명은 전부 대문자, 저번에 배운것과 같이 static{.......}<<이것으로 초기화가 불가능 하기 때문에 선언과 동시에 초기화 해줘야한다. 

간단하게 인터페이스를 구현해보면

public interface RemoteControl {

public int MAX_VOLUME = 10;

public int MIN_VOLUME = 0;

}

상수 필드의 규칙대로 이름을 대문자로 했고 연결되는 단어에서는 _로 연결했다.

public 만 붙였는데 이대로 진행 하더라도 컴파일러에서 public static final로 자동 생성하기때문에 괜찮다.


-추상메소드(Abstract Method)

추상메소드는 객체가 가지고이쓴 ㄴ메소드를 설명한것. 호출 시 어떤 매개값이 필요하고, 리턴 타입이 무엇인지만 알려준다. 실제 실행부는 해당 메소드를 가진 객체가 가지고 있다.

인터 페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행된다.  그렇기 때문에 인터페이스가 실행문을 가질 필요는 없다. 그래서 추상메소드를 선언하는것. 

전에 배웠지만 추상메서드는 리턴 타입, 메소드명 ,매개변수 만 가지고 실행부분인{}는 생략한다.

인터페이스에서 선언된 추상메소드는 전부 기본적으로 public abstract 의 특성을 가지기 때문에 따로 작성하지않아도 컴파일러에서 인식한다.


그러니까 개발 코드에서 A메소드를 호출한다. >> 인터페이스에서 실제 A메소드를 호출하는방법을 실행한다 (A의 추상메소드) >> 실제객체에서 실행문이 실행된다.

간단하게 구현해보자

public interface RemoteControl {

//상수

public int MAX_VOLUME = 10;

public int MIN_VOLUME = 0;

//추상메서드

public void turnOn();

public void turnOff();

public void setVolume(int volume);

}

-디폴트메소드(Default Method)

디폴트 메소드는 실행부를 가진만큼 선언은 인터페이스에서 하지만 객체가 가진 인스턴트메소드라고 생각한다. 이게 허용된 이유는 인터페이스의 확장, 새로운 기능 추가 때문이다.

자바8에서 새로만들어진 멤버, 형태는 클래스의 인스턴스 메소드와 동일하다. 리턴 타입앞에 default가 붙는다 기본적으로 public 특성이 붙기 때문에 public 를 작성하지 않아도 컴파일러에서 public으로 자동 인식한다.

[public] default 리턴타입 메소드명(매개변수 , .....){/...................}

간단히 구현해보자

public interface RemoteControl {

//상수

public int MAX_VOLUME = 10;

public int MIN_VOLUME = 0;

//추상메서드

public void turnOn();

public void turnOff();

public void setVolume(int volume);

//디폴트 메서드

default void setMute(boolean mute){

if(mute){

System.out.println("무음 처리합니다. ");

}else{

System.out.println("무음 해제합니다.");

}

}


-정적메소드(Static Method)

자바8부터 추가된 메소드, 디폴트메소드와는 달리 객체가 없어도 인터페이스만으로 호출이가능.

디폴트 메서드와 함께 자바8부터 새로나온 멤버, 형태는 클래스의 정적메서드와 동일하다 

디폴트와 마찬가지로 기본적으로 public 특성을 가지기 때문에 생략하더라도 컴파일 과정에서 자동으로 들어간다.

[public] static 리턴타입 메소드명(매개변수,...){............}

간단히 구현해보자

public interface RemoteControl {

//상수

public int MAX_VOLUME = 10;

public int MIN_VOLUME = 0;

//추상메서드

public void turnOn();

public void turnOff();

public void setVolume(int volume);

//디폴트 메서드

default void setMute(boolean mute){

if(mute){

System.out.println("무음 처리합니다. ");

}else{

System.out.println("무음 해제합니다.");

}

}

//정적 메서드

static void changeBattery(){

System.out.println("건전지를 교환합니다.");

}



'Java' 카테고리의 다른 글

인터페이스3  (0) 2019.01.18
인터페이스(Interface)2  (1) 2018.12.31
추상클래스(abstract)  (0) 2018.12.23
강제타입변환 Casting 및 몇가지  (0) 2018.12.22
매개변수의 다형성  (0) 2018.12.21