IT/JAVA

[JAVA] 정수 2개를 입력받고 랜덤수 3개 출력하기

_KH_ 2024. 12. 31. 16:56

팀별로 코드를 작성하고 코드 리뷰하는 시간을 가졌다. 

 

[한글 코딩] 

		스캐너 변수 선언
		
		정수 1을 입력하라는 문구 출력
		변수 a에 정수 1을 입력받음
		정수 2를 입력하라는 문구 출력
		변수 b에 정수 2를 입력받음
		
		정수 1과 정수 2 사이의 범위 내에서라면
		정수 1과 정수 2 중 어떤 것이 더 크고 작은지 비교
		
		1.만약 정수 1(a)이 2(b)보다 크다면?
		임시 저장 변수에 정수 1을 저장하고
		정수 1에 정수 2를 대입
		임시 저장 변수에 있는 정수 1의 값을 정수 2에 대입
		-----------------------------------
		2. 시작점을 나타내는 변수명을 선언
		정수 1이 정수 2보다 크다면? 정수 1이 시작점, 아니면 정수 2가 시작점
		종점을 나타내는 변수명을 선언
		정수 1이 
		정수 2보다 크다면? 정수 1이 끝점, 아니면 정수 2가 끝점
		
		정수 1과 정수 2 사이에서 3개 이상의 다른 수가 나와야하니까
		b가 a보다 크면 b와 a가 2이상 차이가 나는지 비교하기
		정수 1과 정수 2의 차이가 2 미만일 경우에는 오류 문구 출력 후 프로그램 종료
		(b가 a보다 큰지 검사하고, b가 a랑 2 이상 차이나는지 검사함)
		
		만약 정수1과 정수 2가 같다면?!!!!
		프로그램 종료
		
		랜덤 변수 선언
		
		중복없이 값을 얻기 위한 반복문(while) 필요
		랜덤수 1을 선언하고 랜덤값 받기(정수 1 - 정수 2 사이 랜덤수)//(끝점 - 시작점 + 1) + 시작점
		랜덤수 2를 선언하고 랜덤값 받기(정수 1- 정수 2 사이 랜덤수)
		만약 랜덤수1과 랜덤수2의 값이 다르면 반복문 탈출
		랜덤수 3을 선언하고 랜덤값 받기 
		만약 랜덤수 1과 값이 다르고 랜덤수 2와도 값이 다르면 반복문 탈출
		
		입력된 범위 출력(a~b)
		랜덤수 1 출력
		랜덤수 2 출력
		랜덤수 3 출력
		
		
		// 정수 입력 받을 때 필요한 조건
		// 1. 정수1과 정수2는 2개 이상의 차이를 가져야 한다.
		// 2. 정수1과 정수2는 같으면 안된다.
		// 3. 더 작은 수부터 시작하여 큰 수까지가 범위가 되어야 한다. (크기 비교 필요)
		
		// 랜덤수 가져올 때 필요한 조건
		// 1. 3개의 랜덤수는 중복되면 안됨
		// 2. 언제 다른 3개의 랜덤수가 나올지 알 수 없음 -> while문 사용
		// 3. 범위는 정수1과 정수2 사이

한글 코딩을 하면서 느낀 건 정말 한글 코딩을 명확히 해야 제대로 된 코드를 작성할 수 있다는 것이다..

한글 코딩부터 안되는데 냅다 영어로 입력하려하면 아무것도 안된다 ㅠㅠ

 

 

[처음 작성한 코드]

package day004;

import java.util.Random;
import java.util.Scanner;

public class FirstTest {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

		System.out.println("정수 1을 입력하세요 : ");
		System.out.println(">>");
		int a = sc.nextInt();
		System.out.println("정수 2를 입력하세요(정수 1과 값이 달라야 하며 최소 차이가 2 이상이어야 합니다.) : ");
		System.out.println(">>");
		int b = sc.nextInt();

		if(a>b) {
			int tmp = a;
			a = b;
			b = tmp;
		}
		if(a == b) {  
		    System.out.println("두 수가 같습니다. 다시 입력해주세요!");
		    return; 
		} 
		if (b <= a+1) {  
		    System.out.println("범위가 너무 좁습니다! 두 수는 2 이상 차이가 나야 합니다!");
		    return;
		}

		Random rand = new Random(); 

		int num1 = rand.nextInt(b-a+1) + a; 

		int num2;
		while(true) { 
			num2 = rand.nextInt(b-a+1) + a;
			if(num1 != num2) break; 
		}

		int num3;
		while(true) { 
			num3 = rand.nextInt(b-a+1) + a;
			if(num1 != num3 && num2 != num3) break; 
		}
		System.out.println("입력된 범위 : " + a + " ~ " + b); 
		System.out.println("랜덤수 1 : " + num1); 
		System.out.println("랜덤수 2 : " + num2);
		System.out.println("랜덤수 3 : " + num3); 
	}
}

 

if- else if문으로 썼다가 오류나서 수정.. 또 수정.. 하다가 결국은 if문 3개로 최종 결정했다!

if - else if를 썼더니 scanner 문제인지 자꾸 입력상태에서 멈추길래 if문 3개로 나누어,

첫 번째 if문에서는 a가 b보다 작은 수인지 검토하고, 두 번째 if문에서는 a가 b와 같은지를 검토하고, 세 번째 if문에서는 a와 b가 2 이상 차이나는 수인지를 검토하였다.

 

