IT/JAVA

Day 2 - 조건문 : if문 예제

_KH_ 2024. 12. 27. 15:47

제어문에는 조건문과 반복문이 있다. 

 

조건문에는 if문과 switch문이 있는데 그 중 if문 예제를 몇 개 살펴보고자 한다.

 

[코딩 순서]

1) 문제(글) 파악하기
"회원가입한 회원의 나이" = 변수명. int age;
* 변수를 이해할 수 있도록 변수명 작성하기(가독성 중요)

2) 유효성 검사가 있는지 확인하기
[유효성 검사]
: 본 기능에 진입하기 전에 쓰는 것이 보편적. 무엇이 잘못되었는지 알려주는 멘트를 통해 UI/UX 경험을 최적화한다.

 

3) 의사코딩(스도코딩, 한글코딩) 해보기
* 한글로 의사코딩한 후 변수를 변수명으로 바꿔주기
"만약" -> 조건문으로 작성하기
(1) 14세 미만 -> if(age < 14)
(2) 14세 이상 -> else {syso(); }

 

4)  스도코딩한 코드를 변수명으로 바꾸어주기

if(14세 미만이라면) {
	System.out.println("어린이입니다.");
 	}

위의 코드를

if(age < 14) {
	System.out.println("어린이입니다.");
    }

로 바꿔준다.

 

1. 성인인증
만약 회원가입한 회원의 나이가 14세 미만이라면 어린이 회원입니다. 라고 출력하기, 

만약 14세 이상이라면 성인 회원입니다. 라고 출력하기

package class01;

public class Test07 {

	public static void main(String[] args) {
		
		int age = 16; // 나이를 나타내는 변수
		
		if(나이가 14세 미만이라면) {
			System.out.println("어린이입니다.");
		} else { // 나이가 14세 이상이라면
			System.out.println("성인입니다.");
		}

	}

}
package class01;

public class Test07 {

	public static void main(String[] args) {
		
		int age = 16;
		
		if(age < 14) {
			System.out.println("어린이입니다.");
		} else {
			System.out.println("성인입니다.");
		}
	}
}

 

2. a와 b는 랜덤한 정수다. a와 b의 크기를 비교해서 a가 크다면 a는 b보다 크다. b가 크다면 a는 b보다 작다. a와 b가 같다면 a와 b는 같다. 라고 출력하기

		int a = 10; 
		int b = 20;	// a, b는 랜덤한 정수
        
		if(a가 b보다 크다면 ) {
			System.out.println("a는 b보다 크다.");
		} else if (b가 a보다 크다면) {
			System.out.println("b는 a보다 크다.");
		} else {
			System.out.println("a와 b는 같다.");
		}
if(a > b ) { // a가 b보다 클 때
			System.out.println("a는 b보다 크다.");
		} else if (b > a) { // b가 a보다 클 때
			System.out.println("b는 a보다 크다.");
		} else { // a와 b가 같을 때
			System.out.println("a와 b는 같다.");
		}

 

3. 티모가 버스에 승차한다. 티모의 나이가 1~8세라면 무료, 9~19세라면 900원, 20~64세라면 1500원, 65세 이상이라면 무료다. 티모의 나이가 랜덤일때 얼마를 지불해야하는지 출력하세요.
ex1) (티모가 20세) 1500원을 지불해야합니다.
ex2) (티모가 7세) 0원을 지불해야합니다.

1) "티모의 나이" -> 주어. 변수로 정의

2) ~라면 -> 조건문 -> if로 작성

	        //티모가 버스에 승차하는 상황
		// 나이에 따라 요금을 다르게 부여
		int age = 121;
		// 티모의 나이는 랜덤
		
		/*
		if(나이가 1-8세라면) {
			System.out.println("0원을 지불해야합니다.");
		} else if (9-19세라면 ) {
			System.out.println("900원을 지불해야합니다");
		} else if (20-64세라면) {
			System.out.println("1500원을 지불해야합니다");
		} else {
			System.out.println("0원을 지불해야합니다.");
		}
		// 1-8, 65세 이상 무료
		*/
                int age = 121;
		
		if(age < 1 || age > 120) {
			System.out.println("나이를 다시 한번 확인해주세요.");
		} else {
			if(age >= 1 && age <= 8) { 
				System.out.println("0원을 지불해야합니다.");
			} else if(age >= 9 && age <= 19) {
				System.out.println("900원을 지불해야합니다.");
			} else if (age >= 20 && age <= 64) {
				System.out.println("1500원을 지불해야합니다.");
			} else {
				System.out.println("0원을 지불해야합니다.");
			}
		}
	}
}

