1-1. 정답 숫자 생성하기
>> Set과 HashSet 대신 List와 Collections.shuffle을 사용한 이유?
1. 코드의 간결성과 가독성 향상
Collections.shuffle을 사용하면 한 번의 메서드 호출로 리스트 전체를 무작위로 섞을 수 있다.
이를 통해 중복되지 않는 랜덤 숫자들을 손쉽게 얻을 수 있으며, 추가적인 중복 검사나 복잡한 루프가 필요하지 않다.
반면에 Set과 HashSet을 사용하면, 중복되지 않는 숫자를 얻기 위해 랜덤 숫자를 생성하고 중복 여부를 확인하는 반복문을 작성해야 한다.
이 방법은 코드가 더 길어지고 복잡해질 수 있으며, 가독성이 떨어질 수 있다.
2. 효율성 및 성능 향상
Collections.shuffle은 리스트를 한 번만 섞으면 되기 때문에, 고정된 시간 내에 작업이 완료된다.
Set과 HashSet을 사용하여 랜덤 숫자를 생성하는 경우, 중복된 숫자가 생성되면 Set에 추가되지 않으므로, 원하는 개수의 고유한 숫자를 얻기 위해 반복 횟수가 증가할 수 있다.
특히 숫자의 범위가 좁아지고 필요한 숫자의 개수가 많아질수록, 중복으로 인한 반복 횟수가 증가하여 비효율적일 수 있다.
3. 순서 유지 및 접근 용이성
List는 인덱스를 사용하여 요소에 접근할 수 있으며, 요소들의 순서가 유지된다.
이는 게임 로직에서 자리수별로 숫자를 비교해야 하는 경우에 매우 유용하다.
반면에 Set과 HashSet은 요소의 순서를 보장하지 않으며, 인덱스를 통해 직접 접근할 수 없다.
따라서 Set에서 배열이나 리스트로 변환하는 추가 작업이 필요하며, 변환 후에도 요소의 순서가 예측되지 않는다.
4. 중복 방지를 위한 추가 로직 불필요
Collections.shuffle을 사용하면 초기 리스트에 중복이 없으므로, 섞은 후에도 중복이 발생하지 않는다.
따라서 중복 방지를 위한 추가적인 로직이나 검사가 필요 없다.
Set과 HashSet을 사용하는 경우, 중복되지 않는 숫자가 원하는 개수만큼 모일 때까지 랜덤 숫자를 계속 생성하고 Set에 추가하는 반복 작업이 필요하다.
5. 코드의 간결성과 유지보수성 향상
List와 Collections.shuffle을 사용하면 코드가 더 간결하고 직관적이다.
이는 코드의 유지보수성을 높이고, 다른 개발자들이 코드를 이해하고 수정하는 데 도움이 된다.
결론
List와 Collections.shuffle을 사용하면 중복되지 않는 숫자들을 효율적으로 생성할 수 있으며, 코드의 간결성과 가독성이 향상된다.
게임 로직에서 필요한 자리수별 비교를 쉽게 구현할 수 있으며, 중복 방지를 위한 추가 로직이 필요 없다.
따라서 Set과 HashSet을 사용하는 것보다 List와 Collections.shuffle을 사용하는 것이 이 경우에 더 적합하다.
1-3. 결과값 출력 및 게임 로직 적용하기
>> 7. 힌트 출력을 위한 방법은?
① += 연산자를 사용하여 문자열을 덧붙이는 방법
장점
간단하고 직관적: += 연산자를 사용하여 문자열을 순차적으로 추가하므로, 코드가 간결하고 이해하기 쉽다.
빠른 구현: 추가적인 클래스를 사용할 필요 없이, 기본적인 문자열 연산만으로 구현이 가능하다.
단점
성능 저하 가능성: 많은 문자열을 반복적으로 덧붙일 경우, String 객체가 불변(immutable) 특성 때문에 매번 새로운 객체가 생성되어 성능에 영향을 줄 수 있다. 하지만, 현재와 같이 소수의 문자열을 덧붙이는 경우에는 큰 문제가 되지 않는다.
오타 및 공백 관리의 어려움: 공백을 적절히 추가하지 않으면 단어들이 붙어서 출력될 수 있으며, 이를 관리하기 위해 trim()을 사용해야 할 수 있다.
② StringBuilder를 사용하여 문자열을 빌드하는 방법
장점
성능 효율성: StringBuilder는 가변(mutable) 객체로, 여러 번의 문자열 추가 작업에서 성능상 유리하다. 특히, 대규모 문자열 처리 시 유용하다.
가독성 향상: append() 메서드를 사용하여 문자열을 추가하므로, 문자열의 구조가 명확하게 드러난다.
단점
코드 복잡성 증가: StringBuilder 객체를 생성하고, append() 메서드를 호출해야 하므로, 코드가 다소 길어지고 복잡해질 수 있다.
추가적인 클래스 사용: StringBuilder는 별도의 클래스를 사용해야 하므로, 간단한 작업에는 다소 과할 수 있다.
③ List<String>과 String.join()을 사용하여 문자열을 결합하는 방법
장점
가독성 및 유연성: 힌트 메시지를 리스트에 추가한 후, String.join()을 사용하여 공백으로 구분된 하나의 문자열로 결합하므로, 코드가 매우 명확하고 읽기 쉽다.
공백 관리 자동화: String.join(" ", hints)가 자동으로 공백을 추가하므로, 별도의 trim()을 사용할 필요가 없다.
유연한 확장성: 추후에 다른 힌트 요소를 추가하거나 변경할 때, 리스트에 요소를 추가하기만 하면 되므로 유연하다.
단점
추가적인 데이터 구조 사용: List<String>을 사용해야 하므로, 약간의 메모리 오버헤드가 발생할 수 있다. 하지만, 일반적인 경우에는 무시할 만큼 작다.
약간의 코드 길이 증가: 리스트를 생성하고, 요소를 추가하는 과정이 필요하므로, 간단한 += 연산자 사용보다 코드가 길어질 수 있다.
>> 위의 세 가지 방법 중에서 왜 += 연산자를 사용하여 문자열을 덧붙이는 방법을 선택했는가?
1. 간결함과 직관성
+= 연산자는 코드가 짧고 간단하여, 힌트 메시지를 빠르게 구성할 수 있다.
특히, 스트라이크와 볼의 개수가 소수일 때, 코드를 이해하고 유지보수하기 쉽다.
2. 성능 영향이 미미함
현재의 사용 사례에서는 스트라이크와 볼의 개수가 매우 적기 때문에, += 연산자의 성능 저하 문제가 발생하지 않는다.
문자열이 많이 덧붙여지지 않으므로, StringBuilder나 List<String>을 사용하는 것보다 간단하다.
3. 추가적인 클래스나 데이터 구조의 필요 없음
별도의 클래스를 사용하거나, 리스트를 생성할 필요 없이, 기본적인 문자열 연산만으로 구현이 가능하다.
이는 코드의 복잡성을 낮추고, 초기 학습 비용을 줄인다.
>> 대안 방법들과의 비교
StringBuilder 사용
장점: 성능상 이점이 있으나, 현재의 간단한 사용 사례에서는 과할 수 있다.
단점: 코드가 다소 복잡해지고, 추가적인 클래스 사용이 필요하다.
List<String>과 String.join() 사용
장점: 가독성이 높고, 공백 관리가 자동화된다.
단점: 리스트를 생성하고, 요소를 추가하는 과정이 필요하여, 코드가 다소 길어질 수 있다.
결론
현재의 힌트 메시지 출력 요구사항은 간단한 문자열 덧붙이기로 충분하며, += 연산자를 사용하는 것이 가장 간결하고 효율적이다. 또한, 성능 저하가 발생할 가능성도 매우 낮으므로, StringBuilder나 List<String>과 같은 대안 방법들을 사용할 필요가 없다.
'스파르타 코딩' 카테고리의 다른 글
일정 관리 앱 제작 트러블 슈팅 (2) | 2024.10.17 |
---|---|
[JDBC를 활용한 CRUD] 일정 관리 앱 만들기 과제 트러블슈팅 (3) | 2024.10.04 |
[JAVA] 자바 Project / Package / Class / Methods / Variable 명명 규칙 (0) | 2024.09.19 |
VS Code에서 git 사용법 총정리 (git pull, git push) (0) | 2024.08.30 |
초보 개발자를 위한 코딩 용어 정리 사전 (1) (1) | 2024.08.02 |