Live Study 4주차 - 제어문

조건문

조건문은 if문과 switch문으로 구분된다.

if

1
2
3
4
boolean condition;
if(condition){
System.our.println("true");
}

if문은 조건이 true일 때 블럭 {} 안의 명령을 수행하도록 하는 조건식이다.

1
2
3
4
5
6
7
if(num<0){
System.our.println("0보다 작다.");
} else if(num<10){ // 0 <= num < 10
System.our.println("10보다 작다.");
} else { // num >= 10
System.our.println("10보다 크다.");
}

else-if 와 else

if문의 첫번째 조건이 충족(true)하지 않는 다른 조건의 경우는 else if문으로 조건 분기가 가능하다. else 는 위의 모든 조건을 제외한 경우를 의미한다.

if문 안의 조건엔 비교연산자와 논리연산자가 함께 쓰일수 있다.di

1
2
3
if(num>=0 && num<10){
System.out.println("한자릿수입니다.");
}

논리연산자 사용

if문을 사용할때 boolean 타입의 변수를 사용하기보다 논리연산자를 사용하는 경우가 많다. 이 때 알아야 할 것이 있다. 바로 아래 예제 코드를 확인해보도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class StudyHalle04 {
public static void main(String[] args){
int num1 = 10;
int num2 = 20;

if(num1++==15 && num2++==20){
System.out.println("success");
} else {
System.out.println("failed");
}

System.out.println(num1);
System.out.println(num2);
}
}

이 코드는 if문을 통해 success와 fail을 구분하는 코드지만, 필자가 이 코드를 통해 확인하고 싶은 부분은 if문 조건문 안에서 증감연산자를 적용한 num1num2가 값이 어떻게 바뀌는지 보고 싶었다.

위 코드의 결과는 아래와 같다.

1
2
3
failed
11
10

if문 안에서 똑같이 num1num2를 증감연산하였는데, 왜 num1만 증감연산 적용된걸까.

if 조건문안에서 사용한 논리연산자가 && 였다. && 는 두항 모두 true일 때 true를 반환하는 논리연산자이다. 위의 코드에서 num1++은 11인데 11은 15와 일치하지 않으므로 false를 반환하다. 그럼 우측 항이 true이든 false이든 상관없이 이미 false이므로 if문은 바로 break를 실행하고 빠져나오게 된다. 그래서 num2는 증감연산지 실행되지 않은것이다.

중첩 if문

if문안의 if문이 들어가는 중첩 if문도 가능하다.

1
2
3
4
5
6
7
8
9
String name="David Beckham";
int number = 7;
String club;

if(number==7){
if(name.equals("David Beckham")){
club="Manchester United FC";
}
}

if문안의 중첩도를 3이상 만들수도 있지만, if문의 중첩도는 2 이하로 맞추는 것의 향후 코드 가독성을 위해서 좋다. 논리연산자를 사용하면 불필요한 중첩도를 낮출수 있다. 위의 코드를 리팩토링해보겠다.

1
2
3
if(number==7 && name.equals("David Beckham")){
club="Manchester United FC";
}

훨씬 가독성이 높아진다. 중첩도 2 수준만으로 대부분의 논리를 구현할 수 있으므로 중첩도가 3이상 넘어가지 않도록 주의하자.

삼항연산자

삼항연산자를 이용하면 if-else문을 간단히 한줄로 작성할수도 있다.

1
(조건식) ? [true] : [false]

? 기준으로 왼쪽이 조건식이 되며, ? 오른쪽은 조건에 따라 수행될 함수 또는 대입될 리터럴을 작성한다.

조건식이 true이면 : 기준으로 왼쪽이 수행되고, false이면 : 기준으로 오른쪽이 수행된다. 아래 예제코드를 보자.

1
2
3
4
5
6
7
8
9
import java.time.LocalDateTime;

public class StudyHalle {
public static void main(String[] args){
LocalDateTime time = LocalDateTime.now();
String ampm = (time.getHour()>=12) ? "오후" : "오전";
System.out.println("지금은 "+ampm+"입니다.");
}
}
1
지금은 오후입니다.

LocalDateTime 객체로 시간을 가져와서 그중 시간이 12시 이상이면, 문자열 변수 ampm에 오전/오후 리터럴을 대입하는 코드이다.


switch