처음 코드를 작성할 때 유효성 검사를 넣지 않고 작성해버렸다.

1살 미만이거나 120살 이상인 경우에는 나이를 다시 한번 확인해달라는 멘트를 추가하여 UI/UX를 최적화하였다.

 

이 코드에서 더욱 최적화 시킬 수도 있는데, 그 코드는 다음과 같다.

package class03;

public class Test01 {

	public static void main(String[] args) {

		// 경계값들은 상수화
		final int CHECK01=1;
		final int CHECK02=9;
		final int CHECK03=20;
		final int CHECK04=65;
		final int CHECK05=120;
		
		int age=8; // 티모의 나이
		if(age<CHECK01 || CHECK05<age) { // 유효성 검사
			System.out.println("티모의 나이가 올바른지 확인해주세요!");
			// UI/UX
		}
		else {
			int money=0;
						
			if(CHECK02<=age && age<CHECK03) {
				money=900;
			}
			else if(CHECK03<=age && age<CHECK04) {
				money=1500;
			}
			
			System.out.println(money+"원을 지불해야합니다.");
		}
	}
}

위 코드에서 달라진 점은 경계값들을 상수화 하였다는 것이다.

 

경계가 되는 경계값들은 상수화해서 사용하는 것이 원칙이다. 

예를 들어, 현재 노인의 기준은 65세이지만 나중에는 80세로 전환될 것을 예상하여 65세라는 경계값을 상수화 하는 것이다. 상수화 하지 않았을 때는 65세라고 쓰여진 부분을 일일이 찾아 수정해야해서 유지보수성이 낮지만, 상수화했을 경우에는 final int CHECK04의 값을 65에서 80으로만 수정해주면 되기 때문에 유지보수성이 더 높다.

 

변수를 상수화 하기 위해서는 'final' 예약어를 사용해주면 된다. 또한, 상수로 사용할 변수명은 전부 대문자로 작성하여 상수라는 것을 확실하게 표현해주는 것이 좋다.

 

즉, 중복되는 값은 상수를 이용하는 것이 좋다.

 

참고로, int age;와 같은 지역변수는 반드시 초기화해주어야 오류가 나지 않는다.

 

4.  a,b,c 라는 랜덤한 정수가 3개 존재한다. 이중에서 가장 큰 정수의 값을 출력하기

- 이 문제는 다양한 방법으로 코드를 작성할 수 있다. 나는 max라는 변수를 두고 a, b, c를 일일이 비교한다음 가장 큰 값을 max 변수에 대입하였는데 이렇게 되면 코드도 길어지고 max라는 변수를 하나 더 사용해야 해서 그 코드는 올리지 않을 예정이다..

 

1)

package class03;

public class Test02 {
	public static void main(String[] args) {
		
		int a=3;
		int b=4;
		int c=5;

		if(a>b && a>c) {
			System.out.println(a);
		}
		else if(b>a && b>c) {
			System.out.println(b);
		}
		else {
			System.out.println(c);
		}

if문과 논리 연산자를 이용해서 최댓값을 구하고자 하는 코드다. 

첫 번째 if문을 보면 a가 b보다 크고 c보다도 클 때는 a가 최댓값이기에 a를 출력하는 것이다.

 

2) 

                int a=3;
		int b=4;
		int c=5;
		
		if(a>b) {
			// 가장 큰 정수가 될 수 있는 것 : a,c
			if(a>c) {
				System.out.println(a);
			}
			else {
				System.out.println(c);
			}
		}
		else {
			// 가장 큰 정수가 될 수 있는 것 : b,c
			if(b>c) {
				System.out.println(b);
			}
			else {
				System.out.println(c);
			}
		}

아래는 논리 연산자를 이용하지 않고 일일이 비교하는 방식이다.

a가 b보다 클 때, 만약 a가 c보다 크면 a가 최댓값이므로 a를 출력하고, a가 b보다 큰데 a가 c보다 작으면 c가 최댓값이므로 c를 출력한다.

 

또한, a가 b보다 작을 경우에는 b가 c보다 크면 b가 최댓값이므로 b를 출력하고 b가 a보다 큰데 b가 c보다 작다면 c가 최댓값이므로 c를 출력한다.

 

3) 

	        int a=3;
		int b=4;
		int c=5;
	
		int max=a>b?  a>c?a:c    :  b>c?b:c;
		
		System.out.println(max);

