Welcome to Wesley & Harry's Traveling & Programming

IT Program/Java Basic

자바(java) 조건문(if) & if-else & 중첩 if문 & Math.random()함수

Wesley & Harry 2022. 3. 1. 17:36
반응형

오늘은 자바의 조건문의 종류와 설명을 해보고자한다.

자바의 조건문엔 두종류가 있다. if문과 switch문이다.

 

if문은 조건식의 결과에 따라 if문 블록의 실행 여부를 정합니다.

아래 기본적인 예시를 들어보겠다.

 

if ( 조건문 ) {

}

색깔 네모로 표시를 해보았다.

우선 빨간 네모는 if문의 조건에 해당하는 부분이다.

빨간 네모의 조건에 해당할 경우(true) 노란색부분의 영역에 실행문이 실행이 되는것이다.

노란색 부분의 실행문이 실행된 후 초록색 바깥쪽으로 흐름이 빠져나가게 된다.

ex) 초록네모 -> 빨간네모 조건 확인(true일 경우) -> 노란네모 실행 -> 초록네모 바깥으로 빠져나감

 

만약, 빨간네모의 조건이 해당하지 않을 경우(false) 초록네모칸 바깥으로 흐름이 빠져나가게 된다.

ex)초록네모 -> 빨간네모 조건 확인(false일 경우) -> 초록네모 바깥으로 빠져나감

 

이렇게 조건문의 흐름을 블록으로 알아보았다.

아래 코드를 통해 확인해보자.

int wesley = 10;
if(wesley < 20) {
	System.out.println("wesley는 20보다 작다");
}
System.out.println("if문을 빠져나왔습니다.");

흐름을 살펴보자.

int타입의 wesley에 10을 저장하고, 앞서 말한것처럼 초록네모 큰 if문으로 진입을 한다.

wesley < 20의 조건을 확인한다. wesley는 20보다 작으므로 {System.out.println();} 중괄호 안의 실행문을 실행한다.

그다음 바깥으로 빠져나와 System.out.println("if문을 빠져나왔습니다."); 를 실행하게된다.

결과값을 통해 알아보도록 한다.

이로써 우리는 if문 조건문의 흐름에 대해 알수 있엇다.

 

if문은 중괄호 없이도 사용이 가능하다.

하지만 에러를 야기할수 있으므로 중괄호를 꼭 쓰도록하자.

아래 예제를 통해 알아보겠다.

int wesley = 10;
if(wesley >= 9) {
	System.out.println("wesley는 9보다 크거나 같다");
	System.out.println("wesley의 등급은 A이다");
}
if(wesley < 9)
	System.out.println("wesley는 9보다 작다");
	System.out.println("wesley의 등급은 B이다");

해당 결과를 예상해본다.

int타입에 wesley라는 이름에 10을 저장하고

첫번째 if문 안에 들어온다. wesely >= 9 조건에 만족한다. 

System.out.println("wesley는 9보다 크거나 같다");
System.out.println("wesley의 등급은 A이다");

를 출력한다.

그다음 두번째 if문에 접근을 한다. wesley<9에 만족하지 못한다.

if문의 바깥으로 빠져나와 아무것도 출력을 하지 않아야한다.

결과를 살펴보도록하자.

우리의 예상을 벗어낫다

wesley<9에 만족하지 않았음에도

"wesley의 등급은 B이다"가 출력이되어버렸다.

첫번째 if문과 두번째 if문의 차이점을 통해 알 수 있다.

중괄호 {}의 차이이다.

이런식으로 중괄호를 쓰지 않으면 엉뚱한 출력값이 나타날 수 있음을 명심하도록 하자.

해당 코드를 맞게 출력하고 간결하게 만드는 방법은 뭐가있을까.

 

if-else를 통해 우리는 그 해답을 찾을 수 있다.

아래 코드를 확인해보자.

int wesley = 10;
if(wesley >=9) {
	System.out.println("wesley는 9보다 크거나 같다");
	System.out.println("wesley의 등급은 A이다");
} else {
	System.out.println("wesley는 9보다 작다");
	System.out.println("wesley의 등급은 B이다");			
}

해당 코드의 흐름을 알아보자. 

int타입의 wesley에 10을 저장한 후 첫번째 if문에 진입한다.

wesley >= 9 의 조건에 만족한다.

System.out.println("wesley는 9보다 크거나 같다");
System.out.println("wesley의 등급은 A이다");

를 출력한다.

else는 그외를 뜻하므로 wesley>= 9 의 조건이 만족하지 않을 경우 실행을 한다.

한번 실행해보도록한다.

아까와 다르게 wesley의 등급은 B이다 라는 출력문이 나타나지않는다.

wesley의 값을 바꿔주게 되면 다른출력문이 조건에 맞게 나오는 것을 확인할 수 있다.

int wesley = 4;
if(wesley >=9) {
	System.out.println("wesley는 9보다 크거나 같다");
	System.out.println("wesley의 등급은 A이다");
} else {
	System.out.println("wesley는 9보다 작다");
	System.out.println("wesley의 등급은 B이다");			
}

