이세개발
article thumbnail
Published 2023. 4. 16. 21:58
이것이java다 4.1 조건문 legacy

* 코드 실행 흐름 제어

 

자바 프로그램을 시작하면 main() 메소드의 시작 중괄호 { 에서 시작해서 끝 중괄호 } 까지 위에서부터 아래로 실행하는 흐름을 가지고 있다. 이러한 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것이 흐름 제어문이다. 흐름 제어문을 간단히 제어문이라고 한다. 제어문은 조건식과 중괄호 {} 블록으로 구성되는데, 조건식의 연산 결과에 따라 블록 내부의 실행 여부가 결정된다. 흐름 제어문을 사용할 경우 다양한 실행 흐름이 생성된다는 것을 다음 그림에서 보여주고 있다.

제어문의 종류는 조건문과 반복문이 있는데, 조건문에는 if문 switch 문이 있고 반복문에는 for문 while문, do-while 문이 있다. 제어문 블록이 실행 완료되었을 경우 다시 제어문 처음으로 돌아갈 지, 아니면 제어문 블록을 빠져나와 정상 흐름으로 다시 돌아올지는 어떤 제어문을 사용하느냐에 달려 있다. 조건문일 경우에는 정상 흐름으로 돌아오지만, 반복문일 경우는 제어문 처음으로 다시 되돌아가 반복 실행한다. 이것을 루핑(looping) 이라고 한다. 제어문 블록 내부에는 또 다른 제어문을 사용할 수 있다. if문 내부에 for문을 가질수 있고 while문도 가질 수 있다는 것이다. 그렇기 때문에 개발자가 원하는 매우 복잡한 흐름 제어도가 가능하다.

 

 

 

 

 

 

 

 

 

*  조건문

 

 

1. if문

 

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

조건식에는 ture 또는 false 값을 산출할 수 있는 연산식이나, boolean 변수가 올 수 있다. 조건식이 ture 이면 블록을 실행하고, false 이면 블록을 실행하지 않는다.

 

중괄호 {} 블록은 여러개의 실행문을 하나로 묶기 위해 작성된다. 만약 조건식이 ture 가 될 때 실행해야 할 문장이 하나 밖에 없다면 생략할 수 있다. 하지만 중괄호 {} 블록을 생략하지 않고 작성하는 것을 추천한다. 중괄호 블록을 작성하지 않으면 코드의 가독성 (코드 해석) 이 좋지 않고, 버그 발생의 원인이 될 수 있다. 다음 예제 코드를 보자.

 

------------------------------------[ IfExample.java ] If 문 ---------------------------------------------

public class IfExample {

public static void main(String[] args) {

int score = 93;

 

if(score>=90) {

System.out.println("점수가 90 보다 큽니다.");

System.out.println("등급은 A 입니다.");

}

 

if(score<90) 

System.out.println("점수가 90 보다 작습니다.");

System.out.println("등급은 B 입니다.");

}

}

-------------------------------------------------------------------------------------------------------------------

Console

점수가 90 보다 큽니다."

등급은 A입니다.

등급은 B 입니다.

--------------------------------------------------------------------------------------------------------------------

2번째 if문 if(score<90) 에서 System.out.println("점수가 90 보다 작습니다."); 까지는 if문 적용이 되어 false 이기 때문에 출력이 되지 않았지만,  {} 블록을 하지않았으므로 System.out.println("등급은 B 입니다."); 이 if문과는 관계가 없는것이 되버리므로 그대로 출력이 되어버렸다.

 

 

 

 

 

 

 

2. if - else 문

 

if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록을 선택한다. if문의 조건식이 ture이면 if문의 블록이 실행되고, 조건식이 false 이면 else 블록이 실행되게 되는것이다. 조건식의 결과에 따라 두개의 블록중 어느 한 블록의 내용만 실행한 후 전체 if-else문을 벗어나게 된다. 다음은 if-else문의 형식과 실행 흐름을 보여준다.

 

이전 예제는 두 개의 if 문을 이용했지만 이것보다는 다음과 같이 if-else 문으로 간단히 처리하는것이 더욱 간결한 코딩이다.

 

 

