[Live Study] 4주차 과제: 제어문
포스트
취소
Preview Image

[Live Study] 4주차 과제: 제어문

이 스터디는 백기선님께서 Github유튜브로 진행하시는 스터디 입니다.

참여하시고 싶으신 분은 아래 링크를 참고해 주세요 :)

대부분의 내용은 [O’REILLY] Java in a Nutshell, 7th Edition 에서 참고 하였습니다.

(최대한 직접 해석하면서 읽고 있으며 모르는 단어는 번역기로 찾았습니다.)

학습 목표

자바가 제공하는 제어문을 학습하세요.

선택문

if / else if / else

if

if 문은 자바가 결정을 내릴 수 있도록 하는 근본적인 제어문 중 하나 입니다.

조건부로 문장(statement)을 실행하기 위해 사용 되므로 조건문이라고 합니다.

1
2
3
4
5
6
7
8
9
10
public String getName(String name) {
    if (name == null) { // name이 null이라면...
        name = "alan";
    }

    return name;
}

System.out.println(getName("sangwoo")); // sangwoo
System.out.println(getName(null)); // alan

if / else

필요에 따라 else 문을 추가하여 조건에 해당하지 않을 때 처리를 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
public String getName(String name) {
    if (name == null) {
        name = "alan bae";
    } else { // if 문이 true가 아니라면...
        name = name + " bae";
    }

    return name;
}

System.out.println(getName("sangwoo")); // sangwoo bae
System.out.println(getName(null)); // alan bae

if / else if / else

위와 같이 if/else문으로 두 가지 조건(if문의 true 혹은 false)을 처리할 수 있지만

더 많은 조건을 평가하고 싶다면 else ififelse의 사이에 추가하여 처리할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public String intToString(int n) {
    if (n == 0) {
        return "zero";
    } else if (n == 1) {
        return "one";
    } else if (n == 2) {
        return "two";
    } else { // n이 0도 1도 2도 아니라면...
        return "other";
    }
}

System.out.println(intToString(0)); // zero
System.out.println(intToString(1)); // one
System.out.println(intToString(2)); // two
System.out.println(intToString(3)); // other
System.out.println(intToString(10)); // other

더불어 if/else if/else문 블록 안에서 바로 반환(return)이 가능한 것을 볼 수 있습니다.

if 중첩

if문 안에 추가적인 if문을 추가할 수 있습니다. 당연히 else if문이나 else문 에도 가능합니다.

다만 중첩하는 것은 코드를 읽기 어렵게 만들기 때문에 불가피한 경우가 아니라면 지양하는 것이 좋다고 생각 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public String intToString(int n) {
    if (n == 0) {
        return "zero";
    } else if (n == 1) {
        return "one";
    } else if (n == 2) {
        return "two";
    } else {
        if (n < 10) { // n이 0,1,2가 아니면서 10 이하라면...
            return "less then ten";
        }

        return "other";
    }
}

System.out.println(intToString(0)); // zero
System.out.println(intToString(1)); // one
System.out.println(intToString(8)); // less then ten

switch

switch문을 사용한다면 어떤 한 조건에 대해서 결과를 다양하게 분기할 수 있습니다.

동일한 조건으로 if / else if / else문으로도 표현이 가능하지만 가독성이 더 떨어질 수 있기 때문에

switch를 사용하는 것을 고려해볼 수 있습니다.

조건으로 사용할 수 있는 타입은 int, short, char, byte, String, enum이 가능하며

해당하는 primitive type의 wrapper type도 사용 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public String intToString2(int n) {
    String result = "";
    
    switch (n) {
        case 0: // n이 0일때
            result = "zero";
            break;
        case 1: // n이 1일때
            result = "one";
            break;
        case 2: // n이 2일때
            result = "two";
            break;
        default: // 기본값
            result = "other";
            break;
    }
    
    return result;
}

System.out.println(intToString2(0)); // zero
System.out.println(intToString2(1)); // one
System.out.println(intToString2(8)); // other

위와 같이 사용할 수 있으며 case 구문 마다 break를 걸어주지 않으면 다음 case 식을 실행합니다.

default 키워드는 모든 case에 해당하지 않는 기본 값을 의미하며 if문의 else와 유사합니다.