프로그램은 잘 돌아가지만 코드 리뷰 후 강사님께서 피드백 해주신 부분은!

 

1. while VS for, scope 등의 내용 정리 명확히 하기

2. UI 고려하기 (사용자 뿐만 아니라 개발자도 함께 고려)

3. 상수화 & 상수화할 포인트 고찰해보기! 

 

 

1. while vs for, scope 등 내용 정리 명확히

 

while문과 for문의 차이에 대해 그냥 막연히 while문은 범위가 정해져 있지 않을 때 쓰고, for문은 범위가 정해져 있을 때 쓴다고 생각했는데 

 

while문은 반복횟수가 불분명할 때, 

for문은 반복횟수가 분명할 때 사용하는 것이다.

 

예를 들어 1부터 10까지의 범위 내에서 3개의 랜덤 수를 출력한다고 할 때, 1부터 10까지 범위가 정해져 있으니 for문을 사용해야 한다고 생각할 수도 있지만, 사실상 3개의 겹치지 않는 랜덤 수가 언제 나올지 명확하게 알 수 없기 때문에 while문을 사용해야 하는 것이다.

 

2. UI 고려하기 

 

UI라고 하면 항상 사용자를 위한 UI만을 생각했지 개발자를 위한 UI는 그렇게 고려해본 적이 없는 것 같다.. 

물론 사용자를 위한 UI에 대해서도 개선점이 많다. 하지만 개발자에 대한 UI에도 신경을 쓸 필요가 있음을 이제서야 깨달은 것 같다 ㅠ 자주 쓰는 값이나 변수는 상수화하고, 변수명은 무엇을 나타내는지 알아보기 쉽게, 그리고 { }(중괄호)를 명확히 구분하여 어디까지가 한 블록인지 알아보기 쉽게 표현해야겠다고 생각했다.

 

3. 상수화 & 상수화할 포인트 고찰해보기

 

위에서 랜덤수의 범위를 지정하는 b-a+1 같은 경우 랜덤 수를 뽑을 때마다 반복되기 때문에 final로 선언하여 상수화하면 개발자가 알아보기도 편하고, 계속해서 b-a+1를 입력할 필요도 없음을 알게 됐다.

 

[수정된 코드]

	Scanner sc = new Scanner(System.in);
		System.out.println("문제 : 정수 2개를 입력하세요. 정수1~정수2 사이의 랜덤수를 3개를 출력해주세요. 단, 랜덤숫자끼리는 중복되어서는 안됩니다.");

		int a = 0, b = 0;

		while (true) {
			// 첫 번째 입력 받기
			System.out.print("정수 1을 입력하세요 : ");
			a = sc.nextInt();

			// 두 번째 입력 받기
			System.out.print("정수 2를 입력하세요(정수 1과 값이 달라야 하며 최소 차이가 2 이상이어야 합니다.) : ");
			b = sc.nextInt();

			// a가 b보다 큰 경우 두 수 교환
			if (a > b) {
				int tmp = a;
				a = b;
				b = tmp;
			}

			// 입력값 검증 및 정렬
			if (a == b) {
				System.out.println("두 수가 같습니다. 다시 입력해주세요!");
				continue;
			} else if (b <= a + 1) {
				System.out.println("범위가 너무 좁습니다! 두 수는 2 이상 차이가 나야 합니다!");
				continue;
			}
			break;
		}

		Random rand = new Random();
		final int RANDRANGE = b - a + 1;
		int num1;
		int num2;
		int num3;

		num1 = rand.nextInt(RANDRANGE) + a;

		while (true) {
			num2 = rand.nextInt(RANDRANGE) + a;
			if (num1 != num2) {
				break;
			}
		}

		while (true) {
			num3 = rand.nextInt(RANDRANGE) + a;
			if (num1 != num3 && num2 != num3) {
				break;
			}
		}

		// 결과 출력
		System.out.println("입력된 범위 : " + a + " ~ " + b);
		System.out.println("랜덤수 1 : " + num1);
		System.out.println("랜덤수 2 : " + num2);
		System.out.println("랜덤수 3 : " + num3);

	}
}

 

1. 어떤 변수를 선언했는지 알아보기 쉽도록 상단에 변수 나란히 선언(a와 b, num1과 num2와 num3끼리)
2. while(true)에 continue를 추가하여 같은 수를 입력하거나 2 이상 차이나지 않는 정수를 입력했을 때도 다시 입력할 수 있도록 함
3. b-a+1를 상수 RANDRANGE로 선언하고 가져다 쓰도록 수정함

 

확실히 이렇게 수정하니까 사용자에게도, 개발자에게도 UI 개선이 되었고, 사용자가 매번 프로그램을 다시 실행시킬 필요 없이 바로 다시 입력할 수 있게 수정이 되었다.

 

출력 결과

 

출력 결과도 훨씬 좋아졌다!

 

개념 정리를 좀 더 명확히 하고 사용자뿐만 아니라 개발자에게도 좋은 UI를 줄 수 있도록 노력해야겠다.

'IT > JAVA' 카테고리의 다른 글

CodeUp - 1228 : 비만도 측정 1  (0) 2025.01.01
Day 4 - 반복문(for) 예제 풀이  (0) 2024.12.31
반복문 별 찍기  (0) 2024.12.31
Day3 - for문/ 변수의 유효범위(scope)  (0) 2024.12.30
while문 문제 풀이  (0) 2024.12.27