하지만 우리는 여기서 한가지 의문점을 가지게 된다. wesley의 값이 10점 만점이라는 문구를 추가하고 싶을 수 있다.

그럴때 사용하는 방법은 && AND를 사용하는 것이다. 

if문의 AND사용법은 아래 게시글을 통해 참고하여 활용할 수 있다.

2022.03.01 - [IT Program/Java Basic] - java 논리 부정 연산자(!) & 논리 연산자 종류{AND(&&),OR(|),XOR(^),NOT(!)} & 원하는 문자 한번에 바꾸는 법(Replace/Find)

 

java 논리 부정 연산자(!) & 논리 연산자 종류{AND(&&),OR(|),XOR(^),NOT(!)} & 원하는 문자 한번에 바꾸는

저번 게시글에 이어 초반에 자주 써볼수 있는 논리 부정 연산자와 논리 연산자에 대해 알아보도록 하겠습니다. 논리 부정 연산자란 말 그대로 true, false에 대한 값을 부정한다는 뜻으로 !true 이면

dongwoonew.tistory.com

 


이로써 if-else에 대해 알아보았다.

하지만 우리는 if-else와 같이 늘 단하나의 조건만 달고싶지는 않을 것이다.

위의 링크과 같이 &&을 사용하는 방법도 있지만

등급별로 세분화를 하고 싶을 경우가 있다.

그 방법은 else-if문을 통해 가능하다.

else-if 또한 if문과 같이 조건문을 같이 붙여사용해주어야 한다.

아래 예제를 통해 연습해보도록하자.

int wesleyScore = 77;

if(wesleyScore >= 90) {
	System.out.println("wesleyScore가 100~90입니다");
	System.out.println("등급은 A입니다");
} else if(wesleyScore >= 80){
	System.out.println("wesleyScore가 80~89입니다");
	System.out.println("등급은 B입니다");
} else if(wesleyScore >= 70) {
	System.out.println("wesleyScore가 70~79입니다");
	System.out.println("등급은 C입니다");
} else {
	System.out.println("wesleyScore가 70미만입니다");
	System.out.println("등급은 D입니다");
}

코드의 흐름을 살펴보도록 하자 wesleyScore의 값은 77로 저장이 된다.

if조건문으로 들어가서 wesleyScore의 값이 90보다 크거나 같으면 

System.out.println("wesleyScore가 100~90입니다");
System.out.println("등급은 A입니다");

가 출력이 완료된다. 만약 해당 조건이 맞지 않을경우

다음 else-if 의 조건문으로 이동한다.

wesleyScore >=80에 대한 조건문을 확인한다.

조건문이 맞을 경우 

System.out.println("wesleyScore가 80~89입니다");
System.out.println("등급은 B입니다");

를 출력한다.

조건문이 맞지 않을경우

다음 else-if 문으로 이동한다.

wesleyScore >=70에 대한 조건문을 확인한다.

wesleyScore의 값이 조건문에 해당할 경우

System.out.println("wesleyScore가 70~79입니다");
System.out.println("등급은 C입니다");

를 출력한다.

조건이 맞지 않을경우 else로 이동한다.

그외 나머지의 경우를 모두 포함하므로 위의 if조건문과 else if 조건문에 충족되지 않은 경우

System.out.println("wesleyScore가 70미만입니다");
System.out.println("등급은 D입니다");

가 출력된다.

결과값을 통해 알아보도록하자.

wesleyScore의 값을 바꿔가면서 테스트를 해보면 잘 알맞게 작동하는것을 알 수 있다.


한단계 앞서나가서 if문 안에 if문을 한번 더 넣어보도록 하자.

이 방법을 기반으로 좀더 복잡하고 어려운 형태를 사용해 자신이 원하는 구문을 뽑아낼수 있다.

이번 예제는 Math.random()을 통해 랜덤숫자를 뽑아서 사용해보도록하자.

Math.random()은 자바에서 지원하는 랜덤숫자이다. 0.4412414 이런식으로 나오게된다.

우리는 이 숫자를 int로 변환을 하여 사용하고싶다. 그렇게 사용하기 위해선 강제 형변환이 필요하다.

강제 형변환 하는 방법은 아래 링크를 클릭하여 살펴보도록하자.

2022.02.27 - [IT Program/Java Basic] - 자바(java) 타입 변환 & 자동 타입 변환 & 강제 타입 변환 & 데이터 타입 크기 & 아스키코드표

그럼 우린 이 Math.random()을 어떻게 사용해야할까

아래를 살펴보도록하자.

double wesleyScore = Math.random();
System.out.println(wesleyScore);

우선 Math.random()은 실수형으로 형태가 나타나므로

double 타입을 이용해 출력을 해보자

아래와 같이 랜덤한 숫자가 소수점아래로 나오는것을 확인할 수 있다.

