트랙(++,--연습문제,,마지막 enum,중간에 찜찜 1개 근데 패스)

류한선·2025년 6월 24일

실기연습-2

목록 보기
34/95

좋아요! 🔥
정보처리기사 실기에서 코드 트릭 문제들은 단순히 출력값만 묻는 것처럼 보이지만, 미묘한 연산자 우선순위, 자료형, 전위/후위 연산자, static 동작, 상속 트릭 등등을 섞습니다.

여기에 그런 함정 문제 하나를 Java로 내고, 이어서 풀이와 한 줄 한 줄 완전 디버깅식 해설까지 보여드릴게요.


💡 문제

다음 Java 코드를 보고 출력값을 구해보세요.

class Trick {
    static int num = 10;
    int val = 5;

    Trick() {
        num += val++;
    }

    void calc() {
        val += ++num + num++ + --val;
    }
}

public class Test {
    public static void main(String[] args) {
        Trick t1 = new Trick();
        Trick t2 = new Trick();
        t2.calc();
        System.out.println("num = " + Trick.num + ", val = " + t2.val);
    }
}

🎯 출력 예상값

한번 생각해보세요! 🤔 정답을 도출해보셔야 합니다.
정답: num = ? , val = ?


🧠 풀이 및 디버깅식 한 줄 한 줄 해설

이제 코드를 한 줄씩 디버깅하면서 풀이해봅시다.
중간중간 “지금 이 타이밍에서 무슨 일이 일어나는지” 반드시 짚을 거예요.


1) 클래스 정의

class Trick {
    static int num = 10;
    int val = 5;
  • numstatic 필드라 클래스당 하나만 존재.
  • val은 인스턴스마다 별도로 존재. 초기값 5.

지금 상태:

Trick.num = 10
(각 인스턴스).val = 5

2) 생성자

    Trick() {
        num += val++;
    }
  • num += val++에서 val++후위 증가.
    → 현재 val을 우선 사용하고(우변에 대입), 이후 val를 +1.

  • 동작:

    1. num += val++ → 현재 num 값에 현재 val 값(5)을 더하고, val를 1 증가.
    2. 끝나면 val = 6이 됨.

3) calc 메서드

    void calc() {
        val += ++num + num++ + --val;
    }

여기 트릭:

  • ++num: num를 우선 증가 후 반환.
  • num++: num를 반환 후 증가.
  • --val: val를 우선 감소 후 반환.

4) main 메서드 시작

Trick t1 = new Trick();

t1 생성 시:

  • 생성자 호출: num(10) += val(5), val++ → num = 10+5 = 15, val = 6
  • 결과:
Trick.num = 15
t1.val = 6

5) Trick t2 = new Trick();

t2 생성 시:

  • 현재 num=15
  • t2.val 초기값 = 5
  • 생성자: num += t2.val++ = num += 5 = 20, t2.val = 6
  • 결과:
Trick.num = 20
t2.val = 6
t1.val = 6 (영향 없음)

6) t2.calc(); 호출

이 부분에서 가장 트리키하죠!

메서드:

val += ++num + num++ + --val;

현재 상태:

num = 20
t2.val = 6

이 줄을 계산할 때 반드시 왼쪽에서 오른쪽 평가 순서를 기억합시다.

  1. ++num: num 1 증가 후 반환
    → num = 21, 반환값 = 21

  2. num++: 반환값 num(21) 후 증가
    → 반환값 = 21, num = 22

  3. --val: val 1 감소 후 반환
    → val = 6-1 = 5, 반환값 = 5

이들의 합:

++num + num++ + --val = 21 + 21 + 5 = 47

이제 val += 47 연산

  • 현재 t2.val = 5
  • val += 47 → t2.val = 52

num 최종 상태 = 22


7) 출력

System.out.println("num = " + Trick.num + ", val = " + t2.val);

최종적으로:

num = 22, val = 52

✅ 정답

num = 22, val = 52

🎯 트릭 포인트 정리

static 필드의 공유성
✅ 후위/전위 연산자 혼용
✅ 연산자 평가 순서(왼쪽 → 오른쪽)
✅ 한 줄에서 여러 연산자 사용할 때 값 변화를 단계별 추적


좋아요! 🎉 이번에는 C 언어Python에서 각각 트릭 문제를 하나씩 내고 풀이해 드릴게요.
이렇게 다양한 언어의 트릭을 연습해 두시면 정보처리기사 실기에서 나오는 혼동 유발 문제들에 대비하기 좋아요!


🧩 트릭 문제 (C언어)

📜 문제

다음 C 코드의 출력값을 구해보세요.

#include <stdio.h>

int x = 10;

int func(int arr[], int *p) {
    *p += arr[2]--;
    return arr[2]++ + --*p;
}

int main() {
    int a[3] = {1,2,3};
    int y = x;
    y += func(a, &x);
    printf("x=%d y=%d a[2]=%d\n", x, y, a[2]);
    return 0;
}

