상세 컨텐츠

본문 제목

자바스터디_20240502

카테고리 없음

by 개포동코딩박사 2024. 5. 2. 15:17

본문

 

조건문 ? 

특정 조건에 따라 서로 다른 코드를 실행하는 것을 의미한다.

조건문에는 if문과 switch문이 있고, 조건식과 문장을 포함하는 블럭{}으로 구성된다.

 


 

if 문 - if, else

 

if 문

  • 특정 조건(condition)이 참(true : 1)인지 거짓(false : 0)인지 확인하고, 그 조건이 참(true)일 경우 특정 코드 블럭을 실행한다.

if (condition) {

// 조건이 참일 때 실행되는 코드

}

 

💡 괄호는 언제 생략 가능할까 ?

수행하는 문장이 '하나'인 경우에 생략 가능하다 !

if (true)

System.out.println("if문에서 실행됨");

 

💡 중첩 if 문

if문 블럭 내에 또 다른 if문을 포함시키는 것도 가능하고 중첩 횟수에도 제한이 없다 

하지만, 중첩된 if문이 많을수록 가독성이 떨어지기 때문에 "괄호{} 생략"을 주의하는 등 항상 코드의 가독성을 생각하며 작성한다.

if (num >= 0) {

if (num != 0) {

     sign = '+';

    } else {

     sign = '-';

    }

}

 

 

 

 

else 문

  • if문에서 만족하는 조건이 없을 때 실행된다.

if (condition) {

// 조건이 참일 때 실행되는 코드

} else {

// 만족하는 조건이 없을 때 실행되는 코드

}

 

 

서로 연관된 조건일 때는 'else if 문' 사용 

 

  • 서로 연관된 조건일 때 아래처럼 코드를 작성하게 된다면 ?
    ➙ 불필요한 조건 검사를 진행하게 되고 효율적인 코드가 될 수 없다 !

int age = 14;

 

if(age <= 7) { //~7: 미취학 

System.out.println("미취학");

}

if(age >= 8 && age <= 13) { //8~13: 초등학생

System.out.println("초등학생"); }

if(age >= 14 && age <= 16) { //14~16: 중학생 

System.out.println("중학생");

}

if(age >= 17 && age <= 19) { //17~19: 고등학생

System.out.println("고등학생"); }

if(age >= 20) { //20~: 성인 

System.out.println("성인");

}

if else와 차이 

 

  • else if 문을 이용하여 코드 작성 !
    ➙ else 문은 생략 가능하다 !

int age = 14;

if(age <= 7) { //~7: 미취학 

System.out.println("미취학");

} else if(age <= 13) { //8~13: 초등학생 

System.out.println("초등학생");

} else if(age <= 16) { //14~16: 중학생

System.out.println("중학생");

} else if(age <= 19) { //17~19: 고등학생

System.out.println("고등학생");

} else { //20~: 성인

System.out.println("성인"); 

}

 

 

 만약 서로 독립된 조건인 경우에 'else if 문'을 사용하게 된다면 ?

아래처럼 원치 않는 결과를 얻게 될 것이다 

int price = 10000;// 아이템 가격 int age = 10;//나이

int discount = 0;

 

if (price >= 10000) {

discount = discount + 1000

    System.out.println("10000원 이상 구매, 1000원 할인");

} else if (age <= 10) {

discount = discount + 1000

    System.out.println("어린이 1000원 할인");

} else {

System.out.println("할인 없음");

}

 

System.out.println("총 할인 금액: " + discount + "원"); }

 첫번째 요소 이미 충족 else if 사용 X

 


 

switch 문

 

  • `if`문은 '비교 연산자'를 사용할 수 있지만, `switch`문은 단순히 값이 같은지만 비교할 수 있다.
    ➙ 조건식의 결과 값이 어떤 `case`의 값(value)와 일치하면 해당 `case`의 코드를 실행한다 !



switch (조건식) {

case value1 :

     // 조건식의 결과 값이 value1일 때 실행되는 코드

        break;

    case value2 :

    // 조건식의 결과 값이 value2일 때 실행되는 코드

        break;

    default :

     // 조건식의 결과 값이 위의 어떤 값에도 해당하지 않을 때 실행되는 코드

}

 

  • 옛날 switch문

//grade 1:1000, 2:3000(변경), 3:3000, 나머지: 500 

int grade = 2;

 

int coupon;

switch (grade) {

case 1:

     coupon = 1000;

        break;

case 2:

case 3:

     coupon = 3000;

        break;

    default:

coupon = 500;

break

}

System.out.println("발급받은 쿠폰 " + coupon);

 

 

 

 

 

int month = 4; // 4월

String season;

switch (month) {

    case 3:

    case 4:

    case 5:

        season = "봄";

        break;

    case 6:

    case 7:

    case 8:

        season = "여름";

        break;

    case 9:

    case 10:

    case 11:

        season = "가을";

        break;

    case 12:

    case 1:

    case 2:

        season = "겨울";

        break;

    default:

        season = "알 수 없음";

        break;

}

