관리 메뉴

개발그래머

[자바스터디 4주차] 제어문 본문

Java

[자바스터디 4주차] 제어문

임요환 2023. 5. 18. 23:40

목표

  • 자바가 제공하는 제어문을 학습

학습할 것

  • 선택문
  • 반복문

제어문(control flow statements)

  • 원하는 결과를 얻기 위해 프로그램의 순차적인 흐름을 제어할 때 사용하는 명령문
  • 선택문(조건문), 반복문 등
  • 제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있으며 중괄호 영역을 블록(block)이라고 함

선택문(conditional statements)

  • 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문

  1. if 문
  • 조건식의 결과가 참이면 주어진 명령문을 실행하며, 거짓이면 아무것도 실행하지 않음
  • 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 10;
if(x > 1){// 조건식
    System.out.println("x는 1보다 큽니다.");// 조건식의 결과가 참일 때 실행하는 명령문
}
// 중괄호를 기준으로 들여쓰기를 통해 코드의 가독성을 높이는 것을 인덴트(indent)라고 함

  1. if/else 문
  • if 문과 함께 사용하는 else 문은 if 문과 반대로 주어진 조건식의 결과가 거짓이면 주어진 명령어를 실행함
  • 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 10;
if(x > 1){// 조건식
    System.out.println("x는 1보다 큽니다.");// 조건식의 결과가 참일 때 실행하는 명령문
} else {
    System.out.println("x는 1보다 작습니다.");// 조건식의 결과가 거짓일 때 실행하는 명령문
}
  • if/else 문은 삼항 연산자를 이용해 간결하게 표현할 수 있음
int x = 10;
String answer = x > 1 ? "x는 1보다 큽니다." : "x는 1보다 작습니다.";
System.out.println(answer);

  1. if/else if/else 문
  • 새로운 구문처럼 보이지만 두 개의 if/else 문이 연달아 나오는 형태임
  • if/else if/else 문은 조건식을 여러 개 명시할 수 있으므로 중첩된 if문을 좀 더 간결하게 표현 가능
  • else if 문은 여러 번 나와도 상관없지만 if 문과 else 문은 단 한 번만 나올 수 있음
  • 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 9;
if(x > 5){
    System.out.println("x는 5보다 큽니다.");
}else if(x > 1){
    System.out.println("x는 1보다 큽니다.");
}else {
    System.out.println("x는 1보다 작습니다.");
}

  1. switch 문
  • 주어진 조건 값의 결과에 따라 다른 명령을 수행하도록 하는 조건문
  • if/else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편임
  • 조건 값으로는 int형으로 승격할 수 있는(integer promotion) 값만이 사용될 수 있음 -> 조건 값으로 byte, short, char, int 형의 변수나 리터럴 사용 가능(Wrapper class Byte, Short, Character, Integer도 가능)
  • enum 키워드를 사용한 열거체(enumeration type)와 String 클래스의 객체도 사용 가능
  • if/else 문보다는 사용할 수 있는 상황이 적음
int x = 10;
switch(x) {
    case 10:
        System.out.println("x는 10입니다.");
        break;
    case 5:
        System.out.println("x는 5입니다.");
        break;
    default:
        System.out.println("x는 10과 5는 아닙니다.");
        break;
}
  • default 절은 조건값이 위에 나열된 어떠한 case 절에도 해당되지 않을 때 실행되며 필수는 아님
  • default 절은 맨 마지막에 위치하는 것이 일반적이지만 case 절 사이에 위치해도 상관없음
  • 각 case 절과 default 절은 반드시 break 키워드를 포함하고 있어야 함
  • break 키워드는 switch 문을 빠져나가게 해 주며 선언하지 않을 시 조건에 해당하는 switch 문의 case 절 이후의 모든 case 절이 전부 실행됨