🧠 디버깅식 풀이 (한 줄 한 줄)

초기 상태:

x = 10
a = {1,2,3}
y = x = 10

func(a, &x); 호출:

파라미터: arr = a, p = &x

함수 내부:

  1. *p += arr[2]--;

    • arr[2]--: 후위 감소 → 반환값 = 3, a[2]가 2로 바뀜
    • *p += 3 → x = 10 + 3 = 13
  2. return arr[2]++ + --*p;

    • 현재 arr[2] = 2, 후위 증가이므로 반환값 = 2, a[2] = 3(후에 증가됨)
    • --*p: x = x-1 = 12 반환값 = 12
    • 최종 return = 2 + 12 = 14

반환값 받기:

  • func() 호출 후 a[2] = 3, x = 12
  • y += 14 → y = 10 + 14 = 24

출력:

x=12 y=24 a[2]=3

🧩 트릭 문제 (Python)

📜 문제

다음 Python 코드를 보세요.

x = [1,2,3]

def func(x):
    x += [4]
    return sum(x) + len(x)

res = func(x)
print(res, x)

🧠 디버깅식 풀이

상태 초기화:

x = [1,2,3]

func(x) 호출:

  • func 안에서 x += [4]:
    → 리스트의 += 연산자는 원본을 수정합니다.
    → x = [1,2,3,4] (리턴하지 않고 내부 수정됨)

  • sum(x) + len(x) = sum([1,2,3,4]) + 4 = (10) + 4 = 14

반환값 받기:

res = 14

함수 호출 후 x 상태:

x = [1,2,3,4]

출력:

14 [1, 2, 3, 4]

좋아요! 🎯
이번에는 Java의 enum 트릭 문제를 하나 내보고, 이어서 enum이 뭔지, 어디에 쓰이는지, 어떻게 사용하는지를 아주 자세히 알려드릴게요.


🧩 트릭 문제 (Java enum)

아래 코드를 보세요. 출력값을 유추해보세요.

enum Color {
    RED(10), GREEN(20), BLUE(30);

    private int value;

    Color(int value) {
        this.value = value;
    }

    int getValue() {
        return value;
    }
}

public class TestEnum {
    public static void main(String[] args) {
        Color c1 = Color.RED;
        Color c2 = Color.BLUE;
        System.out.println(c1.ordinal() + c2.ordinal());
        System.out.println(c1.getValue() + c2.getValue());
        System.out.println(c1.name() + c2.name());
    }
}

🧠 디버깅식 풀이

📍 enum 내부

enum Color {
    RED(10), GREEN(20), BLUE(30); 
    // 생성자 호출되며 각 상수에 value가 할당됨.

    private int value;

    Color(int value) {
        this.value = value;
    }

    int getValue() { return value; }
}

여기서:

  • RED.ordinal() == 0, GREEN.ordinal() == 1, BLUE.ordinal() == 2
    ordinal()은 **열거 상수의 선언된 순서(0부터 시작)**를 반환.
  • getValue()는 우리가 생성자에서 지정한 value를 반환.
  • name()은 상수 이름(문자열)을 반환.

📍 main 분석

Color c1 = Color.RED;    // ordinal() == 0, value == 10
Color c2 = Color.BLUE;   // ordinal() == 2, value == 30

// 출력 1
c1.ordinal() + c2.ordinal() = 0 + 2 = 2

// 출력 2
c1.getValue() + c2.getValue() = 10 + 30 = 40

// 출력 3
c1.name() + c2.name() = "RED" + "BLUE" = "REDBLUE"

🎯 정답 출력

2
40
REDBLUE

🔍 enum이란?

enum(열거형)

  • 미리 정해진 상수 집합을 하나의 타입으로 묶어서 정의.
  • 요일, 색상, 계절, 메뉴 옵션 같이 정해진 값만 허용할 때 유용.
  • 클래스처럼 생성자, 필드, 메서드를 가질 수 있음.

🧠 enum의 용도

  1. 코드의 안전성 향상
    → 상수를 intString 대신 enum으로 쓰면 잘못된 값 대입을 컴파일 단계에서 잡을 수 있음.
  2. 가독성 증가
    → 코드가 의미를 드러냄(Color.RED), 하드코딩된 숫자 대신 사용.
  3. 메서드를 포함할 수 있음
    → 상수마다 다른 동작을 하도록 오버라이드하거나, 위 예제처럼 생성자 + 필드를 둘 수 있음.

🧠 사용방법 요약

  1. 선언:

    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
  2. 사용:

    Day today = Day.MON;
    System.out.println(today);        // MON
    System.out.println(today.ordinal()); // 0
  3. 생성자/메서드 추가:

    enum Priority {
        LOW(1), MEDIUM(2), HIGH(3);
        private final int level;
        Priority(int level) { this.level = level; }
        public int getLevel() { return level; }
    }
  4. switch문에도 쓸 수 있음:

    switch (today) {
        case MON -> System.out.println("Monday");
        // ...
    }

0개의 댓글