728x90

제곧내

제목이 곧 내용

 

바로 들어가겠다.

 


인터페이스 : 서로 다른 장치들이 연결되어서 상호 데이터를 주고받는 규격(규칙)

인터페이스가 서로 다르면 연결이 불가하다

추상 클래스보다 더 추상적인 클래스

인터페이스도 하나의 자료형이라 생각 (참조 변수 선언 가능)

 

 

 

 

인터페이스 형식은

public interface RemoteControl {

	//추상 메소드 정의
	public void turnOn();	//전자제품을 켠다.
    public void turnOff();	//전자제품을 끈다.
    
}

구현부({  })가 없다.

 

 

 

 

 

 

인터페이스를 구현하는 형식은

public interface RemoteControl {
	// 추상 메소드 정의
	public void turnOn();	// 가전 제품을 켠다.
	public void turnOff();	// 가전 제품을 끈다.
}
public class Television implements RemoteControl { //implements를 통해 클래스가 인터페이스 구현
	boolean onOff = false;
	public void turnOn() {
		// TV의 전원을 켜기 위한 코드가 들어간다.
		onOff = true;
		System.out.println("TV가 켜졌음");
	}

	public void turnOff() {
		// TV의 전원을 끄기 위한 코드가 들어간다.
		onOff = false;
		System.out.println("TV가 꺼졌음");
	}
}
public class TelevisionTest {
	public static void main(String[] args) {
		Television t = new Television();
		t.turnOn();
		t.turnOff();
	}
}

출력결과

 


 

한번 인터페이스를 사용해서 자율 주행 자동차를 만들어보자

 

 

 

[자동차 제조사 SW]

 

 

[인터페이스]

void start();

void stop();

int setSpeed(int speed);

int turn(int degree);

 

 

[자율 주행 시스템 SW]

 


 

[인터페이스]

public class AutoCarTest {
	public static void main(String[] args) {
		OperateCar obj = new AutoCar();
		obj.start();
		obj.setSpeed(30);
		obj.turn(15);
		obj.stop();
	}
}

 

 

[자동차 제조사 SW]

public class AutoCar implements OperateCar {
	public void start() {
		System.out.println("자동차가 출발합니다.");
	}

	public void stop() {
		System.out.println("자동차가 정지합니다.");
	}

	public void setSpeed(int speed) {
		System.out.println("자동차가 속도를 " + speed + "km/h로 바꿉니다.");
	}

	public void turn(int degree) {
		System.out.println("자동차가 방향을 " + degree + "도 만큼 바꿉니다.");
	}
}

 

 

[자율 주행 시스템 SW]

public interface OperateCar {

	void start();
	void stop();
	void setSpeed(int speed);
	void turn(int degree);
}

 

 

출력결과

 


 

 

다음은 ActionListener 인터페이스를 사용해서 타이머를 만들어보겠다

 

어떤 이벤트 처리를 위한 공통 규격이 필요한데

ActionListener 인터페이스는 액션 이벤트 처리를 위한 규격을 정의해준다.

 

 

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

class MyClass implements ActionListener {	//ActionListener 인터페이스를 구현한 클래스 생성
	public void actionPerformed(ActionEvent event) {	//Timer에 의하여 1초에 한번씩 호출
		System.out.println("일어나");
	}
}


