좋아요! 🔥
정보처리기사 실기에서 코드 트릭 문제들은 단순히 출력값만 묻는 것처럼 보이지만, 미묘한 연산자 우선순위, 자료형, 전위/후위 연산자, 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 = ?
이제 코드를 한 줄씩 디버깅하면서 풀이해봅시다.
중간중간 “지금 이 타이밍에서 무슨 일이 일어나는지” 반드시 짚을 거예요.
class Trick {
static int num = 10;
int val = 5;
num은 static 필드라 클래스당 하나만 존재.val은 인스턴스마다 별도로 존재. 초기값 5.지금 상태:
Trick.num = 10
(각 인스턴스).val = 5
Trick() {
num += val++;
}
num += val++에서 val++은 후위 증가.
→ 현재 val을 우선 사용하고(우변에 대입), 이후 val를 +1.
동작:
num += val++ → 현재 num 값에 현재 val 값(5)을 더하고, val를 1 증가. void calc() {
val += ++num + num++ + --val;
}
여기 트릭:
++num: num를 우선 증가 후 반환.num++: num를 반환 후 증가.--val: val를 우선 감소 후 반환.Trick t1 = new Trick();
t1 생성 시:Trick.num = 15
t1.val = 6
Trick t2 = new Trick();t2 생성 시:Trick.num = 20
t2.val = 6
t1.val = 6 (영향 없음)
t2.calc(); 호출이 부분에서 가장 트리키하죠!
메서드:
val += ++num + num++ + --val;
num = 20
t2.val = 6
이 줄을 계산할 때 반드시 왼쪽에서 오른쪽 평가 순서를 기억합시다.
++num: num 1 증가 후 반환
→ num = 21, 반환값 = 21
num++: 반환값 num(21) 후 증가
→ 반환값 = 21, num = 22
--val: val 1 감소 후 반환
→ val = 6-1 = 5, 반환값 = 5
++num + num++ + --val = 21 + 21 + 5 = 47
val += 47 연산System.out.println("num = " + Trick.num + ", val = " + t2.val);
최종적으로:
num = 22, val = 52
num = 22, val = 52
✅ static 필드의 공유성
✅ 후위/전위 연산자 혼용
✅ 연산자 평가 순서(왼쪽 → 오른쪽)
✅ 한 줄에서 여러 연산자 사용할 때 값 변화를 단계별 추적
좋아요! 🎉 이번에는 C 언어와 Python에서 각각 트릭 문제를 하나씩 내고 풀이해 드릴게요.
이렇게 다양한 언어의 트릭을 연습해 두시면 정보처리기사 실기에서 나오는 혼동 유발 문제들에 대비하기 좋아요!
다음 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
함수 내부:
*p += arr[2]--;
arr[2]--: 후위 감소 → 반환값 = 3, a[2]가 2로 바뀜*p += 3 → x = 10 + 3 = 13return arr[2]++ + --*p;
--*p: x = x-1 = 12 반환값 = 12x=12 y=24 a[2]=3
다음 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 = [1,2,3,4]
14 [1, 2, 3, 4]
좋아요! 🎯
이번에는 Java의 enum 트릭 문제를 하나 내보고, 이어서 enum이 뭔지, 어디에 쓰이는지, 어떻게 사용하는지를 아주 자세히 알려드릴게요.
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() == 2ordinal()은 **열거 상수의 선언된 순서(0부터 시작)**를 반환.getValue()는 우리가 생성자에서 지정한 value를 반환.name()은 상수 이름(문자열)을 반환.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의 용도int나 String 대신 enum으로 쓰면 잘못된 값 대입을 컴파일 단계에서 잡을 수 있음.Color.RED), 하드코딩된 숫자 대신 사용.선언:
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
사용:
Day today = Day.MON;
System.out.println(today); // MON
System.out.println(today.ordinal()); // 0
생성자/메서드 추가:
enum Priority {
LOW(1), MEDIUM(2), HIGH(3);
private final int level;
Priority(int level) { this.level = level; }
public int getLevel() { return level; }
}
switch문에도 쓸 수 있음:
switch (today) {
case MON -> System.out.println("Monday");
// ...
}