관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

[Spring반] 중간시험 2 - Java 이론 시험 및 문제 풀이 2 : 문제 7~8번 <조건문> 본문

개발 포트폴리오/수료증 및 시험

[Spring반] 중간시험 2 - Java 이론 시험 및 문제 풀이 2 : 문제 7~8번 <조건문>

huenuri 2024. 12. 4. 03:04

이어서 7번 문제부터 풀어보겠다. 처음 문제는 학습 준비도 하고 일기도 쓰느라 1시간 반 가까이 걸렸지만 이번에는 1시간 안에 두 번째 문제 풀이를 마치려고 한다.


 

 

 

 

Java 이론 시험 두 번째

 

문제 7번

Java의 조건문 중 if 문과 switch의 차이점을 서술하시오.

 

자바의 조건문 if와 switch는 모두 조건에 따라 다른 실행 경로를 선택할 때 사용되지만, 각각의 동작 방식과 사용 상황에 차이가 있다. 

 

1. if 문

  • 용도 : 조건식의 결과가 true인지 판단해서 코드 블록을 실행
  • 특징
    • 범용성 : 다양한 형태의 조건을 지원
      • 비교 연산 (==, >, <, >=, <=)과 논리 연산 (&&, ||)을 자유롭게 조합 가능
    • 조건의 수에 제한이 없음. 여러 개의 조건을 else if로 연결 가능
    • 조건식이 복잡하거나 범위 기반의 조건에 적합
  • 구조
if (조건1) {
    // 조건1이 true일 때 실행
} else if (조건2) {
    // 조건2가 true일 때 실행
} else {
    // 위 조건들이 모두 false일 때 실행
}

 

 

예제

 

 

num이 10이니 양수가 된다.


 

 

 

2. switch 문

  • 용도: 하나의 변수 값에 따라 여러 경우(case) 중 하나를 실행
  • 특징
    • 비교하는 값이 정수, 문자, 문자열, 열거형(enums)에 한정됨
    • 조건식 대신 정확히 일치하는 값에만 반응
    • 조건이 많아지면 가독성이 좋아지고, 특정 값 기반의 분기에 적합
    • case 뒤에 break를 명시하지 않으면 다음 case로 이어져 실행됨
  • 구조
switch (변수) {
    case1:
        // 값1일 때 실행
        break;
    case2:
        // 값2일 때 실행
        break;
    default:
        // 어떤 case에도 해당하지 않을 때 실행
}

 

 

예제

 

 

case가 3이니 결과는 수요일이 된다.


 

 

차이점 요약

구분 if 문 switch 문
조건식 형태 비교 연산, 논리 연산 등 복잡한 조건 가능 변수 값이 특정 값과 일치하는지 판단
사용 가능한 데이터 boolean, 정수, 실수, 문자열 등 거의 모든 값 정수, 문자, 문자열, 열거형(enums)
가독성 조건이 많아지면 복잡해질 수 있음 많은 경우를 다룰 때 가독성이 좋음
속도 조건이 많을수록 성능에 약간의 영향 있음 특정 값 기반이라 더 빠를 수 있음
유연성 범위, 복잡한 조건식 모두 가능 단순히 값과 일치 여부만 판단

 

 

 

사용 예시

  • if 문은 범위 기반 또는 복잡한 조건이 필요한 경우에 적합

 

 

 

 

  • switch 문은 고정된 값(정확히 일치하는 값)에 따라 분기할 때 적합

 

근데 여기서 이해가 안되는 코드가 있어 한번 분석해보려고 한다. char grade = sc.next().charAt(0);이다. 이 코드는 사용자로부터 문자열을 입력받아 그 문자열의 첫 번째 문자를 char 타입으로 가져오는 과정이다.

 

1. sc.next()

  • Scanner의 next() 메서드는 사용자가 입력한 한 단어를 문자열(String)로 읽어온다.
  • 입력은 공백이나 엔터로 구분되는데, 첫 번째 공백이나 줄바꿈 전까지의 내용을 가져온다고 보면 된다.
    • 예를 들어, 사용자가 A B C라고 입력하면 sc.next()는 A를 반환

2. .charAt(0)

  • String 객체에서 특정 인덱스(index)에 위치한 문자를 가져오는 메서드이다.
  • charAt(0)은 문자열의 첫 번째 문자(인덱스 0)를 가져온다.
    • 예를 들어, 문자열 "A"에서 charAt(0)은 문자 'A'를 반환