---------------------------------------------------[ IfElseExample.java ] if-else문-------------------------------------------------------------------

package sec02.exam01_if;

 

public class IfElseExample {

public static void main(String[] args) {

int score = 85;

 

if(score>=90) {

System.out.println("점수가 90보다 큽니다.");

System.out.println("등급은 A 입니다.");

} else {

System.out.println("점수가 90보다 작습니다.");

System.out.println("등급은 B 입니다.");

}

}

}

------------------------------------------------------------------------------------------------------------------------------------------------------
Console
점수가 90보다 작습니다.
등급은 B 입니다.
--------------------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
3. if-else if-else문
 
조건문이 여러 개인 if 문도 있다. 처음 if 문의 조건식이 false일 경우 다른 조건식의 결과에 따라 실행 블록을 선택할 수 있는데, if 블록의 끝에 else if문을 붙이면 된다. else if문의 수는 제한이 없으며 여러 개의 조건식 중 ture가 되는 블록만 실행하고 전체 if문을 벗어나게 된다. else if 블록의 마지막에는 else 블록을 추가할 수가 있는데, 모든 조건식이 false일 경우 else 블록을 실행하고 if문을 벗어나게 된다.

 

이전 예제는 점수가 90점 이상이거나 미만일 경우에만 실행 흐름을 제어했는데, 이번 예제는 조건식 3개를 이용해서 실행 흐름을 제어한다.

 

------------------------------------------[ IfElseIfElseExample.java ] if-else if-else 문---------------------------------------------------------------

package sec02.exam01_if;

 

public class IfElseIfElseExample {

public static void main(String[] args) {

int score = 75;

 

if(score>=90) {

System.out.println("점수가 100~90 입니다.");

System.out.println("등급은 A 입니다.");

} else if(score>=80) {

System.out.println("점수가 80~89 입니다.");

System.out.println("등급은 B 입니다.");

} else if(score>=70) {

System.out.println("점수가 70~79 입니다.");

System.out.println("등급은 C 입니다.");

} else {

System.out.println("점수가 70 미만 입니다.");

System.out.println("등급은 D 입니다.");

}

}

}

--------------------------------------------------------------------------------------------------------------------------------------------

Console

점수가 70~79 입니다.

등급은 C 입니다.

--------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
이번에는 주사위를 굴려서 나올 수 있는 1, 2, 3, 4, 5, 6 중에서 하나의 수를 뽑아서 출력하는 프로그램을 작성하겠다. 먼저 임의의 정수를 뽑는 방법을 알아야 한다. Math.random() 메소드를 활용할 수 있는데, 이 메소드는 0.0 과 1.0 사이에 속하는 double 타입의 난수 하나를 리턴한다. 0.0은 범위에 포함되고 1.0은 포함되지 않는다. 이것을 비교 연산자로 표현하면 다음과 같다.
-----------------------------------------------
0.0  <= Math.random()   <    1.0
-----------------------------------------------
그렇다면 1~10까지 정수 중에서 하나의 정수를 얻기 위해 어떤 과정이 필요한지 알아보자. 먼저 각변에 10을 곱하면 다음과 같은 범위에 속하는 하나의 double타입의 값을 얻을 수 있다.
---------------------------------------------------
0.0*10  <= Math.random()*10    <    1.0*10
(0.0)                                               (10)
----------------------------------------------------
이 상태에서 각 변을 int 타입으로 강제 타입 변환하면 다음과 같은 범위에 속하는 하나의 정수값을 얻을 수 있다.
------------------------------------------------------------
(int)0.0  <= (int)Math.random()*10    <    (int)10.0
(0)                                                       (10)
-----------------------------------------------------------
이 상태에서 각 변에 1을 더하면 비로소 1~10까지 정수중에서 하나의 정수를 얻게 된다.
----------------------------------------------------------
0+1  <=   (int)(Math.random()*10) +  1    <     10  +  1
(1)                                                              (11)
---------------------------------------------------------------
이 원리를 이용하면 start 부터 시작하는 n 개의 정수 중에서 임의의 정수 하나를 얻기 위한 연산식을 다음과 같이 만들 수 있다.
---------------------------------------------
int num = (int) (Math.random()*n) + start;
------------------------------------------------
주사위 번호 하나를 뽑는다면
---------------------------------------------------
int num = (int) (Math.random()*6) + 1;
-------------------------------------------------
다른 예로 로또번호 하나를 뽑는다고 하면
------------------------------------------------
int num = (int) (Math.random()*45) + 1;
------------------------------------------------
 