public class CallbackTest {
	public static void main(String[] args) {

		ActionListener listener = new MyClass(); //상향 형변환
		Timer t = new Timer(1000, listener);	//actionPerformed()를 호출해달라고 Timer에 등록
		t.start();
		for (int i = 0; i < 1000; i++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}
}

 

무슨 코드인지 전혀 모르겠지만

이런 코드가 존재한다는 사실만 알고 넘어가겠다

아직 안배운 개념이 너무 많다.

 

 

 

 


 

 

인터페이스가 인터페이스를 상속받는 것도 가능하다.

 

 

class    --(extends)-->    class

 

class    --(implements)-->    interface

 

interface    --(extends)-->    interface

 

public interface InterFace2 extends InterFace1 {
	public void volumeUp();
    public void volumeDown();
}

 

 

 

다중상속이란 하나의 클래스가 여러 개의 부모 클래스를 가지는 것이다.

예를 들면 하늘을 나는 자동차는

비행기의 특성과 자동차의 특성을 모두 가져야 할때 다중 상속이 필요하다.

 

다중 상속은 애매한 상황을 만들 수 있어 자바에서는 금지되어 있는데

인터페이스를 사용하면 다중 상속의 효과를 낼 수 있다.

 

 

 

 

class Shape { protected int x, y }

interface Drawable { void draw(); }

public class Rectangle extends Shape implements Drawable {
	int width, height;
    public void draw() {
    	System.out.println("Recteangle Draw");
        }
 }

 

 

 

 


 

 

 

인터페이스는 상수를 정의할 수 있다.

인터페이스에 정의된 변수는 자동적으로 public static final로 처리한다.

 

public interface MyConstants {
	 int NORTH = 1;
   	 int EAST = 2;
   	 int SOUTH = 3;
   	 int WEST = 4;
}

 

 

인터페이스에서 정의한 상수를 공유한 예제를 보자.

interface Days {
	public static final int SUNDAY = 1, MONDAY = 2, TUESDAY = 3,
    WEDNESDAY = 4, THURSDAY = 5, FRIDAY = 6, SATURDAY = 7;
}
public class DayTest implements Days
{
	public static void main(String[] args)
    {
    	System.out.println("일요일 : " + SUNDAY);
    }
}

출력 결과

 

 


 

 

 

디폴트 메소드 : 인터페이스 개발자가 메소드의 디폴트 구현을 제공할 수 있는 기능이다.

예약어 default를 사용한다.

디폴트 메소드가 정의되어 있으면 인터페이스를 구현하는 클래스가

메소드의 몸체를 구현하지 않아도 메소드를 호출할 수 있다.

 

 

 

interface MyInterface {
	public void myMethod1(); //보통의 추상메소드

	default void myMethod2() { //디폴트 메소드, 메소드의 몸체를 제공
		System.out.println("myMethod2()");
	}
}

public class DefaultMethodTest implements MyInterface {
	public void myMethod1() {
		System.out.println("myMethod1()");
	}

	public static void main(String[] args) {
		DefaultMethodTest obj = new DefaultMethodTest();
		obj.myMethod1();
		obj.myMethod2(); //구현하지 않아도 바로 사용가능
	}
}

출력 결과

 

디폴트 메소드를 사용하니 코드의 양이 확실히 줄었다.

 

 

 

 

 

 

 

인터페이스에서 디폴트 메소드 외에 정적 메소드도 사용가능하다.

 

interface MyInterface {
	static void print(String msg) {
		System.out.println(msg + ": 인터페이스의 정적 메소드 호출");
	}
}

public class StaticMethodTest {

	public static void main(String[] args) {
		MyInterface.print("Java 8");
	}
}

 

 

 

 


 

 

드디어 인터페이스의 마지막 개념까지 왔다.

무명클래스 : 클래스 몸체는 정의되지만 이름이 없는 클래스, 

클래스를 정의하면서 동시에 객체 생성

한번만 사용가능하다.

 

 

 

new 부모클래스이름()
{

}

무명클래스의 형식이다.

 

 

interface RemoteControl {
       void turnOn();
       void turnOff();
}
 
public class AnonymousClassTest {
      public static void main(String args[]) {
             RemoteControl ac = new RemoteControl() {		// 무명 클래스 정의
                    public void turnOn() {
                           System.out.println("TV turnOn()");
                    }
                     public void turnOff() {
                           System.out.println("TV turnOff()");
                    }
             };
             ac.turnOn();
             ac.turnOff();
       }
}

출력 결과

역시 코드의 수가 많이 줄었다.

 

 

 


이렇게 인터페이스에 대한 정리가 끝났다. 

처음 접하는 내용이다 보니 아직 이해가 제대로 되지 않았다. 

다음은 인터페이스와 함께 거론되는 람다식과 패키지를 이어서 소개하겠다.

728x90