또한 case문에서 바로 반환이 가능 합니다.

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
26
public String intToString3(int n) {
    String result = "";

    switch (n) {
        case 0:
            result = "zero"; // break가 없어 통과
        case 1: // 결국 0 or 1과 동일함
            result = "one";
            break;
        case 2:
            return "two"; // two 리턴
        case 3:
        case 4:
            result = "three or four";
            break;
        default:
            result = "other";
            break;
    }

    return result;
}

System.out.println(intToString3(0)); // one
System.out.println(intToString3(1)); // one
System.out.println(intToString3(3)); // three or four

반복문

while

while문은 자바에서 반복적인 액션을 수해할 수 있게 해주는 기본적인 문장(statement) 이며

자바의 다양한 루프(loop) 구조 중 하나 입니다.

조건이 거짓일 경우 while문을 건너 뛰며 참일 경우 블록 안의 내용이 실행 되며 거짓이 될때까지 반복합니다.

그러한 특징을 살려서 무한 루프를 만들기가 용이 합니다.

1
2
3
4
5
6
7
8
9
int count = 0;
while (count < 10) { // count가 10보다 작으면 실행
    System.out.println(count); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    count++;
}

while (true) { // 무조건 true 이므로 무한 루프
    System.out.println("this is infinity loop"); // 계속 출력...
}

do / while

do/while문은 위의 while문과 유사하지만 문장과 조건식이 반대 입니다.

while은 조건 판단 후 문장을 실행하지만 do/while은 무조건 한번 문장을 실행 후 조건을 판단하여 반복 합니다.

1
2
3
4
5
int count = 0;
do { // 무조건 한 번 실행
    System.out.println(count); // 0
    count++;
} while (count < 1); // count가 1이 되어 반복문 종료

for

for 문은 일반적인 루프(loop) 패턴이며 while문 이나 do문에 비해 사용하기 편리합니다.

그래서 자바에서는 반복적인 작업을 할때는 주로 for문을 사용하게 될 것 입니다.

1
2
3
for (<초기값>; <조건>; <증감>) {
  <문장>
}

문법은 위와 같으며 간단한 예제로는 아래와 같습니다.

1
2
3
for (int i = 0; i < 5; i++) {
  System.out.println(i); // 0, 1, 2, 3, 4
}
  • 초기값 : i는 0 (int i = 0)
  • 조건 : i가 5미만일때 (i < 5)
  • 증감 : i를 1씩 증가 (i++)

위 예제에서는 조건으로 사용되는 변수를 i 하나만 사용했지만 2개 이상도 사용 가능합니다.

1
2
3
for (int i = 0, j = 5; i < 5; i++, j--) {
  System.out.println("(" + i + "," + j + ")"); // (0,5) (1,4) (2,3) (3,2) (4,1)
}

foreach

foreach문은 우리나라 말로 향상된 for문이라고도 불립니다.

for문은 원시 타입(primitive type)을 사용하여 조건을 처리하지만 (counter)

foreach문은 배열이나 컬렉션을 사용하고 요소를 하나씩 반복하여 처리할 때 주로 사용 됩니다.

1
2
3
4
int[] nums = new int[]{1, 2, 3, 4, 5};
for (int num : nums) { // nums의 요소를 하나씩 num에 대입합니다.
    System.out.println(num); // 1, 2, 3, 4, 5
}

다만 foreach를 사용하게 되면 반복자(counter)가 없기 때문에 현재 어느 위치인지 알기가 쉽지 않습니다.

foreach를 사용한다면 할 수 없는 작업들은 아래와 같습니다.

  • 배열 또는 컬렉션의 요소를 거꾸로 반복 할 수 없습니다.
  • 반복자를 사용할수 없기 때문에 여러 배열의 동일한 위치의 요소를 가져올 수 없습니다.
  • 컬렉션의 요소를 get() 메소드를 사용하여 가져올 수 없습니다.

break

만약 while, do/while, for, switch문을 사용할 때 어느 조건에 따라 문장을 종료하고 싶다면 break 키워드를 사용할 수 있습니다.

1
2
3
4
5
6
7
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // i가 3이면 for문을 종료
    }

    System.out.println(i); // 0, 1, 2
}

continue

while, do/while, for 반목문을 사용할 때 continue를 사용한다면 해당 조건은 넘어가고 다음 조건을 실행 시킬 수 있습니다.

1
2
3
4
5
6
7
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // i가 3이면 다음 조건으로 넘어가기
    }

    System.out.println(i); // 0, 1, 2, 4
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

[Live Study] 3주차 과제: 연산자

[Live Study] 5주차 과제: 클래스