Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
Mission 2. 연습문제
#pragmatic
2년 전
470

연습문제 14.

부엌용 믹서의 인터페이스를 설계하라. 이 믹서는 나중에 웹으로 쓸 수 있도록 사물 인터넷IoT으로 연결될 예정이지만, 지금으로서는 믹서를 제어할 수 있는 인터페이스만 있으면 된다. 속도를 열 단계로 설정할 수 있는데 0은 중지를 의미한다. 비어 있는 상태에서는 작동할 수 없고, 한 번에 한 칸씩만 속도를 바꿀 수 있다. 즉 0에서 1, 1에서 2는 되지만, 0에서 2는 안 된다.

다음과 같은 메서드가 있을 때, 적절한 선행, 후행 조건과 불변식을 추가하라.

int getSpeed()

void setSpeed(int x)

boolean isFull()

void fill()

void empty()

풀이답안 )

선행 조건 - 루틴이 호출되기 위해 참 이어야 하는 것.
제대로된 데이터를 전달하는 것은 호출하는 쪽의 책임

후행 조건 - 루틴이 자기가 할 것이라고 보장하는 것.

클래스 불변식 - 호출자의 입장에서 이 조건이 언제나 참인 것을 클래스가 보장한다.


조건 1) 속도는 10단계, 0은 정지를 의미한다.

조건 2) 비어 있는 상태에서는 작동할 수 없다.

조건 3) 한 번에 한 칸씩만 속도 조절이 가능하다.

* 전제조건 >> 전체적으로 꼭 성립되어야 하는 조건

불변식1) getSpeed() >= 0 && getSpeed() < 10

# 속도는 0부터 10까지 설정한다

불변식2) !isFull() && getSpeed() == 0

# 믹서기가 채워져 있지 않으면 항상 중지되어 있어야 한다

* 속도조절 >> 변수 x는 입력한 속도

선행문1) x >=0 && x < 10

# 입력한 속도는 반드시 범위 내 값 이어야 한다.

선행문2) getSpeed() > x ? (getSpeed - x <= 1) : (x - getSpeed <= 1)

# 입력한 속도는 기존 속도와 1이내 이어야한다.

후행문) getSpeed() = x

# 실행 후 getSpeed()를 호출시 x가 나와야 한다.

void setSpeed(int x)

* 내용물 채우기 >> 채워져 있지 않아야 채울 수 있다.

선행문) !isFull()

# 채우려면 믹서기 내부가 비어있어야한다.

후행문) isFull()

# 채우고 나면 조건 성립

void fill()

* 내용물 비우기 >> 채워져 있어야 비울 수 있다.

선행문) isFull()

# 비우려면 믹서기 내부가 채워져있어야한다.

후행문) !isFull()

# 비우고 나면 조건 성립

void empty()

해답 )

인터페이스를 자바 코드로 적어 보겠다. 계약 내용은 주석에 적는다.

먼저 이 클래스의 불변식이다.

/**

* @invariant getSpeed() > 0

* implies isFull()

*

* @invariant getSpeed() >= 0 && getSpeed() < 10

*/

/**

@pre Math.abs(getSpeed() - x) <= 1 @pre x >= 0 && x < 10

* @post getSpeed() == x

*/

public void setSpeed(final int x)

/**

* @pre !isFull()

* @post isFull()

*/

void fill()

/**

* @pre isFull()

* @post !isFull()

*/

void empty()