int x = 5;
switch(x) {
    case 10:
        System.out.println("x는 10입니다.");
    case 5:
        System.out.println("x는 5입니다.");
    default:
        System.out.println("x는 10과 5는 아닙니다.");
}
// x는 5입니다.
// x는 10과 5는 아닙니다.
int x = 5;
switch(x) {
    case 10:
    case 9:
    case 8:
    case 7:
    case 6:
        System.out.println("x는 5보다 큽니다.");
        break;
    case 5:
    case 4:
    case 3:
    case 2:
        System.out.println("x는 1보다 큽니다.");
        break;
    default:
        System.out.println("x는 1보다 작습니다.");
        break;
}
  • 위와 같이 사용하면 여러 개의 case 절을 사용하여 여러 개의 조건 값을 한 번에 검사할 수 있음

반복문

  • 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문

  1. while 문
  • 특정 조건을 만족할 때까지 주어진 명령문을 반복 실행함
  • 조건식이 참인지를 판단하여 참이면 내부의 명령문을 실행함
  • 명령문을 전부 실행하고 다시 조건식으로 돌아와 다시 참인지를 판단하게 됨
  • 조건식의 검사를 통해 반복해서 실행되는 반복문을 루프(loop)라고 함
  • 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 0;
while (x < 5) {
    System.out.println("x = " + x);
    x++; // 제거시 무한루프 유발
}
System.out.println("최종 x = " + x);
  • while 문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않으면 영원히 반복되는 무한 루프(infinite loop)에 빠질 수 있음
  • while 문을 작성할 때는 반드시 거짓을 갖도록 조건식의 결과를 변경하는 명령문을 포함시켜야 함

  1. do/while 문
  • 먼저 루프를 한번 실행한 후에 조건식을 검사함
  • 조건식의 결과와 상관없이 무조건 한 번의 루프를 실행
int x = 5;
do {
    System.out.println("x = " + x);
    x++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.
}while (x < 5);
System.out.println("최종 x = " + x);
// x = 5
// 최종 x = 6

  1. for 문
  • 자체적으로 초기식, 조건식, 증감식을 모두 포함하는 반복문
  • while문보다는 좀 더 간결하게 반복문을 표현할 수 있음
  • 초기식, 조건식, 증감식은 각각 생략할 수 있음
  • 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x;
for(x = 1;x < 6; x++){
    System.out.println("x = " + x);
}
  • for 문 안에서만 사용하는 변수를 초기식에 직접 선언할 수 있음
  • for 문에서 직접 선언된 변수는 for 문이 종료되면 같이 소멸됨
for(int x = 1;x < 6; x++){
    System.out.println("x = " + x);
}

System.out.println("x = " + x);// 에러 발생 -> 선언되지 않은 변수를 참조하려 함

for(int x = 1;x < 6; x++){
    System.out.println("x = " + x);
}
  • 변수 x라는 이름의 int형 변수를 두 번이나 선언해도 컴파일 오류가 발생하지 않는 이유는 for문이 종료되면 for문의 초기식에서 사용된 변수는 자동으로 소멸하기 때문임

  1. Enhanced for 문
  • JDK 1.5부터 배열과 컬렉션의 모든 요소를 참조하기 위해 새롭게 추가됨
  • 배열과 컬렉션 프레임워크에서 유용하게 사용됨
  • 명시한 배열이나 컬렉션의 길이만큼 반복되어 실행됨
  • 루프마다 각 요소는 명시한 변수의 이름으로 저장되며 명령문에서는 이 변수를 사용하여 각 요소를 참조할 수 있음
List<Integer> integers = List.of(1, 2, 3, 4, 5, 6, 7, 8);
for (Integer integer : integers) {
    System.out.println(integer);
}
  • Enhanced for 문은 요소를 참조할 때만 사용하는 것이 좋으며 요소의 값을 변경하는 작업에는 적합하지 않음
  • Enhanced for 문 내부에서 사용되는 배열 요소는 배열 요소의 복사본이므로 값을 변경해도 원본 배열에는 아무런 영향을 주지 않음