System.out.println(season); // "봄" 출력

 

 

 

 

 

int month = 4; // 4월

String season = switch (month) {

    case 3, 4, 5 -> "봄";

    case 6, 7, 8 -> "여름";

    case 9, 10, 11 -> "가을";

    case 12, 1, 2 -> "겨울";

    default -> "알 수 없음";

};

System.out.println(season); // "봄" 출력

 

훨씬 간단하다

 

 

case 문엔 문자, 정수, 상수만 가능하며 중복이 불가능

 

 

Java 14 새로운 switch문

  • `if`문보다 간결한 코드를 작성하려고 나온건데 기대한 만큼 깔끔하지는 않아서 새로운 `switch`문이 Java14부터 정식으로 도입되었다 !
    기존 `switch`문과의 차이점

//grade 1:1000, 2:2000, 3:3000, 나머지: 500 

int grade = 2;

 

int coupon = switch (grade) {

    case 1 -> 1000;

    case 2 -> 2000;

    case 3 -> 3000;

    default -> 500;

};

 

System.out.println("발급받은 쿠폰 " + coupon);

 

💡 만약 `break`문이 없으면, 어떻게 될까 ?

일치하는 `case` 이후의 모든 `case` 코드들도 순서대로 실행된다 !

 

 

💡 `if`문 vs `switch`문

`swtich`문 없이 `if`문만 사용해도 된다. 하지만 특정 값에 따라 코드를 실행할 때는 `switch`문을 사용하면 `if`문보다 간결한코드를작성 가능하다 !

 

 

 

 

 

 

 

 

 

 

 

 

 

💡 삼항 연산자를 활용한 `if`문

(조건) ? 참_표현식 : 거짓_표현식

int age = 18;

String status;

if (age >= 18) {

status = "성인"

} else {

status = "미성년자"

}

System.out.println("age = " + age + " status = " + status);

         

// 삼항 연산자를 사용하여 간결해진 코드

int age = 18;

String status = (age >= 18) ? "성인" : "미성년자";

System.out.println("age = " + age + " status = " + status);

 


🌒 반복문

 

while 문

  • 조건식을 체크하고, 조건식이 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다.
  • 조건식이 참이면 코드 블럭을 실행하고, 이후에 코드 블럭이 끝나면 다시 조건식 검사로 돌아가서 조건식을 검사한다. (무한 반복)

while (조건식) { 

// 코드

}

 

  • 예제 코드 1

int count = 0;

while (count < 3) {

count++;

System.out.println("현재 숫자는:" + count); 

}

 

💡팁:  좋은 코드인지 아닌지는 변경 사항이 발생했을 때 알 수 있다.

변경 사항이 발생했을 때 변경해야 하는 부분이 적을수록 좋은 코드이다 !

int sum = 0;

sum = sum + 1; //sum(0) + 1 -> sum(1)

sum = sum + 2; //sum(1) + 2 -> sum(3)

sum = sum + 3; //sum(3) + 3 -> sum(6)

// i부터 1씩 증가하는 수를 3번 더하기

int sum = 0;

int i = 1;

 

sum = sum + i;

i++;

 

sum = sum + i;

i++;

 

sum = sum + i;

// i부터 1씩 증가하는 수를 endNum(마지막 수)까지 더하기

int sum = 0;

int i = 1;

int endNum = 3;

 

while (i <= endNum) {

sum = sum + i;

    i++;

}

➙ 코드가 실행되는 횟수를 유연하게 변경 가능해졌다 !

 


 

do-while 문

  • while문의 변형 !

do {

// 코드

} while (조건식);

 

  • 단, 조건에 상관없이 무조건 한 번은 코드를 실행한다 !

int i = 10;

while (i < 3) {

System.out.println("현재 숫자는:" + i);

i++;

} while 문은 실행 안됨.

int i = 10;

do {

System.out.println("현재 숫자는:" + i);

i++;

} while (i < 3); 조건식에 맞지 않아도 한번은 실행.

 


 

break, continue

 

break

  • 반복문을 즉시 종료하고 나간다.

while(조건식) { 코드1;

break;//즉시 while문 종료로 이동한다.

코드2

}

//while문 종료

 

💡 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값을 찾으려면 ?

int sum = 0;

int i = 1;

 

while (true) {

sum += i;

    if (sum > 10) {

     System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);

        break;

    }

    i++;

}

 

 

continue

  • 반복문의 나머지 부분을 건너뛰고 다음 반복으로 진행한다.

while(조건식) { 

코드1;

continue;//즉시 조건식으로 이동한다.

코드2

}

 

💡 1부터 5까지 숫자를 출력하는데, 숫자가 3일 때는 출력을 건너뛰게 하려면 ?

int i = 1;

 

while (i <= 5) {

if(i == 3) {

     i++;

        continue;

    }

    System.out.println(i);

    i++;

}

 


 

for 문

 

for문 구조

for (초기식; 조건식; 증감식) {

// 조건식이 참일 때 수행할 statment

    // statement가 한 줄인 경우엔 괄호{} 생략 가능 !

}

 

