우아한테크코스/3주차 프리코스
[Java] 3주차 스터디 - Enum
행복한라이언
2023. 11. 8. 15:27
728x90
반응형
1. 상수 인터페이스
1) 상수를 관리하는 이유
- 문자열 관리 용이성: 1주차 성공했던 코드에서 리팩토링 과정 중에 테스트 "FAILED" 발생했다. "~게임종료"를 빼먹고 옮기지 않았기 때문이다. 그래서 이건 문자열을 한 곳에서 관리할 필요를 느꼈다.
// FAILED
"3스트라이크\n3개의 숫자를 모두 맞히셨습니다!"
// 출력해야할 것
"3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료"
- 매직넘버 제거: 3스트라이크 이후에 게임을 멈출지, 다시할지 결정하는 방법은 "1" 또는 "2"를 입력하는 것이다. 그런데 1과 2가 그런 의미를 갖는 것을 직관적으로 알 수 없다. 이런 수를 매직넘버라고한다. 코드의 가독성을 위해서 상수로 관리할 필요를 느꼈다.
- 1 → gameConitnue, 2 → GameStop
String gameStop = "2";
String gameContinue = "1";
2) 인터페이스를 사용하는 이유
- 인터페이스의 멤버는 'public static final' 속성 생략 가능! → 코드 간결해지고 가독성 상승
package baseball;
public interface Constants {
// 숫자 야구의 규모 결정
int validLength = 3;
String hintAllStrikeMessage = "3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료";
String hintNothingMessage = "낫싱";
String hintStrikeMessageFormat = "%d스트라이크";
String hintBallMessageFormat = "%d볼";
String hintBallStrikeMessageFormat = "%d볼 %d스트라이크";
String inputRequestMessage = "숫자를 입력해주세요 : ";
String startGameMessage = "숫자 야구 게임을 시작합니다.";
String continueGameMessage = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.";
String endGameMessage = "게임이 종료되었습니다.";
String gameStop = "2";
String gameContinue = "1";
}
2. Enum의 도입
1) 왜 상수 인터페이스 대신 Enum 사용할까?
- 상수의 개수가 많아질수록 어떤 것에 관한 상수인지 파악하는 것이 어려워진다. 용도에 따라 분리를 해줘야 어떤 것에 대한 상수인지 파악이 쉽다. 밑의 예시만 보더라도 상수를 Constants 인터페이스에서만 관리하니깐 공백으로 구분을 했음에도 어떤 용도인지 파악이 쉽지 않다.
package baseball;
public interface Constants {
// 숫자 야구의 규모 결정
int validLength = 3;
String hintAllStrikeMessage = "3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료";
String hintNothingMessage = "낫싱";
String hintStrikeMessageFormat = "%d스트라이크";
String hintBallMessageFormat = "%d볼";
String hintBallStrikeMessageFormat = "%d볼 %d스트라이크";
String inputRequestMessage = "숫자를 입력해주세요 : ";
String startGameMessage = "숫자 야구 게임을 시작합니다.";
String continueGameMessage = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.";
String endGameMessage = "게임이 종료되었습니다.";
String gameStop = "2";
String gameContinue = "1";
}
- 서로 다른 인터페이스에서 정의된 CAMPUS.Jamsil과 TRACK.BE 비교가 되고 있다. 상수는 변하지 않는 값을 의미하기도 하지만 고유값이라는 의미도 갖는다. CAMPUS 에서 1의 의미는 Jamsil 이고 TRACK에서 1의 의미는 BE다. 즉 둘은 논리적으로 같지 않다. 하지만 같은 정수값을 가지고 있기 때문에 비교가 되고 에러가 나지는 않는다.
- track에 CAMPUS.Jamsil을 넣어도 에러가 발생하지 않고 잘 작동한다.
- 둘 모두 우리가 의도한 것과 다르게 코드를 구성했음에도 불구하고 컴파일에러는 발생하지 않지만 프로그램이 더 복잡해지면 내 의도와 달리 작동해서 에러가 발생할 수도 있다.
interface CAMPUS{
int JamSil = 1;
int Seolleung = 2;
}
interface TRACK{
int BE = 1;
int FE = 2;
int AN = 3;
}
public class EnumPractice {
public static void main(String[] args) {
if(CAMPUS.JamSil == TRACK.BE){
System.out.println("두 상수는 같습니다"); // 두 상수는 같습니다.
}
int track = CAMPUS.Jamsil;
switch (track){
case TRACK.BE:
System.out.println("백엔드"); // 백엔드
break;
case TRACK.FE:
System.out.println("프론트엔드");
break;
case TRACK.AN:
System.out.println("안드로이드");
break;
}
}
}
3. Enum의 활용
- 상수 인터페이스 → Enum 맵핑
package baseball;
public enum HintMessage {
// 대문자(" ") - enum 맵핑 클래스
ALLSTRIKE("3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료"),
NOTHINGMESSAGE("낫싱"),
STRIKEFORMAT("%d스트라이크"),
BALLFORMAT("%d볼"),
BALLSTRIKFORMAT("%d볼 %d스트라이크");
private final String message;
HintMessage(String message) {
this.message = message;
}
public String get() {
return message;
}
}
- 그룹 관리에 유리 - ( Python의 tuple과 유사 )
package lotto;
enum LottoMessage {
THREE("3개 일치 (5,000원)", 5000),
FOUR("4개 일치 (50,000원)", 50000),
FIVE("5개 일치 (1,500,000원)", 1500000),
BONUS("5개 일치, 보너스 볼 일치 (30,000,000원)", 30000000),
SIX("6개 일치 (2,000,000,000원)", 2000000000);
final String message;
final int winningAmount;
LottoMessage(final String message, final int winningAmount){
this.message = message;
this.winningAmount = winningAmount;
}
}
728x90
반응형