Cute Running Puppy

Language/[Java] 자바의 정석

[자바의 정석] chapter 04. 조건문과 반복문 (if, switch, for, while, statement)

R.silver 2023. 1. 18. 23:05
반응형

chap 04. 조건문과 반복문

제어문 (control statement)
프로그램의 흐름을 바꾸는 역할

1. 조건문 - if, switch

조건식 + {}으로 구성

조건식의 연산결과에 따라 실행할 문장이 달라져 프로그램의 실행흐름을 변경할 수 있다

1.1 if 문

조건문이 true이면 {} 안의 문장 수행

if (조건식) {
    // 조건식 == true 일 때 실행 
}

조건식

일반적으로 비교연산자와 논리연산자로 구성

등가 연산자 (==) 대신 대입 연산자 (=)를 사용하지 않도록 주의하자

조건식의 결과는 반드시 true, false가 되어야 한다

블럭 {}

{}을 사용하여 여러 문장을 하나의 단위로 묶을 수 있다

이것을 블럭이라 한다

} 다음에 ;을 붙이지 않는다는 것에 주의하자

블럭 안의 문장들은 탭으로 들여쓰기 하는 것이 좋다

블럭 안에 한 문장만 넣거나 문장을 넣지 않을 수 있는데 이 때는 괄호를 생략할 수 있다 (혹은 한 줄로 작성할 수 있다)

그러나 생략하지 않고 작성하는 것이 좋다.

이후에 새로운 문장이 추가 될 때 수정이 용이하기 때문이다. (실수 주의!)

1.2 if-else 문

조건식의 결과가 false 일 때, else 블럭의 문장이 실행된다

if (조건식) {
    // 조건식 == true 일 때 실행될 문장
} else {
    // 조건식 == false 일 때 실행될 문장 
}

두 개의 if문을 항상 if-else 문으로 변경할 수 있는 것은 아니다

그러나 변경이 가능하다면 변경하는 것이 좋다.

조건식 검사 횟수를 줄일 수 있기에 효율적이고, 간결하게 코드를 작성할 수 있다.

1.3 if-else if문

처리해야 할 경우가 세가지 이상일 때 사용

if (조건식1) {
    // 조건식1 == true 일 때 실행될 문장
} else if (조건식2) {
    // 조건식2 == true 일 때 실행될 문장
}
else { // 생략 가능 
    // 어느 조건도 만족하지 못할 때 실행될 문장 
}

if-else if문이 여러개의 if문을 합쳐놓은 것이지만

조건식을 바꾸지 않고 여러 개의 if문으로 쪼개 두기만 하면 전혀 다른 코드가 된다는 것에 주의하자

1.4 중첩 if문

if문 블럭 내에 또 다른 if문을 포함시키는 것

중첩 횟수의 제한은 없다

