Tech Trail

[정보처리기사 실기] Java 언어 프로그래밍 특강(6) 본문

Learning/정보처리기사

[정보처리기사 실기] Java 언어 프로그래밍 특강(6)

_밍지_ 2023. 11. 16. 16:43
728x90
반응형
SMALL

39번 문제

public class Test { 
    public static void main(String[] args) {
        int a = 2;
        int b = 2;
        int c = 2;
        
        System.out.println((a & b) > c ? 2.5 : 1);
    }
}
  1. int a = 2;, int b = 2;, int c = 2;는 각각 정수 변수 a, b, c를 2로 초기화합니다.
  2. (a & b)는 a와 b를 비트 단위로 AND 연산합니다. AND 연산 결과는 2가 되므로, (a & b)는 2입니다.
  3. (2 > 2)는 2가 2보다 큰지 비교하는 조건문입니다. 이 비교는 거짓(false)이므로 삼항 연산자의 두 번째 피연산자인 1.0이 출력됩니다.
1.0
 

Java에서 정수와 실수가 혼합되면 결과는 실수가 되며, 따라서 출력 값은 1.0이 됩니다.

(2.5도 어쨌든 연산자이고 실수니까!)

 

40번 문제

public class Spock {
    public static void main(String[] args) {
        int mask = 0;
        int count = 0;
        
        if (((5 < 7) || (++count < 10)) | mask++ < 10) mask = mask + 1;
        if (6 > 8 ^ false) mask = mask + 10;
        if (!(mask > 1) && ++count > 1) mask = mask + 100;

        System.out.println(mask + " " + count);
    }
}

1. 첫 번째 조건문 ((5 < 7) || (++count < 10))에서 5 < 7가 이미 참(True)이므로 || (OR) 연산자 다음에 있는 (++count < 10)는 더 이상 평가되지 않습니다. 그러나 | 연산자는 단락 회로 평가(short-circuit evaluation)를 수행하지 않기 때문에 mask++ < 10 조건도 평가됩니다.

  • mask는 현재 0이므로 mask++ < 10은 참(True)입니다. 따라서 mask는 1이 됩니다.
  • ((5 < 7) || (++count < 10))와 mask++ < 10은 모두 True이기 때문에 mask=mask+1이 실행되어 mask가 2가 됩니다.

2. 두 번째 조건문 6 > 8 ^ false에서 6 > 8은 거짓(False)이고, false와 XOR(^) 연산을 하면 결과는 거짓(False)입니다. 따라서 mask=mask+10은 수행되지 않습니다.

3. 세 번째 조건문 !(mask > 1) && ++count > 1에서 mask(2) > 1은 참(True)이지만 NOT 연산 !을 통해 거짓(False)이 됩니다. 이후 && 연산자 다음에 있는 ++count > 1은 평가되지 않습니다. 따라서 mask는 2이고, count는 0이 출력됩니다.

2 0

 

41번 문제

public class Test1 {
    public static void main(String[] args) {
        int a = 1, b = 2, c = 3, d = 4;
        if ((a == b) & (c++ != d) && (c++ < 6))
            c++;
        System.out.println(c);
    }
}
  1. 먼저, ab를 비교하는 조건 (a == b)가 거짓(False)입니다. 즉, a(1)b(2)는 같지 않습니다.
  2. 이후 & 비트 연산자는 단락 회로 평가(short-circuit evaluation)를 수행하지 않는 비트 연산자이므로 다음 조건인 (c++ != d)를 확인합니다. 이 조건은 참(True)입니다. 왜냐하면 c(3)와 d(4)는 서로 다른 값이기 때문에 c는 3에서 4로 증가합니다.
  3. 여기서 중요한 점은 이후 && 논리 연산자가 단락 회로 평가(short-circuit evaluation)를 수행한다는 것입니다. 따라서 (c++ < 6) 조건은 확인하지 않고 건너뛰게 됩니다.
  4. System.out.println(c);를 통해 변수 c의 값을 출력하면 4가 출력됩니다.
4
 

 

42번 문제

public class Test {
    int f(int k[]) { // k에 b가 들어가게 됨
        k[1] = k[1] + 4; // k[1] = 2 + 4 = 6
        return k[1] * 3;  // 6 * 3 =18
    }

    public static void main(String[] args) {
        int s;
        int a = 6;
        int b[] = {1, 2, 3, 4, 5};
        Test t = new Test();
        s = b[1] + t.f(b);  // f메서드 호출 ~ 위로 ㄱㄱ
        // 2 + 18 = 20
        System.out.println(s);
    }
}

1. int s;

: 정수형 변수 s를 선언합니다.

2. int a=6;

: 정수형 변수 a를 선언하고 6으로 초기화합니다.

3. int b[]={1, 2, 3, 4, 5};

: 정수형 배열 b를 선언하고 초기값을 주어 배열을 생성합니다.

4. Test t = new Test();

: Test 클래스의 객체 t를 생성합니다.

5. s = b[1] + t.f(b);

: 변수 sb[1]t.f(b)의 합을 대입합니다.

  • b[1]은 배열 b의 두 번째 요소인 2를 나타냅니다.
  • t.f(b)Test 클래스의 메서드 f를 호출하며, 배열 b를 매개변수로 전달합니다. 매개변수로 전달된 배열 b의 두 번째 요소인 b[1]에 4를 더하면 k[1] (메서드 내에서 k 배열은 b 배열을 가리킴)의 값은 6이 됩니다. 그리고 이 결과값에 3을 곱한 후 반환하면, 최종적으로 t.f(b)(2 + 4) * 3 즉, 18을 반환하게 됩니다. 이렇게 반환된 값이 b[1]과 더해져서 변수 s에 저장됩니다.

