티스토리 뷰

JAVA

인터페이스(Interface)

Y.일월 2019. 9. 20. 12:09

인터페이스(Interface)


JAVA에서 인터페이스는 객체의 사용 방법을 정의한 타입이다.

일상생활으로 치면 일종의 가이드라인이라고 볼 수 있다.

일전에 추상클래스를 설계도라고 표현한 적이 있는데, 인터페이스도 동일한 역할을 한다.

추상클래스는 추상클래스는 상속으로 추가할 수 있으며, 단일상속만 가능하다.

하지만, 인터페이스는 다중상속이 가능하다는 것이 추상클래스와 인터페이스의 가장 큰 차이점이다.


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

즉, 객체에서 메소드들의 이름과 매개변수들을 미리 저장해놓고 있다가 개발코드에게 어떤 메소드가 필요한지, 해당 기능을 하는 메소드의 이름은 무엇인지를 알려주는 역할을 한다.


그러므로, 인터페이스를 사용하게 되면, 코드의 표준화가 가능하다.

즉, 같은 기능을 하는 메소드들의 이름을 통일하여 표준화 시킬 수 있다는 것이다.

그러므로, 여러 프로그래머가 협업하여 개발할때 지침역할을 하는 것이 인터페이스이다.


인터페이스는 [File -> New -> Interface]를 선택하여 쉽게 만들 수 있다.

인터페이스의 이름은 보통 형용사 (-able)로 사용하는 것이 관례이다.

인터페이스는 다음과 같이 선언한다.


interface 인터페이스이름 {    }


클래스에서 미리 만들어놓은 인터페이스를 구현할 경우에는 다음과 같이 쓰면 된다.


class 클래스 이름 implements 인터페이스이름



구현할 인터페이스를 선언했는데, 해당 인터페이스에 만들어놓은 메소드들을 클래스에서 재정의하지 않을 경우, 오류가 발생 하므로 꼭 확인하여 메소드들을 재정의해주어야 한다.


메소드들을 수동으로 재정의하기 힘들 경우, 구현할 인터페이스를 선언하면 다음과 같이 노란 형광등버튼이 뜬다.

그것을 클릭하면 'Add unimplemented methods'라는 버튼이 뜬다.

그것을 누르면, 구현하지 않은 메소드 구조들이 모두 나오기 때문에 필자는 버튼을 눌러 메소드를 구현하는 것을 추천한다.




인터페이스의 구조는 다음과 같다.


interface 인터페이스이름 {


//상수 필드

타입 상수명 = 값;


//추상 메소드

리턴타입타입 메소드이름(매개변수);


//디폴트 메소드

default 리턴타입 메소드이름(매개변수) { ... }


//정적 메소드

static 리턴타입 메소드이름(매개변수) { ... }


}




1.  상수 필드 (Constant Field)


인터페이스는 필드를 가질 수 있다.

하지만, 이름처럼 변하는 수가 아닌 상수로만 필드를 가질 수 있다는 것이 특징이다.

인터페이스는 객체의 가이드라인이다. 그러므로, 일반적인 필드를 가질 수 없으며,

변하지 않는 상수 필드만 가질 수 있다. 

단, 상수를 선언할 때는 반드시 초기값을 대입해야만 한다.




2. 추상 메소드 (Abstract Method)


추상 메소드는 메소드에 대한 설명이다. 

매개값의 종류, 리턴타입, 메소드 이름만 알려준다.

실제 실행부는 인터페이스를 상속한 구현 객체가 가지고 있다.

추상 메소드는 모두 public abstract 특성을 갖는다.

그러므로, public abstract를 생략하더라도 자동적으로 프로그램에 의해 붙게 된다.


추상 메소드의 예시 코드


Tv.java

interface Tv{

public void turnOn();

public void turnOff();

public String getInfo();

}


추상 메소드를 사용하는 클래스에서는 다음과같이, 무조건 추상 메소드를 구현해야한다.

TvEx.java

public class TvEx{

public void turnOn{

System.out.println("Tv를 켭니다.");

}


public void turnOff{

System.out.println("Tv를 끕니다.");

}


public void getInfo{

System.out.println("Samsung TV 입니다.");

}

}




3. 디폴트 메소드 (Default Method)


디폴트 메소드의 형태는 클래스의 메소드와 동일하다. 다만 default 키워드가 리턴타입 앞에 붙는다.

또한, 디폴트 메소드는 인터페이스에 선언되지만, 인터페이스에서 바로 사용할 수 없다.

즉,  다음과 같이 사용할 수 없다는 것이다.

Tv.watchingTv(true);


+디폴트 메소드 역시 public 특성을 가지므로 public을 생략하더라도 자동적으로 프로그램에 의해 붙게된다.


다음은 디폴트 메소드의 예시 코드이다.


interface Tv{

default void watchingTV (boolean power) {

if(power)

System.out.println("Tv를 봅니다.");

else   

System.out.println("Tv가 꺼져있습니다.");

}

}




4. 정적 메소드 (Static Method)


인터페이스만으로 호출 가능한 유일한 메소드이다.

즉,  인스턴스이름.메소드이름();  으로 사용가능하다. 





다음은 인스턴스 예제 코드이다.


Tv.java


public interface Tv {

//상수 필드

String kind = "Samsung";

//디폴트 메서드

public void turnOn();

public void turnOff();


//디폴트 메서드

default void watchingTV(boolean power) {

if (power)

System.out.println("Tv를 봅니다.");


else

System.out.println("Tv가 꺼져있습니다.");

}

//정적 메소드

static void getInfo() {

System.out.println(kind+"Tv입니다.");

}

}



SmartTv.java


public class SmartTv implements Tv{

@Override

public void turnOn() {

// TODO Auto-generated method stub

System.out.println("Tv가 켜져 있습니다.");

}


@Override

public void turnOff() {

// TODO Auto-generated method stub

System.out.println("Tv가 꺼져 있습니다.");

}

}




TvEx.java


public class TvEx {


public static void main(String[] args) {

// TODO Auto-generated method stub

//정적 메소드만 인스턴스에서 바로 호출 가능.

Tv.getInfo();

//인스턴스

Tv tv1 = new SmartTv();

//tv1.kind = "Lg"; //상수 이므로, 변경 불가 에러!

tv1.turnOn();

tv1.watchingTV(true);

tv1.turnOff();

}

}



'JAVA' 카테고리의 다른 글

익명구현객체(Anonymous class)  (0) 2019.09.23
Mail Client  (0) 2019.09.23
추상클래스(Abstract Class)  (0) 2019.09.19
타입변환과 다형성  (0) 2019.09.18
final 클래스와 메소드  (0) 2019.09.17
공지사항
최근에 올라온 글