해당 코드를 int형으로 강제타입변환을 하게 된다면 어떻게될까?

wesleyScore의 타입을 int로 변환해주고, 

Math.random()의 함수 또한 (int)를 통해 강제 타입변환을 해주도록 한다.

우리는 int로 변환을 하면 0이 나올것이란걸 지난 게시글을 봤다면 알 수 있다.

우리는 이 함수를 제대로 써먹기 위해선 * 곱셈을 잘 이용해야한다.

최대 20까지의 랜덤숫자를 뽑기위해선 *20을 해주면 나오지 않을까? 라는 생각이 들것이다.

int형의 20까지 랜덤숫자가 나오게된다.

해당코드를 실행까지 해보도록하자.

int wesleyScore = (int)Math.random()*20;
System.out.println(wesleyScore);

해당 코드를 아무리 실행을 눌러봐도 숫자가 0밖에 나오지 않는다

이유를 알아보자. 왜일까?

그 이유의 해답은 이러하다.

Math.random()은 double 타입으로 0.5315512 이런식으로 진행된다는걸 알 수 있다.

하지만 (int)Math.random()*20 을 해줘도 0밖에 나오지 않는다.

감이 잡힐것이다.

왼쪽에서부터 Math.random()을 int형으로 바꾼뒤 20을 곱해줬기 때문이다.

0곱하기 20은 어떻게 해도 0이 나올수밖에 없다.

그렇다면 우리는 어떻게 바꿔줘야할까

우리는 이를 괄호를 통해 해결할 수 있다.

어릴적 우린 괄호가 먼저 계산이 된다는 것을 알고있다.

int wesleyScore = (int)(Math.random()*20);
System.out.println(wesleyScore);

해당 코드를 실행해보자. 우리의 생각대로 나오는 것을 알 수있다.

늘 그렇듯 프로그램은 흐름과 순서를 생각을 해줘야한다.

Math.random()함수를 배워보았다.

이를 이용해서 중첩 if문을 실행해보도록 하자.

중첩 if문이란 if문안에 if문이 또 들어가 실행되는 것으로 헷갈릴 수 있으니 

중괄호의 위치를 잘 살펴보도록 한다.

아래 코드를 보자.

		int wesleyScore = (int)(Math.random()*20);
		System.out.println("wesley의 점수는 = " + wesleyScore);
		String grade;
		
		if(wesleyScore>=17) {
			if(wesleyScore>=19) {
				grade = "A+";
			} else {
				grade = "A";
			}
		} else {
			if(wesleyScore>=10) {
				grade = "B+";
			} else {
				grade = "B";
			}
		}
		System.out.println("학점은 = " + grade);

우선 코드의 설명을 위해 결과값을 먼저 보도록 하겠다.

우선 

int wesleyScore = (int)(Math.random()*20);을 통해 20까지의 랜덤한 숫자를 wesleyScore에 저장한다.

그다음 wesley의 점수를 확인하기 위한 출력문을 하나 작성한다.

등급을 확인할 grade를 String타입으로 지정한다.

여기서 주의할 점은 char와 String의 차이이다.

char는 ''작은따옴표로 묶어주고 (문자)

String은 ""큰따옴표로 묶어주어야한다.(문자열)

첫번째 빨간 네모박스로 진입을 하게된다. 노란색네모와 보라색네모가 쳐져있지않은 if(조건문){}과 else{}가 적혀있는것을 볼수 있을것이다. 가장큰 if - else로써 조건문으로 들어간다. 

 

 

우선 wesleyScore가 17이상일 경우이다.

노란 네모박스가 쳐져있는 if문으로 다시 진입하게된다. if문의 조건문 wesleyScore>=19의 조건을 검사한다.

맞을경우 grade="A+"를 실행하여 저장한다음 큰 빨간네모를 빠져나와

System.out.println("학점은 = " + grade);를 출력하게 된다.

만약 19 이상이 아닐경우 노란네모의 else부분의

grade = "A";를 실행한 다음 큰 빨간네모를 빠져나와

System.out.println("학점은 = " + grade);를 출력하게 된다.

 

 

다음 wesleyScore가 17이상이 아닐경우이다.

보라 네모박스가 쳐져있는 if문의 조건문으로 진입하게된다. wesleyScore>=10의 조건을 확인한다

조건이 맞을 경우

grade = "B+"; 를 실행한 후 빨간네모 박스를 벗어나 

System.out.println("학점은 = " + grade); 를 실행하게 된다.

조건이 맞지 않을 경우

grade = "B"를 실행한 후 빨간네모 박스를 벗어나

System.out.println("학점은 = " + grade); 를 실행하게 된다.

 

여기서 주의할 점은 

System.out.println("학점은 = " + grade);는 if문과 else문 어디든 포함되어 있지 않으며

모든 if else문에 걸리지 않아도 되는 개별적인 구문이라 생각하면 편하다.

 

해당 코드를 계속 실행해보며 자신의 생각과 맞게 진행되는지 테스트해보자

반응형