관련은 없지만 올리신 코드를 좀 더 읽기 쉬운 형태로 업데이트하시면 어떨까 싶습니다.
먼저 액티비티에 있는 뷰를 private member로 변경해서 한번만 변수를 초기화 하고 여러군데서 재사용하도록 했습니다.
그리고 rollButton 이벤트 리스너도 rollDice()라는 private method를 만들어 위임했습니다. 이유는 redability(가독성)입니다.
버튼클릭 리스너 안에 로직을 다 집어넣을 경우 해당 버튼 클릭이 무얼하는지 이해하려면 코드를 다 읽어야 하기 때문입니다.
rollDice()라는 메소들 사용함으로써 rollDice()메소드 내용을 보지 않더라도 해당 버튼을 누르면 "주사위를 굴린다"고 금방 이해 할 수 있습니다.
public class MainActivity extends AppCompatActivity {
private ImageView diceImage;
private TextView diceNumberText;
private Button rollButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
}
private void bindViews() {
diceImage = findViewById(R.id.diceImage);
diceNumberText = findViewById(R.id.diceResult);
rollButton = findViewById(R.id.rollButton);
rollButton.setOnClickLisetner(v -> rollDice());
}
private void rollDice() {
}
}
이제, rollDice() 를 구현할 차례입니다. 잘 생각해 보시면 주사위 번호를 랜덤하게 생성하는 코드는 화면과는 관계없는 일종의 비지니스 로직입니다. 따라서 이 로직이 변경될 때는 관련된 부분만 변경하는 것이 좋고 뷰와는 다른 역할이므로, 별도의 클래스를 만드는 것이 타당해 보입니다. 이렇게 하면 추후 로직 변경도 쉽고 단위테스틀 작성할 때도 쉬워집니다.
public static class DiceNumberGenerator {
private final Random random = new Random();
public int next() {
return random.nextInt(7) + 1;
}
}
이제 DiceNumberGenerator 를 MainActivity에서 사용하면 되는데, 기존의 코드를 보시면 생성된 넘버에 따라 이미지 리소스를 매핑하는 부분이 좀 복잡합니다. 리소스의 갯수가 늘어나거나 하면 더 복잡해 지겠죠. 이럴 때 사용할 수 있는 것이 매핑테이블인데,
enum 같은 구조를 사용하면 훨씬 깔끔해 집니다.
package network;
public enum DiceNumberType {
ONE(1, R.drawable.dice1),
TWO(2, R.drawable.dice2),
THREE(3, R.drawable.dice3),
FOUR(4, R.drawable.dice4),
SIX(5, R.drawable.dice5),
SEVEN(6, R.drawable.dice6);
private final int value;
private final int drawableId;
DiceNumberType(int value, int drawableId) {
this.value = value;
this.drawableId = drawableId;
}
public int getValue() {
return value;
}
public int getDrawableId() {
return drawableId;
}
@Nullable
public static DiceNumberType byValue(int value) {
for (DiceNumberType diceNumberType : values()) {
if (diceNumberType.getValue() == value) {
return diceNumberType;
}
}
return null;
}
}
이제 MainActivity의 rollDice()를 구현합니다.
public class MainActivity extends AppCompatActivity {
...
private DiceNumberGenerator diceNumberGenerator;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
diceNumberGenerator = new DiceNumberGenerator();
bindViews();
}
private void bindViews() {
...
}
private void rollDice() {
int diceNumber = diceNumberGenerator.next();
DiceNumberType diceNumberType = Objects.requireNonNull(DiceNumberType.byValue(diceNumber));
diceNumberText.setText("" + diceNumberType.getValue());
diceImage.setImageResource(diceNumberType.getDrawableId());
}
}