max라는 변수와 삼항 연산자를 사용하는 코드이다. 

 

최댓값을 저장하는 함수인 max를 선언하고 그와 동시에 a와 b가 더 큰지 비교해서 a가 b보다 클 때 a가 c보다 크다면 최댓값인 a를 max에 저장하고 a가 b보다 클 때 a가 c보다 작으면 c를 max에 저장한다.

또, b가 a보다 클 때는 (false) b>c 를 수행하는데 b가 c보다 크면 최댓값인 b를 max에 저장하고, b가 c보다 작으면 최댓값인 c를 max에 저장한다.

그 후 max를 출력하면 최댓값을 알 수 있다.

 

5.  사과는 1300원이다. 사과를 랜덤하게 구매한다. 사과는 한명당 최대 3개까지 구매할수있다. 손님은 50000원으로 사과를 구매하려고 시도한다. 이때 손님이 지불해야할 사과의 금액과 거스름돈을 출력하세요.

package class01;

public class Test07 {

	public static void main(String[] args) {

		int apple = 1300; // 사과 가격
		int appleCnt = 2; // 사과의 개수는 랜덤
		int price = apple * appleCnt; // 손님이 지불해야 할 금액
		int money = 50000; // 손님이 가지고 있는 돈
		int change = money - price; // 거스름돈

		if (appleCnt < 1 || appleCnt > 3 ) {
			System.out.println("최대 3개까지만 구매 가능합니다.");
		} else {
			System.out.println("손님이 지불해야 할 금액은 " + price + " 이고, 거스름돈은 " + change + " 입니다.");


		}
	}

}

사과의 가격, 사과의 개수, 손님이 지불해야 할 금액, 손님이 가지고 있는 금액, 거스름돈을 모두 변수로 선언하여 계산하였다. 사과는 한명당 최대 3개까지만 구매할 수 있기 때문에 만약 사과를 1개 미만이나 3개 이상 구매하려고 하면 "최대 3개까지만 구매 가능합니다." 라는 문구를 출력하도록 하였다. (유효성 검사)

그 후, 변수를 불러와 손님이 지불해야 할 금액과 거스름돈을 출력하였다. 

 

물론 여기서 사과의 최대 개수를 MAX 변수로 상수화 할 수도 있다.

// 사과 최대값을 MAX 상수화

		int price = 1300;
		int cnt = 5;

		final int MAX =3;

		if(cnt>MAX) {
			System.out.println("사과는 한명당 최대 3개까지 구매할 수 있습니다.");
			/////// 프로그램 종료
			return;
		}
		int money = 50000;
		int total=price*cnt;
		money -= total;
		System.out.println("지불할 금액 : " + total);
		System.out.println("거스름돈 : " + money);
	}
}

fianl 함수를 통해 사과 최대 개수를 3개로 설정해놓고 사과 개수가 MAX보다 클 경우 오류 메시지를 출력하고 프로그램을 종료하는 코드이다.

 

참고로 return은 프로그램을 종료시키고 싶을 때 사용하면 된다. 위에서는 오류 메시지를 출력하고 프로그램을 종료하기 위해서 return을 사용하였다.'

 

오늘 문제들을 풀면서 느낀 점은 코드를 작성하기 전에 우선 문제를 보고 고찰해보기! 그리고 의사코딩 후 풀기! 다.

냅다 풀려고 하지 말고 우선 문제를 본 후 어떤 로직으로 작성해야 할 지 한글로 먼저 작성해보는 습관을 가져야겠다.

 

또한, 함수와 출력문구를 최소화 하고 코드의 depth를 줄여서 가독성 좋고 메모리 적은 효율적인 코드를 작성해야겠다고 생각했다.

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

Day3 - for문/ 변수의 유효범위(scope)  (0) 2024.12.30
while문 문제 풀이  (0) 2024.12.27
디버깅표 작성하기  (0) 2024.12.26
CodeUp - 1153 : 두 수의 대소 비교  (0) 2024.12.26
Day 1 - 자바 기초  (0) 2024.12.26