6. System.out.println(s);

: 변수 s의 값을 출력합니다. 이 때, s는 2와 18의 합인 20이므로 20이 출력됩니다.

 

43번 문제

public class Wind {
    public static void main(String[] args) {
        foreach:
        for (int j = 0; j < 5; j++) {
            for (int k = 0; k < 3; k++) {
                System.out.print(" " + j);
                if (j == 3 && k == 1)
                    break foreach;
                if (j == 0 || j == 2)
                    break;
            }
        }
    }
}

이 코드는 중첩된 반복문을 사용하여 숫자를 출력하고, 특정 조건에서 레이블을 사용하여 외부 반복문을 종료시키는 문제입니다.

  1. 바깥쪽 for 문은 j를 0부터 4까지 증가시키며 반복합니다.
  2. 안쪽 for 문은 k를 0부터 2까지 증가시키며 반복합니다.
  3. 각 반복에서 현재 j 값을 출력하고, 출력 결과에 공백과 함께 추가합니다.
  4. 이후 첫 번째 if 문에서 j가 3이고 k가 1인 경우, break foreach; 문을 통해 외부 반복문을 종료합니다. 이 경우 foreach: 레이블을 사용하여 외부 반복문을 참조합니다.
  5. 두 번째 if 문에서 j가 0이거나 2인 경우, break; 문을 통해 현재 내부 반복문을 종료합니다.
  6. 결과적으로 출력 결과는 0 1 1 1 2 3 3입니다.
0 1 1 1 2 3 3
 

<과정>

1. 바깥쪽 for 문 (외부 반복문) 시작:

  • j는 초기에 0입니다.

안쪽 for 문 (내부 반복문) 시작:

  • k는 초기에 0입니다.

System.out.print(" " + j); 문장 실행:

  • 현재 j의 값인 0을 출력합니다. 출력 결과는 "0"입니다.

2. 첫 번째 if 문 체크:

  • j가 3이 아니므로 첫 번째 if 문은 건너뜁니다.

두 번째 if 문 체크:

  • j가 0이므로 두 번째 if 문이 참(True)입니다.
  • 따라서 내부 반복문(k for문)을 종료(Break)하고 j for 문으로 올라갑니다.
  • j가 1이 됩니다. 다시 k가 0으로 초기화됩니다.
  • j를 출력하니까 1이 출력됩니다.

3. 첫 번째 if 문 체크:

  • j가 3이 아니므로 첫 번째 if 문은 건너뜁니다.

두 번째 if 문 체크:

  • j가 0도 아니고 2도 아니므로 두 번째 if 문 역시 건너뜁니다. k for 문으로 올라갑니다.
  • k가 1이 됩니다.
  • j를 출력하니까 1이 출력됩니다.

4. 첫 번째 if 문 체크:

  • j가 3이 아니므로 첫 번째 if 문은 건너뜁니다.

두 번째 if 문 체크:

  • j가 0도 아니고 2도 아니므로 두 번째 if 문 역시 건너뜁니다. k for 문으로 올라갑니다.
  • k가 2가 됩니다.
  • j를 출력하니까 1이 출력됩니다.

5. 첫 번째 if 문 체크:

  • j가 3이 아니므로 첫 번째 if 문은 건너뜁니다.

두 번째 if 문 체크:

  • j가 0도 아니고 2도 아니므로 두 번째 if 문 역시 건너뜁니다. k for 문으로 올라갑니다.
  • k가 3이 됩니다.
  • k<3 조건에 만족하지 않습니다. 따라서 내부 반복문을 종료하고 j for 문으로 올라갑니다.
  • j가 2가 됩니다. 다시 k가 0으로 초기화됩니다.
  • j를 출력하니까 2가 출력됩니다.

6. 첫 번째 if 문 체크:

  • j가 3이 아니므로 첫 번째 if 문은 건너뜁니다.

두 번째 if 문 체크:

  • j가 2이므로 두 번째 if 문이 참(True)입니다.
  • 따라서 내부 반복문(k for문)을 종료(Break)하고 j for 문으로 올라갑니다.
  • j가 3이 됩니다. 다시 k가 0으로 초기화됩니다.
  • j를 출력하니까 3이 출력됩니다.

7. 첫 번째 if 문 체크:

  • j가 3이지만, k가 1이 아니므로 첫 번째 if 문은 건너뜁니다.

두 번째 if 문 체크:

  • j가 0도 아니고 2도 아니므로 두 번째 if 문 역시 건너뜁니다. k for 문으로 올라갑니다.
  • k가 1이 됩니다.
  • j를 출력하니까 3이 출력됩니다.

8. 첫 번째 if 문 체크:

  • j가 3, k가 1이므로 break foreach가 수행됩니다. 이중 for문을 빠져나옵니다.

 

 

 

💡 이 게시글은 PC 환경에 최적화하여 작성되었습니다.

💡 위 내용은 에듀윌에서 무료로 제공한 '정보처리기사 비밀 언어 특강' 문제를 직접 풀고 정리한 것입니다.

틀린 부분이 있다면 언제든 댓글 남겨주세요 :)

💡정보처리기사 실기 시험을 준비하시는 분들께는 아래 링크에서 해당 강의를 먼저 듣는 것을 권장합니다.

IT 자격증 1위 에듀윌 (eduwill.net)

728x90
반응형
LIST