for (;;) { // 생략 가능 (무한 반복)

...

}

  1. 초기식이 실행된다.
  2. 조건식을 검증한다. 참이면 코드를 실행하고, 거짓이면 for문을 빠져나간다.
  3. 코드를 실행한다.
  4. 코드가 종료되면 증감식을 실행한다. 주로 초기식에 넣은 반복 횟수와 관련된 변수의 값을 증가(i++)할 때 사용한다.
  5. 다시 "2. 조건식" 부터 시작한다. (무한 반복)

 

int sum = 0;

int endNum = 10;

 

for (int i = 1; i <= endNum; i++) {

sum = sum + i;

    System.out.println("i=" + i + " sum=" + sum);

}

  1. 초기식이 실행된다. `int i = 1`
  2. 조건식을 검증한다. `i <= 10`
  3. 조건식이 참이면 코드를 실행한다. `System.out.println(i);`
  4. 코드가 종료되면 증감식을 실행한다. `i++`
  5. 다시 2. 조건식을 검증한다. (무한 반복) 이후 `i <= 10` 조건이 거짓이 되면 for문을 빠져나간다.

 

💡 `for` vs `while`

`for`문이 없이 `while`문으로 모든 반복을 다룰 수는 있다. 하지만 카운터 변수가 명확하거나, 반복 횟수가 정해진 경우엔 `for`문을 사용하는 것이 구조적으로 더 깔끔하고, 유지보수 하기 좋다 !

➙ 쉰게 말하면, 정해진 횟수만큼 반복을 수행해야 하면 `for`문을 사용하고 그렇지 않으면 `while`문을 사용하면 된다 !

정해진 횟수의 반복이 필요할 때는 for 문을 사용하는 것이 좋다. for 문은 반복의 범위와 횟수가 명확할 때 코드를 더 깔끔하게 작성할 수 있도록 도와준다.

조건에 따라 반복 횟수가 결정되거나, 무한 반복이 필요한 경우 while 문을 사용하는 것이 더 적합할 수 있다. while 문은 특히 조건에 기반한 반복이나 예측할 수 없는 횟수의 반복에 유용하다.

int sum = 0;

int i = 1;

int endNum = 3;

 

while (i <= endNum) {

sum = sum + i;

System.out.println("i=" + i + " sum=" + sum);

i++; 

}

 

 

 

 

 

 

 

💡 중첩 반복문

조건문인 `if`문 처럼 반복문(`for`, `while`)도 내부 또 반복문을 만들 수 있다 !

➙ 중첩 횟수에 제한은 없지만, '데이터가 많을수록' 중첩 반복문의 성능은 확연히 떨어지기 때문에, 최대한 중첩 횟수를 줄일 수 있으면 줄이는 것이 성능 개선 측면에서 유리하다 !

( 보통 3중 for문까지 사용해야 할 경우가 없다는 점 .. )

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

System.out.println("외부 for 시작 i:" + i); 

for (int j = 0; j < 3; j++) {

System.out.println("-> 내부 for " + i + "-" + j); 

    }

System.out.println("외부 for 종료 i:" + i);

System.out.println(); //라인 구분을 위해 실행

}

 

외부 for 시작 i:0

-> 내부 for 0-0

-> 내부 for 0-1

-> 내부 for 0-2

외부 for 종료 i:0

 

외부 for 시작 i:1

-> 내부 for 1-0

-> 내부 for 1-1

-> 내부 for 1-2

외부 for 종료 i:1

 












 

향상된 for 문 (enchanced for statement)

 

  • JDK1.5부터 배열컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 추가된 for문의 새로운 문법 !

for (typeOfAccessVar accessVarName : arrayOrCollection) {

// 반복할 statment

}

 

  • 배열 arr의 모든 요소를 출력하는 기존 for문

for (int i = 0; i < arr.length; i++) {

System.out.println(arr[i]);

}

 

  • 배열 arr의 모든 요소를 출력하는 향상된 for문

for (int tmp : arr) { // tmp: 임시값을 의미하는 변수명

System.out.println(tmp);

}

 


 

💡 이름 붙은 반복문

말 그대로 반복문 자체에 이름을 지정해주고 특정 반복문에 대해 `break`이나 `continue` 명령어 같은 것들을 수행할 수 있다.

( 사실 실제 코드에서 사용하는 걸 본 적도 없고 사용할 일도 없을 듯 ... )

class Naming {

public static void main(String[] args) {

     // for문에 Loop1이라는 이름 설정

        Loop1 : for (int i = 2; i <= 9; i++) {

         for (int j = 1; j <= 9; j++) {

                 if (j == 5)

                     break Loop1; // for j를 break

                        break; // Loop1를 break

                        continue Loop1; // end of Loop1로 이동

                        continue; // end of for i로 이동

                    System.out.println(i + "*" + j + "=" + i * j);

                } // end of for i

        } // end of Loop1

    }

}

 


 

스터디 조장인 민규형의 포스트에, 중요한 부분과 내용추가 하는 방법으로 작성했다. 민규형 감사합니다