본문 바로가기
백엔드/멋쟁이사자처럼

Lotto 코드 짜기

by 발빠진 쥐 2025. 2. 5.
package lotto;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThatThrownBy;

class LottoTest {
    @DisplayName("로또 번호의 개수가 6개가 넘어가면 예외가 발생한다.")
    @Test
    void createLottoByOverSize() {
        assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7)))
                .isInstanceOf(IllegalArgumentException.class);
    }

    @DisplayName("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.")
    @Test
    void createLottoByDuplicatedNumber() {
        // TODO: 이 테스트가 통과할 수 있게 구현 코드 작성
        assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5)))
                .isInstanceOf(IllegalArgumentException.class);
    }

    // 아래에 추가 테스트 작성 가능
    @DisplayName("로또 번호가 1~45 범위를 벗어나면 예외가 발생한다.")
    @Test
    void createLottoByOutOfRangeNumber() {
        assertThatThrownBy(() -> new Lotto(List.of(0, 2, 3, 4, 5, 6)))  // 0
                .isInstanceOf(IllegalArgumentException.class)
                .hasMessage("[ERROR] 로또 번호는 1~45 사이여야 합니다.");

        assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 46)))  // 46 이상
                .isInstanceOf(IllegalArgumentException.class)
                .hasMessage("[ERROR] 로또 번호는 1~45 사이여야 합니다.");
    }
}

1. Lotto 와 LottoTest 코드

 

-1번째 코드 (오류 남)

package lotto;
/*
Lotto 클래스
  1.6개 숫자 저장하기
  2.숫자 검사
    -중복 확인
    -범위(1~45) 확인
 */
import java.util.*;
import camp.nextstep.edu.missionutils.Randoms;
import camp.nextstep.edu.missionutils.Console;

public class Lotto {
    private final List<Integer> numbers;

    public Lotto(List<Integer> numbers) {
        validate(numbers);
        range(numbers); //수정 1
        duplication(numbers); //수정 2
        this.numbers = numbers;
    }

    private void validate(List<Integer> numbers) {
        if (numbers.size() != 6) {
            throw new IllegalArgumentException("[ERROR] 로또 번호는 6개여야 합니다.");
        }
    }

    // TODO: 추가 기능 구현
    private void range(List<Integer> numbers) {
        for(int number : numbers){
            if (number < 1 || number > 45) {
                throw new IllegalArgumentException("[ERROR] 로또 번호는 1~45 사이여야 합니다.");
            }
        }
    }

    private void duplication(List<Integer> numbers) {
        if (new HashSet<>(numbers).size() != numbers.size()) {
            throw new IllegalArgumentException("[ERROR] 로또 번호는 중복될 수 없습니다.");
        }
    }

}

range()랑 duplication()을 따로 호출하지 않아서 오류가 남

생성자에서 range() 와 duplication() 을 호출함.

validate 에 호출해도 되지만 그냥 생성자에 호출하는게 더 이뻐서 그렇게 했음

 

Lotto랑 LottoTest 완료~


LottoBuy 코드 짜기

 

split 과 join 차이

// 1. 사용자 입력 받기 (쉼표로 구분된 문자열)
String input = Console.readLine();

// 2. 쉼표 기준으로 문자열 나누기
String[] lottoNumbersIn = input.split(",");

// 3. 숫자로 변환하여 리스트에 저장
List<Integer> lottoNumbers = new ArrayList<>();
for (String num : lottoNumbersIn) {
    lottoNumbers.add(Integer.parseInt(num.trim())); // 공백 제거 후 숫자로 변환
}

// 4. List<Integer>를 List<String>으로 변환
List<String> lottoNumbersStr = new ArrayList<>();
for (Integer num : lottoNumbers) {
    lottoNumbersStr.add(String.valueOf(num)); // 숫자를 문자열로 변환
}

// 5. join()을 사용하여 문자열로 변환
String joinedNumbers = String.join(",", lottoNumbersStr);
System.out.println(joinedNumbers); // 예: "1,2,3,4,5,6"

 

// 1. 사용자 입력 받기 (쉼표로 구분된 문자열)
String input = Console.readLine(); // 예: "1,2,3,4,5,6"

// 2. 쉼표 기준으로 문자열 나누기
String[] lottoNumbersIn = input.split(",");

// 3. 숫자로 변환하여 리스트에 저장
List<Integer> lottoNumbers = new ArrayList<>();
for (String num : lottoNumbersIn) {
    lottoNumbers.add(Integer.parseInt(num.trim())); // 공백 제거 후 숫자로 변환
}

// 4. 최종 리스트 출력 (디버깅용)
System.out.println(lottoNumbers); // 예: [1, 2, 3, 4, 5, 6]

 

차이 :