특정 조건으로 분기 처리할 수 있는 if문과 달리 switch문은 하나의 조건문으로만 명령이 수행되도록하는 특징이 있다. 이름 그대로 ‘스위치’ 같은 역할을 수행하는데, if문보다 간결 하다는 장점이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
int num=2;
switch(num){
case 0:
System.out.println("입력받은 숫자는 0입니다.");
case 1:
System.out.println("입력받은 숫자는 1입니다.");
break;
case 2:
System.out.println("입력받은 숫자는 2입니다.");
break;
default:
System.out.println("입력받은 숫자는 2보다 큰 정수입니다.");
}
1
입력받은 숫자는 2입니다.

switch로 들어온 조건에 따라 다양하게 분기처리가 가능하다. caseif 또는 else-if와 같다. defaultelse와 같다.

switch문에서 사용한 break는 아래 정리해두었다.

switch의 제약조건

  • switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
  • case문의 값은 정수, 상수만 가능하며, 중복되지 않아야 한다.

출처 : 남궁성 - Java의 정석

중첩 switch문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int num=2;
String gender = "male";

switch(num) {
case 0:
switch(gender) {
case "male":
System.out.println("남자입니다.");
break;
case "female":
System.out.println("여자입니다.");
break;
}
case 1: case 2:
switch (num) {
case 1:
System.out.println("1입니다.");
break;
case 2:
System.out.println("2입니다..");
break;
}
default:
System.out.println("입력받은 숫자는 1보다 큰 정수입니다.");
}

위의 코드처럼 switch 안의 switch가 중첩될수도 있으며, case 2개를 한번에 분기처리할수도 있다.


반복문

for i

1
for(iterator 초기값; iterator 조건; 증감;) { }

for문의 () 안에는 iterator의 초기값, 조건, 증감이 들어간다. iterator가 true일때까지 증감할때마다 블럭{} 안의 코드가 반복된다.

1
2
3
for(int i=0; i<10; i++){
System.out.print(i+" ");
}
1
0 1 2 3 4 5 6 7 8 9

for each

for-each는 for-i와 달리 iterator를 쓰지 않는 for문이다.

1
2
3
4
int[] numbers = {0,1,2,3,4,5,6,7,8,9};
for(int num:numbers){
System.out.print(num+" ");
}
1
0 1 2 3 4 5 6 7 8 9

iterator를 쓰지 않기 때문에 List 또는 배열등의 자료구조가 필요하다.

출처 : w3schools - Java For Loop

while

1
while(condition) { }

while문안의 조건문이 true 이면, 계속 반복하다가 조건문이 false 이면 반복문이 종료된다.

1
2
3
4
int i = 0;
while(i<5){
System.out.print(i+" ");
}
1
0 1 2 3 4

do-while

while문의 경우 블럭안의 내용이 실행되기 앞서 조건문을 먼저 실행한뒤에 조건이 true이면 블럭안의 코드가 실행되는데 반해, do-while문은 일단 블럭안의 코드를 실행한뒤에 더 반복할지 조건문을 실행하는 반복문이다.

1
2
3
4
int i = 0;
do {
System.out.print(i+" ");
} while(i<5);

주의해야할 점은 조건문을 마칠 때 ;를 꼭 작성해야 한다!

출처 : w3schools - Java While Loop


조건문과 반복문에서 쓰이는 키워드

조건문과 반복문에서 자주 쓰이는 키워들이다.

break;

switch는 조건에 따라 분기를 원할 경우, 각 case가 끝날때마다 break을 찍어줘야한다. 그렇지않으면 그 다음 case가 실행된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int num=1;

switch(num){
case 0:
System.out.println("입력받은 숫자는 0입니다.");
case 1:
System.out.println("입력받은 숫자는 1입니다.");
break;
case 2:
System.out.println("입력받은 숫자는 2입니다.");
break;
default:
System.out.println("입력받은 숫자는 2보다 큰 정수입니다.");
}
1
2
입력받은 숫자는 0입니다.
입력받은 숫자는 1입니다.

첫번째 case에서 break되지 않고, 다음 case까지 실행되었기 때문이다. if문은 {}가 완벽하게 다른 조건과 독립되는것에 비해 switch가 갖는 특징이기도 하다.

continue;

반복하지 않고 바로 건너띄울때(skip) 사용하는 키워드이다.

1
2
3
4
5
6
for(int i=0; i<10; i++){
if(i%2==0){
continue;
}
System.out.print(i+" ");
}

0부터 10까지 iterator를 돌리면서 iterator를 출력하는 반복문인데, 짝수(i%2==0)는 continue 되도록 하였다.

1
1 3 5 7 9

Live-Study 참석율 대시보드 생성하기

Live-Study 대시보드는 Github에 소스코드와 문서를 정리하여 올려두었다.

https://github.com/youngjinmo/WhiteShip-LiveStudy-Dashboard