3. 결과적으로

  • sc.next()로 사용자 입력을 문자열로 읽고, .charAt(0)으로 그 문자열의 첫 번째 문자를 꺼내서 char 타입으로 저장한다.

 

 

 

 

그러니까 charAt(0)은 A에서부터 영문자를 받기 위한 문자를 반환하는 함수였다.


 

 

 

 

문제 8번

다음 두 코드의 실행 결과는 같지만 실행 방식에서는 차이점이 존재한다. 어떠한 차이점이 있는지 서술하시오.

 

예시 1

 

 

원래 시험문제는 else문이 없었지만 난 추가해 보았다. 그리고 이 코드를 변형해 사용자로부터 입력받아 출력하는 예제로 바꾸어보겠다.


 

 

 

예시 1 변형

 

 

 

현재 가지고 있는 돈에 따라 메뉴가 달라지는 출력 코드로 작성해 보았다. 이제 예시 두 번째 코드이다.


 

 

 

 

예시 2

 

이 코드를 조금 전처럼 사용자로부터 값을 받는 코드로 수정해 보겠다.


 

 

 

예시 2 변형

 

 

이제 진짜 문제를 풀어보자.

 

1. 첫 번째 코드

  • 조건문 특징
    • 조건문이 연속적으로 작성되어 있어, 각 조건은 독립적으로 평가된다.
    • 조건 money >= 12000, money >= 10000, money >= 8000, money >= 6000 등이 순차적으로 평가된다.
  • 실행 방식
    • 조건이 위에서 아래로 실행되며, if-else if 구조에 따라 첫 번째로 참인 조건에서 실행이 멈춘다.
    • 불필요하게 조건을 평가하는 경우는 없다. 예를 들어, money = 12000이라면 첫 번째 조건이 참이므로 이후 조건은 평가되지 않는다.

 

2. 두 번째 코드 

  • 조건문 특징
    • 조건문에 범위를 명시적으로 설정하여 조건을 더 구체화했다.
    • 각 조건에 money >= X && money < Y 형태로 범위를 설정했기 때문에 조건이 좀 더 명확하다.
  • 실행 방식
    • 각 조건은 특정 범위 내에서만 참이 되므로, 논리적으로 불필요한 범위 비교가 제거된 것처럼 보인다.
    • 하지만 첫 번째 코드에 비해 추가적으로 범위를 체크(money < Y)하는 조건이 포함되므로, 조건 평가 비용이 조금 더 높다.

 

비교

특징 첫 번째 코드 두번째 코드
조건 구성 각 조건이 독립적으로 >=만 검사 각 조건이 범위(>= X && < Y)로 구체화
효율성 조건이 참이면 이후 조건은 평가하지 않음 조건에 추가적인 범위 비교가 들어가 실행 비용이 약간 증가
가독성 비교적 간결하지만 조건 범위가 명시적이지 않음 범위가 명시적이라 논리적으로 이해하기 쉬움
유연성 조건 추가 시 범위를 고려하지 않아도 됨 조건 추가 시 범위 설정을 명확히 해야 함

 

 

결론

  • 첫 번째 코드는 간단하며, 조건이 참인 경우 추가적인 평가를 하지 않으므로 효율적이다.
  • 두 번째 코드는 조건이 더 명확하게 표현되어 가독성이 좋지만, 추가적인 범위 평가가 포함되므로 조건 평가 비용이 약간 더 높을 수 있다.

실제 코드 작성 시 가독성과 명확성을 중시한다면 두 번째 방식을, 단순하고 효율적인 조건 평가를 원한다면 첫 번째 방식을 선택하면 된다!


 

 

 

 

학습을 마치고

문제 하나를 푸는데 정확하게 이해하려고 하기에 예제도 많이 들고 풀이 과정이 정말 길었다. 이번 포스트에서는 두 문제를 푸는 것으로 끝마치기로 했다. 이 문제를 통해 그동안 개념적으로 알기는 하지만 잘 설명할 수 없었던 if와 switch 문의 차이점을 확실하게 이해할 수 있게 되었다.

역시 공부는 이렇게 깊이 있게 해야 한다는 걸 느끼는 시간이 되었다. 다음 문제도 계속해서 풀어보겠다.