Java/모두의 자바

Chapter 08-43 인터페이스 만들기

계란💕 2022. 2. 9. 14:44

08-43.1 인터페이스란?

 Def) 인터페이스: 구현은 하지 않고 기능만 선언해 쭉 가지고 있는것을 말한다. 

 

 

08-43.2 인터페이스 만들기

  (1) javaStudy 패키지 마우스 오른쪽 > New > Interface 

  (2) name: TV 입력 후, finish

  (3) 

<hide/>
package javaStudy;

public interface TV {

}

  - 원래 class라고 적힌곳에 interface 라고 적혀있다. 

 

  (4) turnOn 메서드를 추가

<hide/>
package javaStudy;
public interface TV {
	public void turnOn();
	
}

  - 메서드이므로 괄호를 꼭 넣어준다.

  - 앞서 공부한 단원에서 추상메서드는 항상 abstract을 붙여줘야 에러가 나지 않는다

  - 그런데 인터페이스는 abstract을 붙이지 않아도 에러가 나지 않는다.

  - 인터페이스 자제가 구현은 없고 기능을 선언만 하기 때문이다.

 

  (5) 다른 메서드도 추가한다. 

<hide/>
package javaStudy;
public interface TV {

	public int MIN_VOLUME = 0;
	public int MAX_VOLUME = 0;

	public void turnOn();
	public void turnOff();
	public void changeVolume(int volume);
	public void changeChannel(int channel);
}

  - 전원 끄는 turnOn, 전원 켜는 turnOff, 볼륨을 바꾸는 changeVolume, changeChannel 메서드 선언한다.

  - changeVolume 메서드는 어느 정도 값으로 바꿀지 값을 알아야 하므로 볼륨값을 받아오도록 정의한다. 

    (changeChannel도 마찬가지이다.)

    -> 0 ~ 100까지 볼륨값을 받도록 한다.

    -> 0 ~ 100까지 고정하는 숫자: 상수

    -> MAX_VOLUME, MIN_VOLUME을 이용한다. 

    -> 인터페이스는 자체적으로 타입의 역할을 할 수도 있지만 구현이 하나도 없기 때문에 

    -> 인터페이스 자체가 객체를 생성하지는 못한다. 

 

 

08-43.3 인터페이스 사용하기 실습

  Ex 1) Meter 인터페이스는 start와 stop이라는 추상 메서드가 있다. stop메서드는 택시가 달린 거리(distance)를 매개변수로 받아 요금은 int형으롭 반환하는 메서드입니다. Meter 인터페이스를 구현하는 택시클래스를 완성하라 

(요금 = 2 * distance )

<hide/>
package javaStudy;
public class Taxi {
	
    // 정답 채우기
    
}
<hide/>
package javaStudy;
public interface Meter {
	public abstract void start();
	public abstract int stop(int distance);	
}
<hide/>
package javaStudy;
public class MeterExam {
	public static void main(String[] args) {
		Taxi taxi = new Taxi();
		boolean a = Meter.class.isInstance(taxi);
		if( a!= true ){
			System.out.println("Taxi클래스는 Meter 인터페이스를 구현해야 합니다.");
		}
		else if( taxi.stop(200) != 400 ){
			System.out.println("stop(200)의 값은 400이어야 합니다.");
		}
		else {
			System.out.println("정답입니다.");
		}
	}
}

 

  Note) 출력 결과: 정답입니다.

  - 정답 

<hide/>
package javaStudy;
public class Taxi implements Meter {
	@Override
	public void start() {
		// TODO Auto-generated method stub
	}
	@Override
	public int stop(int distance) {
		// TODO Auto-generated method stub
		return 2 * distance;
	}
}

  - 인터페이스를 구현하기 위한 키워드는 implements이다.  

  - Meter인터페이스는 start(), stop()메서드를 정의하므로 Taxi클래스는 두 메서드를 반드시 구현해야 한다. 

  - stop 메서드에 대한 조건에 맞추어 Meter인터페이스를 구현하는 Taxi 클래스에 메서드를 만든다.

 

 

08-43.4 인터페이스 사용하기 실습

  Ex 2) 다음 코드를 실행하면 "cannot assign a value to final varoable BASE_FARE"라는 에러가 난다. Meter 인터페이스에서 정의한 BASE_FARE(기본요금)이라는 변수의 값을 변경하려고 하기 때문이다. 인터페이스에서 정의한 변수는 모두 상수이므로 변경할 수 없다. BASE_FARE 정의한 부분을 Mete인터페이스에서 Taxi클래스로 옮겨라.

 

<hide/>
package javaStudy;
public interface Meter {
	public int BASE_FARE = 3000;
	public abstract void start();
	public abstract int stop(int distance);	
}
<hide/>
package javaStudy;
public class Taxi implements Meter {
	public void start() {
		System.out.println("운행을 시작합니다.");
	}
	
	public int stop(int distance) {
		int fare = BASE_FARE + distance * 2;
		System.out.println("운행을 종료합니다. 요금은 " + fare + "원입니다.");
		return fare;
	}
}
<hide/>
package javaStudy;
public class TaxiExam {
	public static void main(String[] args) {
		Taxi taxi = new Taxi();
		System.out.println("기본요금 변경 전!!");
		taxi.stop(20);
		taxi.BASE_FARE = 2500;
		System.out.println("기본요금 변경 후!!");
		taxi.stop(20);	
	}
}

 

  Note) 정답

package javaStudy;
public class Taxi implements Meter {
	public void start() {
		System.out.println("운행을 시작합니다.");
	}
	public int BASE_FARE = 3000;
	public int stop(int distance) {
		int fare = BASE_FARE + distance * 2;
		System.out.println("운행을 종료합니다. 요금은 " + fare + "원입니다.");
		return fare;
	}
}
< hide/>
package javaStudy;
public interface Meter {
	
	public abstract void start();
	public abstract int stop(int distance);	
}

  Note) 실행결과:

  - Meter인터페이스에 선언한 "BASE_FARE= 3000"을 Taxi클래스로 옮긴다.

  - 인터페이스에 선언한 변수는 무조건 상수로 처리 된다.

  - 이렇게 선언한 변수는 실행 중에 변경할 수 없다.