if (조건식1) {
    // 조건식1 == true 일 때 실행될 문장
    if(조건식2) {
        // 조건식 1, 2가 모두 true 일 때 수행
    } else {
        // 조건식1 == ture && 조건식2 == false 일 때 수행 
} else {
    // 조건식1 == false 일 때 수행
}

중첩 if문은 들여쓰기를 명확히하여 if문의 범위가 명확히 구분되도록 하는 것이 중요하다

괄호문 생략에 더욱 주의가 필요하다

바깥쪽의 if문과 안쪽의 if문이 엉켜 의도한 바와 다른 결과를 낼 수 있기 때문이다.

// ex1 
if (num >=0)
    if(num!=0)
        sign = '+'l
else 
    sign = '-';

ex1의 else 문은 바깥쪽에 속한 것 처럼 보이지만 괄호가 없기에 가장 가까운 if문에 속하게 된다.

그 결과 원래 의도와는 다르게 ex2 코드와 같이 동작하게 된다

그렇기에 중첩 if문을 작성할 경우 괄호를 넣어 블럭간의 관계를 확실하게 하는 것이 중요하다

1.5 switch 문

if문은 경우의 수가 많아질 수록 else-if를 계속 추가해야 하기에 복잡해지고 여러개의 조건식을 계산 해야 하므로 처리 시간도 많이 걸린다.

이에 비해 switch문은 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현 또한 간결하다

그렇기에 경우의 수가 많은 경우 switch문으로 작성하는 것이 좋다

다만, switch문에는 제약 조건이 있기에 경우의 수가 많아도 if문으로 작성해야 하는 경우가 존재한다

switch문의 작동 순서

  1. 조건식 계산
  2. 조건식의 결과와 일치하는 case 문으로 이동
  3. 이후의 문장 수행
  4. break 문이나 switch문의 끝을 만나면 switch문 전체를 빠져 나간다
  5. 만약 조건식의 결과가 일치하는 case 문이 하나도 없다면 default 문으로 이동한다 (생략 가능)

switch문에서 break문은 각 case 의 영역을 구분하는 역할을 한다.

그렇기에 break를 생략하면 case 간의 구분이 없어지므로 다른 break문을 ㅁ나나거나 switch문의 마지막 블럭을 만날 때 까지 나오는 모든 문장을 수행한다

break문을 생략하지 않도록 주의하자

그러나 의도적으로 break 문을 생략하는 경우도 있는데 그 예시는 아래와 같다

// 등급에 맞는 권한을 부여하는 코드 
switch (level) {
    case 3: 
        grantDelete(); // 삭제 권한
    case 2: 
        grantWrite(); //쓰기 권한 
    case 1:
        grantRead(); // 읽기 권한 
}

switch 문의 제약 조건

  1. switch문의 조건식은 결과 값이 반드시 정수여야 하며, 이 값과 일치하는 case문으로 이동하기에 case 문의 값 역시 정수여야 한다.
  2. case 의 조건이 중복되어서는 안된다
  3. case 문은 반드시 상수여야 한다 (변수, 실수, 문자열은 안된다)

⇒ 정리

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

만약 조건문에서 부등식이 사용된다면 if문을 switch문으로 변경할 수 없게 된다

또한 조건식의 결과가 실수가 된다면 정수 값으로 변환하여 작성해주어야 한다

switch문의 중첩

switch문도 중첩이 가능하다

break문을 빼먹지 않도록 주의하자

2. 반복문 - for, while, do-while

주어진 조건을 반복하는 동안 주어진 문장들을 반복적으로 수행한다

for 문과 while문은 어느 경우에나 서로 변환이 가능하여 어느 것을 선택해도 괜찮으나,

for 문은 주로 반복횟수를 알고 있을 때 사용한다

2.1 for문

반복 횟수를 알고 있을 때 for 문을 사용하면 적합하다.

for 문의 구조와 수행순서

초기화, 조건식, 증감식, 블럭 으로 구성되어 있다

조건문이 true인 동안 블럭 내의 문장을 반복하다 거짓이되면 반복문을 벗어난다

for (초기화;조건식;증감식) {
    // 조건식이 true 일 경우 동작 
}

초기화

반복문의 사용될 변수를 초기화 하는 부분이며 처음에 한 번만 수행된다

둘 이상의 변수가 필요할 경우 comma(,)를 사용하여 변수를 구분한다

이때, 두 변수의 타입이 같아야 한다

for (int i = 1, j = 0; i < 10; i++) {}

조건식

조건식의 값이 true이면 반복을 계속 진행하고

false 이면 반복을 중단하고, for문을 벗어난다.

주의!

조건식을 잘못 작성하면 블럭 내의 문장이 한번도 수행되지 않거나, 영원히 반복될 수 있다

증감식

반복문을 제어하는 변수의 값을 증가, 감소시키는 식

매 반복마다 변수의 값이 증감식에 의해 점진적으로 변하다가 조건식이 fasle가 되어 for 문을 벗어나게 된다

주로 ++연산자가 사용되지만 -- , += -= 등 다양한 연산자가 사용될 수 있다

증감식도 comma(,)를 사용하여 두 분장을 하나로 이어 사용할 수 있다

초기화, 조건식, 증감식은 모두 생략 할 수 있다.

조건식이 생략된 경우 항상 true가 되어 무한 반복문이 된다

이 경우 블럭 안에 if 문을 넣어 조건을 만족할 때 블럭을 빠져 나올 수 있도록 해야 한다

여러개의 변수를 초기화와 증감식에 사용할 수 있지만 사용되는 변수의 수가 적은 것이 더 효율적이고 간단하다.

변수들의 관계를 잘 파악하여 불필요한 변수의 사용을 줄이는 것이 좋다

나머지 연산자 (%) 는 특정 범위의 값들을 순환하며 반복하고

나누기 연산자 (/) 는 같은 값이 연속적으로 반복된다

중첩 for 문

for 문 안에 다른 for 문을 포함시킬 수 있다

향상된 for문 (enhanced for statement)

for (타입 변수명 : 배열 또는 컬렉션) {
        // 반복할 문장 
}

배열 또는 컬렉션에 저장된 값을 하나씩 반복하며 변수에 저장하기에

타입은 반드시 배열 또는 컬렉션의 요소 타입이어야 한다.

반복문의 괄호 안에서는 해당 변수를 사용하여 코드를 작성한다

// python의 for문을 생각하면 이해하기 쉽다

for (int tmp: arr) {
    System.out.println(tmp);
}

2.2 while 문

조건식이 true인 동안 블럭 내의 문장을 반복한다

while (조건식) {
    // 조건식 == true 일 동안 반복 
}

for문과 while문은 항상 서로 변환이 가능하다

초기화나 증감식이 필요하지 않은 경우라면 while문이 더욱 적합하다

while 문의 조건식은 생략 불가

조건식이 없다면 error 발생 → 항상 참이되도록 하고 싶으면 true를 넣으면 된다

// 무한 반복문 
while (true) {}
for (;;) {}

무한 반복문은 반드시 블럭 안에 종료 조건을 넣어서 빠져나올 수 있게 해야 한다

반복문을 사용하여 지연시간 주는 방법

for (int i = 0 ; i < 2_000_000_000; i++) {}

흔히 하는 실수

for(int i = 0; i < 10; i++ )**;** // 실수로 ';' 을 찍지 않도록 하자
{
    System.out.println("hello");
}

숫자와 %, /

  • 어떤 수를 10으로 나머지 연산하면

    마지막 자리를 얻을 수 있다

  • 어떤 수를 10으로 나누면

    마지막 한자리가 제거된다

2.3 do-while문

while문의 변형으로 기본적인 구조는 while문과 동일하다

조건식과 블럭의 순서를 변경했다는 차이가 있다.

블럭을 먼저 수행한 뒤 → 조건식을 평가한다

while 문은 블럭이 한 번도 수행되지 않을 수도 있지만

do-while문은 최소한 한번은 실행된다. (실행을 보장한다)

do {
    // 조건식의 연산결과가 참일 때 수행될 문장들 
} while (조건식); // ';' 필수! 

반복적으로 사용자의 입력을 받아서 처리할 때 유용하다

2.4 break문

자신이 포함된 가장 가까운 반복문을 벗어난다

if 문과 주로 사용되며 특정 조건을 만족하면 반복문을 벗어날 수 있도록 구성한다

2.5 continue문

반복문 내에서만 사용될 수 있다

반복이 진행되는 도중에 continue문을 ㅁ나나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다

for 문의 경우 증감식으로 이동하고, ‘

while 문과 do-while문은 조건식으로 이동한다

반복문을 벗어나지 않고 다음 반복으로 넘어가기에 break와 다른다

주로 if문과 사용되며, 특정 조건을 만족하는 경우에 continue문 이후의 문장을 수행하지 않고 다음 반복으로 넘어가 계속 진행하도록 한다

전체 반복 중 특정 조건을 만족하는 경우를 제외하고자 할 때 유용하다

2.6 이름 붙은 반복문

break문은 근접한 단 하나의 반복문만 벗어날 수 있기에

여러개의 반복문이 중첩된 경우에는 break문을 사용하여 중첩 반복문을 완전히 벗어날 수 없다

이때 중첩 반복문의 이름을 붙이고 break문과 continue문에 이름을 지정해줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다

반응형