[Live Study] #4 제어문

Jihoon Oh·2021년 1월 15일
0

Live Study

목록 보기
4/13
post-thumbnail

목표

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

학습할 것 (필수)

  • 선택문
  • 반복문

선택문

자바에서 선택문은 switch ~ case 문을 의미한다. 3주차 과제에서도 잠깐 설명했지만, if문이 다중으로 중첩되어서 문제가 되는 가독성과 속도 문제를 switch를 통해서 해결할 수 있다.

switch()에서 괄호의 사이에는 변수 또는 표현식을 적고, case 뒤에 괄호 안에 들어간 변수 또는 표현식의 값을 적는다. 그리고 그 아래에 각각의 case에 해당할 때 실행할 코드를 적는다.

public class Test {
    public static void main(String[] args) {
        int a = 1;
        switch (a) {
            case 0:
                System.out.println("zero");
                break;
            case 1:
                System.out.println("one");
                break;
            case 2:
            case 3:
                System.out.println("two or three");
                break;
            default:
                System.out.println("others");
                break;
        }
    }
}

이 때 switch ~ case 문에는 몇가지 제약 사항이 있다. case 값은 반드시 리터럴 또는 상수여야 한다. 자바 7 이전까지는 case 값에 정수만 가능했으나, 자바 7 이후부터는 case 값에 String을 사용하는 것도 가능하다.

각 case문에 break를 작성하지 않으면 break가 나올 때 까지 다음 순서의 case로 넘어가서 코드를 실행한다. 때문에 여러 case에 대해 같은 로직을 처리하고 싶다면 break를 쓰지 않고 case만 연이어 쓴 다음에 실행할 코드를 작성하고 break문으로 탈출시켜주면 된다.

만약 case에 해당하는 경우가 없으면 default에 해당하는 코드가 실행된다.

자바 12와 13에서 바뀐 switch의 문법에 대해서는 3주차에 설명했으므로 넘어가도록 한다.

반복문

자바의 반복문에는 for, while, do ~ while, for each가 존재한다. 가장 일반적으로 많이 쓰이는 것은 for 문이다. for문의 기본 형태는 다음과 같다.

for (int i = 0; i < 10; i++) {
    System.out.println(i);
}
// 0부터 9까지 출력

예시에서 볼 수 있듯이 for문의 괄호 안에는 반복자, 조건, 증감이 들어가며 세미콜론으로 구분한다. 반복자로는 새로운 변수를 정의해서 사용할 수도 있고, 이미 정의된 변수를 사용해서 반복 할 수도 있다.

증감 조건에는 일반적으로 증감 연산자(++, --)를 많이 사용한다. 다만 예를 들어 짝수만 출력하는 코드를 작성하고 싶다면

for (int i = 0; i < 10; i+=2) {
    System.out.println(i);
}
// 0, 2, 4, 6, 8이 출력

와 같이 산술 연산자를 사용하여 증감 조건을 다르게 지정할 수 있다.

만약 무한 루프를 작성하고 싶다면

for (;;) {
    System.out.println("무한루프입니다.");
}

와 같이 조건을 안쓰고 세미콜론만 찍어서 만들 수 있다.

또한 for 문 안에 다른 for 문을 넣어서 다중 for 문을 만들 수도 있다. 이 때 주의해야 할 점은, 각 for문의 반복자로 같은 변수를 사용할 수 없다는 것이다.

for문 외에 또 많이 쓰이는 반복문으로는 while문이 있다. for문과의 차이는 반복자를 통해서 반복하는 것이 아니라 조건문을 사용해서 반복한다는 점이다. 때문에 반복 횟수가 고정되어 있지 않은 반복문은 for보다 while을 사용하는 경우가 더 많다. 기본형은 다음과 같다.

int i = 0;
while (i < 10) {
    System.out.println(i++);
}

while문의 괄호 안에는 조건문이 들어가고, 이 조건이 반환하는 boolean 값이 true면 괄호 안의 코드를 실행한다. 즉, while (true) 와 같이 쓰게 되면 내부에서 break나 return이 있지 않은 한 무한 루프로 실행된다.

while문과 비슷하게 do ~ while문도 존재한다. do ~ while문은 while문과 거의 모든 부분이 흡사한데, 조건의 위치가 다르다. do ~ while 문은 조건이 중괄호 뒤에 오기 때문에, 조건이 false여도 한 번은 실행한다. 소소한 차이로, do ~ while 문은 맨 마지막에 세미콜론을 붙여줘야 한다.

int i = 0;
do {
    System.out.println(i);
} while (i > 0);
// 조건이 false지만 0을 한번 출력한다.

자바의 for each 문은 J2SE 5.0부터 추가되었는데, 사실 for each라는 명시적인 키워드는 존재하지 않는다. 다만 비슷한 문법을 다른 언어에서 for each로 쓰기 때문에 for each라고 부른다.

똑같은 for 반복문을 for과 for each로 나누어 쓰게 되면 다음과 같다.

String[] days = ["월", "화", "수", "목", "금", "토", "일"];
for (int i = 0; i < days.length(); i++) {
    System.out.println(days[i]);
}
for (String day: days) {
    System.out.println(day);
}

이전에 자바스크립트를 해봤다면 (ECMA 2015 이상) 직관적으로 딱 이해할 수 있을 것이다. 기존에 배열에서 for문을 돌려면 반복자를 통해 배열의 인덱스에 접근해야 했지만, for each를 사용하면 iterable한 객체의 요소를 직접 사용할 수 있다. for 뒤에 오는 () 안에 변수의 타입과 for 문 안에서 쓸 이름을 적고, 콜론 뒤에 iterable 객체를 적어주면 객체의 각각의 요소들이 왼쪽에 쓴 변수에 대입되어 for 문 안에서 사용할 수 있다.

참고 자료
https://wikidocs.net/264

profile
Backend Developeer

0개의 댓글