08검증 문제
비공개 상수로 method 제한하기
1. 의도한 동작과 현재 동작
capacity는 패키지 수준에서 선언한 비공개 상수이며, 호출자는 이 상수를 볼 수 없습니다.
mkGate가 받아들일 수 있는 인원은 capacity 하나로 정해야 합니다. seated가
capacity에 도달하면 admit은 더 이상 준비 상태가 되지 않아야 합니다.
starter에서 admit의 준비 조건은 capacity가 아니라 리터럴 6과 seated를 비교합니다.
그 결과 gate가 여섯 번까지 받아들이고, capacity를 바꿔도 동작이 달라지지 않습니다.
비공개 상수가 공개 method를 제어하지 못하는 상태입니다.
수정 대상은 admit 준비 조건의 식 하나입니다. 한계는 호출하는 rule이 아니라 method에
둡니다. 호출자는 비공개 capacity를 알 필요가 없으므로 조건을 drive로 옮기지 마세요.
2. starter 읽기와 예측
모듈보다 패키지 수준 선언을 먼저 읽어 보세요. 그다음 capacity의 값과 admit method
header의 조건을 비교합니다.
mkTop의 drive는 여덟 사이클 동안 매번 admit 호출을 시도하고, show가 마지막에
admitted를 출력합니다. 실행하기 전에 두 값을 예측해 보세요.
- 현재 리터럴 조건에서
admit호출은 몇 번 받아들여질까요? - 패키지의
capacity를 따른다면 몇 번 받아들여져야 할까요?
수정하기 전 코드를 한 번 실행해 첫 번째 예측을 확인해 보세요.
3. 수정과 설명
준비 조건이 패키지 수준 상수를 따르도록 고치세요. 수정한 뒤 실행해 마지막 출력값이
capacity와 같은지 확인합니다. 한계에 도달한 뒤 drive가 더 이상 실행되지 않는 이유를
method의 준비 조건으로 설명해 보세요.
4. 완료 조건
seated가capacity에 도달하면admit이 준비되지 않습니다.- 한계를 리터럴로 반복하지 않고 패키지 수준 상수에서 얻습니다.
- 한계 조건은 method의 준비 조건에 남습니다.
- 같은 경계에서 호출자의 추가 실행도 막힙니다. 마지막 출력만 맞고 호출을 더 받아들이면 완료가 아닙니다.
5. 단계형 힌트
힌트 1
준비 조건은 method header의 if (와 ) 사이에 있는 식입니다. 그 식에 쓰인 이름과 값을
패키지 선언과 하나씩 비교해 보세요.
힌트 2
패키지 수준 상수는 같은 패키지의 모든 모듈에서 사용할 수 있습니다. method 안에서도
capacity를 이름으로 직접 참조할 수 있습니다.
개념 설명
비공개 패키지 수준 정의도 패키지 안에서는 어디서나 사용할 수 있습니다. 값을 한 곳에 정의하고 이름으로 참조하면, 공개 method의 동작이 호출자가 볼 수 없는 값 하나로 결정됩니다.
6. 추가 실험
수정한 뒤 method와 호출자는 그대로 두고 capacity만 1부터 7 사이의 다른 값으로 바꿔 보세요. 받아들여지는
호출 수와 마지막 출력을 예측한 뒤 실행합니다. 비공개 선언 하나가 전체 동작을 결정하는지
확인하는 실험입니다.