--------------------------------------------------[ IfDiceExample.java ] 주사위의 번호를 뽑는 예제---------------------------------------------------
package sec02.exam01_if;
public class IfDiceExample {
public static void main(String[] args) {
int num = (int)(Math.random()*6) + 1;
 
if(num==1) {
System.out.println("1번이 나왔습니다.");
} else if(num==2) {
System.out.println("2번이 나왔습니다.");
} else if(num==3) {
System.out.println("3번이 나왔습니다.");
} else if(num==4) {
System.out.println("4번이 나왔습니다.");
} else if(num==5) {
System.out.println("5번이 나왔습니다.");
} else {
System.out.println("6번이 나왔습니다.");
}
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------
Console
1번이 나왔습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------
Console
2번이 나왔습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------
Console
3번이 나왔습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------
Console
4번이 나왔습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------
Console
5번이 나왔습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------
Console
6번이 나왔습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
 
 
 
4. 중첩 if문
 
if문의 블록 내부에는 또 다른 if문을 사용할 수 있다. 이것을 중첩if문이라 부르는데, 중첩의 단계는 제한이 없기 때문에 실행 흐름을 잘 판단해서 작성하면 된다. 사실 if문만 중첩이 되는 것은 아니며 if문, switch문, for문, while문, do-while문은 서로 중첩시킬 수 있다. 예를 들어 if문 안에 for문을 중첩 시킬 수도 있고 while문에 if문을 중첩시킬 수도 있다. 자바 언어를 처음 학습하는 분들이 조건문과 반복문이 어렵다는 이유는 이러한 중첩이 생길 경우에 실행 흐름을 쉽게 이해하지 못하기 떄문이다. 다음 그림은 중첩 if문의 실행 흐름을 보여준다.

한번 중첩되었을 뿐인데, 매우 복잡한 실행 흐름이 생긴다. 실제 프로그램에서는 여러 단계로 중첩되는 경우가 많기 때문에 코드의 실행 흐름을 이해하지 못한다면 프로그램 작성은 물론이고 이미 작성된 프로그램 분석도 어려워진다. 이번 예제는 81 <= ~~ <= 100 사이에 속하는 점수를 뽑아내어 바깥 if문은 90점과 80점 기준으로 조건문을 작성하고, 중첩if문은 좀 더 세부적으로 95점과 85점을 기준으로 조건문을 작성해서 A+, A, B+, B 를 출력한다.

 

-------------------------- [ IfNestedExample.java ] 중첩 if문 ------------------------------------------------------------------------------

package sec02.exam01_if;

public class IfNestedExample {

public static void main(String[] args) {

int score = (int)(Math.random()*20) + 81;                    //81~100 까지의 랜덤숫자 score

System.out.println("점수: " + score);                           //랜덤점수 score 출력

 

String grade;

 

if(score>=90) {                                                          //90이상

if(score>=95) {                                                  //95이상A+

grade = "A+";

} else {

grade = "A";                                             //아니면 A

}

} else {

if(score>=85) {                                                  //90미만 85이상

grade = "B+";                                           

} else {

grade = "B";                                             //아니면 B

}

}

 

System.out.println("학점: " + grade);

}

}

--------------------------------------------------------------------------------------------------------------------------------------------
Console
점수: 84
학점: B
--------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
5. switch문
 
switech문은 if문과 마찬가지로 조건 제어문이다. 하지만 switch 문은 if문처럼 조건식이 ture일 경우에 블록 내부의 실행문을 실행시키는것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다. if 문은 조건식의 결과가 ture,false 두가지 밖에 없기 떄문에 경우의 수가 많아질수록 else-if를 반복적으로 추가해야 하므로 코드가 복잡해 진다. 그러나 switch문은 변수의 값에 따라서 실행문이 결정되기 떄문에 같은 기능의 if문보다 코드가 간결하다. 다음은 switch 문의 형식과 실행 흐름을 도식화한 것이다.

switch문읜 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행시킨다. 만약 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행시킨다. default는 생략 가능 하다. 이전 예제인 IfDiceExample.java를 switch문으로 변형하면 다음과 같다.

 

-----------------------------------------------[ SwitchExample.java ] switch문----------------------------------------------------------------

package sec02.exam02_switch;

 

public class SwitchExample {

public static void main(String[] args) {

int num = (int)(Math.random()*6) + 1;

 

switch(num) {

case 1:

System.out.println("1번이 나왔습니다.");

break;

case 2:

System.out.println("2번이 나왔습니다.");

break;

case 3:

System.out.println("3번이 나왔습니다.");

break;

case 4:

System.out.println("4번이 나왔습니다.");

break;

case 5:

System.out.println("5번이 나왔습니다.");

break;

default:

System.out.println("6번이 나왔습니다.");

break;

}

}

}

-----------------------------------------------------------------------------------------------------------------

Console

5번이 나왔습니다.

-------------------------------------------------------------------------------------------------------------------

case 끝에 break 가 붙어있는이유는 다음 case를 실행하지 말고 switch 문을 빠져나가기 위해서이다. break가 없으면 다음 case 가 연달아서 실행되는데 그때는 case값과는 상관없이 실행되게 된다.

 

 

------------------------------------------------------[ SwitchNoBreakCaseExample.java ] break문이 없는 case-------------------------------------------

package sec02.exam02_switch;

 

public class SwitchNoBreakCaseExample {

public static void main(String[] args) {

//8<= … < 12(8+4) 사이의 정수 얻기

int time = (int)(Math.random()*4) + 8; 

System.out.println("[현재시간: " + time + " 시]");

 

switch(time) {

case 8:

System.out.println("출근합니다.");

case 9:

System.out.println("회의를 합니다.");

case 10:

System.out.println("업무를 봅니다.");

default:

System.out.println("외근을 나갑니다.");

}

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

Console

[현재시간: 9 시]

회의를 합니다.

업무를 봅니다.

외근을 나갑니다.         

------------------------------------------------------------------------------------------------------------------------------------------------------------------

char타입 변수도 switch문에 사용될 수 있다. 다음 예제는 영어 대소문자에 관계없이 똑같은 알파벳이라면 동일하게 처리하도록 만든 switch 문이다.

                  

---------------------------------------------[ SwitchCharExample.java ] char타입의 switch문---------------------------------------------------------
package sec02.exam02_switch;
 
public class SwitchCharExample {
public static void main(String[] args) {
char grade = 'B';
 
switch(grade) {
case 'A':
case 'a':
System.out.println("우수 회원입니다.");
break;
case 'B':
case 'b':
System.out.println("일반 회원입니다.");
break;
default:
System.out.println("손님입니다.");
}
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Console
일반 회원입니다.
------------------------------------------------------------------------------------------------------------------------------------------------------------
자바6 까지는 switch문의 괄호에는 정수타입(byte, char, short, int, long) 변수나 정수값을 산출하는 연산삭만 올 수 있었는데, 자바7 부터는 String타입의 변수도 올 수 있다. 다음은 직급별 월급을 출력한다.
 
----------------------------------------------[ SwitchStringExample.java ] String 타입의 switch문---------------------------------------------------
package sec02.exam02_switch;
 
public class SwitchStringExample {
public static void main(String[] args) {
String position = "과장";
 
switch(position) {
case "부장":
System.out.println("700만원");
break;
case "과장":
System.out.println("500만원");
break;
default:
System.out.println("300만원");
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------
Console
500만원
------------------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
profile

이세개발

@print(name)

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!