static 은 하나뿐이고, 예외는 catch 로 뛰고 finally 는 무조건이며, == 는 주소이고 참조 복사는 같은 집이다
왜 이 장을 하나
상속 밖의 Java 함정 넷이다. static 은 클래스에 하나라 모든 객체가 공유하고, 예외가 나면 그 줄에서 catch 로 뛰고 finally 는 언제나 돈다. == 는 주소 비교라 new 한 문자열끼리는 false 이고, 배열 · 객체를 대입하면 같은 것을 가리킨다. 17문항이 이 넷과 문자열 연결 · 재귀 · 람다 · enum 으로 나뉜다.
다루는 것static · 예외 흐름 · == 와 equals · 참조 복사 · 문자열 연결 · 재귀 · 람다 · enum
문항기출 17 · 예상 4 · 훈련 20
끝나면== 를 보면 주소인지 값인지 먼저 묻는다
01왜 이 장인가
왜 이걸 하나 — Java 34문항 중 17문항이 이 장이고, 2024년 3회 · 2025년 2회에는 3문항씩 나왔다.
11회분 220문항 중 이 장의 기출은 17문항이다. 11회 중 10회에 나왔고(2023년 3회만 빠짐 — 그 회차의 컴파일 오류 문제가 여기 있다), 2025년 이후 람다 · enum · 제네릭 같은 새 문법이 섞이기 시작했다. 훈련 Java 20문항이 붙는다.
꼴
몇 문항
무엇을 적나
보기
static · 싱글톤
3
공유되는 값 · 컴파일 오류 줄
2023-1회 1번 · 2023-3회 12번 · 2024-1회 1번
예외 흐름
3
catch 선택 · finally · 람다 안의 throw
2024-3회 16번 · 2025-1회 5번 · 2025-2회 9번
== · equals · 참조
5
문자열 비교 · 배열 참조 · 객체 배열 교환
2023-2회 8번 · 2024-2회 1번 · 2024-3회 1번 · 2025-2회 5번 · 15번
문자열 · 배열 처리
3
split · charAt · 재귀 역순 중복 제거 · 연결 순서
2024-2회 17번 · 20번 · 2026-1회 17번
재귀 · enum
3
음수까지 내려가는 재귀 · 이분 재귀 · enum values
2025-1회 16번 · 2025-3회 5번 · 2026-2회 14번
→ == 와 참조가 5문항으로 가장 많다. new 한 것끼리 == 는 false(2024년 2회 1번 NNN), 리터럴끼리는 true(2023년 2회 8번), 배열 · 객체는 대입하면 같은 집(2025년 2회 5번 · 15번) — 세 문장이 이 다섯을 다 푼다.
E01 진단의 14번(compute(5) → 1)이 이 장이다. 종료 조건이 num <= 1 이라 음수까지 내려가는 재귀였고, 「종료 조건에서 무엇을 돌려주나」를 안 보면 답이 바뀐다. 실무에서는 안 쓰는 꼴이지만 시험은 이런 자리를 고른다.
문항 수는 이 노트의 문제 데이터에서 ch=E06 인 것을 센 값이다(2026-09-14). 기출 코드는 grandlife.co.kr 복원에서 옮겼고, 17문항 전부 JDK 17 로 실행하거나 컴파일해 정답을 확인했다. 컴파일 오류 문제(2023-3회 12번)는 javac 가 7번 줄에서 오류를 내는 것을 확인했다.
02한눈에
왜 이걸 하나 — 시험 전날 규칙 9개를 다시 본다.
static클래스에 하나. 모든 객체가 공유하고 클래스명.변수 로도 접근. static 메서드에서 인스턴스 변수를 직접 쓰면 컴파일 오류. 싱글톤은 static 인스턴스 하나를 getInstance 로 돌려준다.
예외 흐름예외가 난 줄에서 멈추고 try 의 나머지는 건너뛴다. catch 는 위에서부터 맞는 첫 것(자식 예외를 위에). finally 는 return 이 있어도 무조건. 예외 전에 찍힌 출력은 남는다.
== 와 equals== 는 주소(같은 객체인가), equals 는 내용. 문자열 리터럴 "A" == "A" 는 같은 상수라 true, new String("A") == new String("A") 는 false. 내용 비교는 equals.
참조 복사int[] b = a; 는 같은 배열. b[0] = 9 면 a[0] 도 9. a.clone() 은 새 배열. 객체도 같다 — 메서드 안에서 words[0] = label 은 밖에 반영, label = "Z" 는 지역 참조만 바뀜.
문자열 연결+ 는 왼쪽부터. 숫자 + 숫자는 덧셈, 문자열이 한 번 끼면 그 뒤는 전부 연결. 9 + 2 + "2" + "3" = "1123". char + int 는 숫자.
재귀종료 조건이 돌려주는 값을 그대로 쓴다(num <= 1 이면 음수도 반환). 두 갈래 재귀는 표로 아래부터. 출력이 재귀 호출 앞이면 들어가며, 뒤면 되감으며 찍힌다.
람다 · 인터페이스value -> value + 9 는 함수형 인터페이스의 추상 메서드를 즉석 구현. 람다 안에서 던진 예외는 부른 쪽의 catch 로 간다.
enum정해진 상수 목록. values() 는 전체 배열(선언 순서), ordinal() 은 0부터 순번, name() 은 이름 문자열. 생성자로 값을 붙일 수 있다.
03밑바닥
왜 이걸 하나 — 규칙 9개는 「무엇이 하나이고 무엇이 여럿인가」로 묶인다. static 은 하나, 참조가 가리키는 집도 하나, 문자열 리터럴도 하나.
3-1. static 은 클래스에 하나라 모두가 같은 값을 본다
static int count 는 객체마다가 아니라 클래스에 하나다. 2023년 1회 1번에서 StaticData.count = value 로 10 을 넣고, StaticData.count++ 는 10 을 찍은 뒤 11 이 되며, item.count 는 같은 static 이라 11 이다. 지역변수 value 는 10 그대로, 인스턴스 필드 item.value 는 20 → 네 줄이 10 · 11 · 10 · 20.
static 메서드는 객체 없이 도는 것이라 그 안에서 인스턴스 필드를 직접 쓸 수 없다. 2023년 3회 12번의 public static String getName() { return name; } 이 7번 줄에서 컴파일 오류인 이유다(non-static variable name cannot be referenced from a static context). 싱글톤(2024년 1회 1번)은 static 인스턴스 하나를 getInstance 로 돌려주므로 a 와 b 가 같은 객체라 add 네 번이 전부 한 value 에 쌓여 4 다.
3-2. 예외는 뛰고, finally 는 언제나
try 안에서 예외가 나면 그 줄에서 멈추고 아래 catch 중 맞는 첫 것으로 뛴다. 2025년 1회 5번은 number / divisor 에서 ArithmeticException 이 나 첫 catch 의 출력1 을 찍고, finally 의 출력5 를 찍는다 — 출력2 · 출력4 는 안 찍힌다. catch 는 위에서부터 보므로 자식 예외를 위에 둔다.
2024년 3회 16번은 fail() 이 NullPointerException 을 던져 첫 catch 에서 +1, finally 에서 +100 → 101. Exception catch 는 첫 것이 잡았으니 건너뛴다. 2025년 2회 9번은 람다 안의 throw 가 run 의 catch 로 잡혀 7, 두 번째 람다는 3 + 9 = 12, 합 19 — 람다도 결국 메서드 호출이라 예외는 부른 쪽으로 올라간다.
3-3. == 는 같은 집인가를 묻는다
Java 의 참조 변수는 집 주소를 든 쪽지다. == 는 두 쪽지에 같은 주소가 적혔는지를 묻고, equals 는 그 집의 내용이 같은지를 묻는다. 2024년 2회 1번은 new 로 만든 두 KOREA 가 다른 집이라 N, c 는 a 의 쪽지를 복사한 것이라 같은 집인데 b == c 를 물어 N, 세 번째도 새 집이라 N → NNN.
리터럴은 다르다. "Programming" 을 두 변수에 적으면 상수 풀의 같은 집이라 == 도 true 이고, new 로 만든 셋째와는 false, equals 는 셋 다 true(2023년 2회 8번, true false true true). 2024년 3회 1번은 equals 로 인접한 두 단어를 비교해 같으면 O, 다르면 A 를 찍어 OOAAA 다.
배열과 객체도 쪽지다. 2025년 2회 5번의 change 는 words[0] 을 바꿔 원본 배열의 첫 칸이 B 가 되지만, label = "Z" 는 지역 쪽지만 바꾼 것이라 밖의 label 은 B 그대로 → BB. 2025년 2회 15번은 배열 칸의 쪽지를 바꾼 뒤 boxes[1].value = boxes[0].value 로 b 의 값을 3 으로 만들어 a · b · c 가 1 · 3 · 3, 출력 1a3b3.
3-4. 문자열 연결은 왼쪽부터이고, 재귀는 종료 조건이 답을 정한다
+ 는 왼쪽부터 계산한다. 숫자끼리는 더하고, 문자열이 한 번 끼면 그 뒤로는 전부 이어 붙인다. 2026년 1회 17번의 9 + 2 + "2" + "3" 은 11 → "112" → "1123" 이고, a + b + "결과" + a + b 는 8결과53(예상 1회 8번)이다. 괄호가 없으면 왼쪽부터라는 것만 지키면 된다.
2024년 2회 17번은 재귀로 문자열을 뒤에서부터 보며 처음 나온 글자만 남긴다(되감으며 앞에 붙이므로 dcba). 2025년 1회 16번은 배열을 반씩 나눠 가운데 값을 더하는 이분 재귀라 표를 아래부터 채워 20 이다. 2026년 2회 14번은 num <= 1 에서 num 을 그대로 돌려주므로 compute(−1) = −1 이 위로 올라와 1 이 된다 — 종료 조건이 0 이 아니라는 것을 놓치면 답이 바뀐다.
enum(2025년 3회 5번)은 values() 가 선언 순서의 배열이고 Word.B.name() 은 "B" 라 길이 1, values()[1] 은 B, getText 는 AB 다. 새 문법이 나와도 배열 첨자와 문자열 길이라는 옛 규칙으로 풀린다.
통과 기준은 넷이다. 첫째, static 이 하나라는 것을 두 객체 · 두 참조로 설명한다. 둘째, 예외가 난 줄부터 catch · finally 의 실행 순서를 적는다. 셋째, == 와 equals 를 「같은 집인가 · 같은 내용인가」로 가르고, 리터럴 · new · 대입 복사의 셋을 안다. 넷째, 문자열 연결 순서와 재귀의 종료 조건 반환값을 그대로 쓴다. 기출 17문항이 이 넷 안에 있다.
메서드 안에서 매개변수를 바꾸면 밖의 변수도 바뀐다.쪽지를 복사해 넘기는 것이라 label = "Z" 는 지역 쪽지만 바꾼다. 다만 쪽지가 가리키는 집의 내용(words[0] = label)을 바꾸면 밖에서도 보인다. 2025년 2회 5번의 BB 가 이 둘의 차이다.
재귀의 종료 조건은 언제나 0 을 돌려준다.코드에 적힌 것을 돌려준다. if (num <= 1) return num; 은 −1 이 오면 −1 을 돌려주고, 2026년 2회 14번의 답 1 은 그 −1 이 더해진 결과다.
04기출
왜 이걸 하나 — 코드를 보면서 쪽지와 집을 그리는 연습이다. == 가 보이면 그림부터 그린다.
변수는 쪽지, new 는 새 집으로 그린다. 예외 문제는 try 안의 줄에 번호를 붙이고 어느 번호에서 뛰는지 표시한다. 정답을 연 뒤 그림과 다른 자리가 규칙 9개 중 빠진 것이다.
2023-1회 · 1번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
class StaticData {
public int value = 20;
static int count = 0;
}
public class Main {
public static void main(String[] args) {
int value = 10;
StaticData.count = value;
StaticData item = new StaticData();
System.out.println(StaticData.count++);
System.out.println(item.count);
System.out.println(value);
System.out.print(item.value);
}
}
정답10 11 10 20
static 변수 b는 모든 객체가 공유하는 "공용 게시판"입니다. Static.b=a로 b=10이 되고, Static.b++는 10을 출력한 뒤 11로 증가. st.b는 같은 static이므로 11. 지역변수 a는 10, st.a는 인스턴스 변수 초기값 20. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「10111020」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-2회 · 8번Java
다음 Java 프로그램의 실행 결과를 줄마다 쓰시오.
public class Main {
public static void main(String[] args) {
String first = "Programming";
String second = "Programming";
String third = new String("Programming");
System.out.println(first == second);
System.out.println(first == third);
System.out.println(first.equals(third));
System.out.println(second.equals(third));
}
}
정답true false true true
리터럴 "Hello"는 문자열 풀에서 같은 집을 공유하므로 a==b는 true. new String은 새 집을 지으므로 주소 비교(==)는 false. equals는 내용 비교라 모두 true. "==는 주소, equals는 내용" — Java 최다 함정. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「truefalsetruetrue」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-3회 · 12번Java
다음 Java 코드에서 컴파일 오류가 발생하는 줄 번호를 쓰시오.
1 class Person {
2 private String name;
3 Person(String value) {
4 name = value;
5 }
6 public static String getName() {
7 return name;
8 }
9 public void print() {
10 System.out.println(name);
11 }
12 }
정답7번 줄
static 메서드는 "공용 게시판 담당자" — 객체가 없어도 실행되므로 특정 개인의 사물함(인스턴스 변수)에 접근할 수 없습니다. static에서 인스턴스 멤버 직접 접근 = 컴파일 오류. 확인 방법: javac 오류 줄 번호 7 확인. javac 가 7번 줄 return name; 에서 non-static variable name cannot be referenced from a static context 오류를 낸다 (JDK 17) 그랜드라이프 가답안 표기는 「7번 줄」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-1회 · 1번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
class Counter {
private static final Counter INSTANCE = new Counter();
private int value = 0;
private Counter() {
}
static Counter getInstance() {
return INSTANCE;
}
void add() {
value++;
}
int getValue() {
return value;
}
}
public class Main {
public static void main(String[] args) {
Counter a = Counter.getInstance();
Counter b = Counter.getInstance();
a.add();
b.add();
a.add();
b.add();
System.out.print(a.getValue());
}
}
정답4
싱글톤은 "회사 도장 1개" — getInstance()를 몇 번 불러도 같은 객체가 반환되므로 count는 하나의 객체에 계속 누적됩니다. 디자인 패턴이 코드 문제로 출제된 사례. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「4」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-2회 · 1번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
public static void main(String[] args) {
String a = new String("KOREA");
String b = new String("KOREA");
String c = a;
System.out.print(a == b ? "Y" : "N");
System.out.print(b == c ? "Y" : "N");
System.out.print(a == new String("KOREA") ? "Y" : "N");
}
}
정답NNN
배열의 ==는 "집 주소 비교"입니다. 내용물이 똑같아도 따로 지은 집(따로 생성된 배열)이면 주소가 다르므로 전부 false. 내용 비교는 Arrays.equals(). 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「NNN」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-2회 · 17번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
static String uniqueReverse(String value, int index) {
if (index < 0)
return "";
char current = value.charAt(index);
String rest = uniqueReverse(value, index - 1);
return rest.indexOf(current) >= 0 ? rest : current + rest;
}
public static void main(String[] args) {
String value = "abacad";
System.out.print(uniqueReverse(value, value.length() - 1));
}
}
정답dcba
재귀 = 러시아 인형. "먼저 끝까지 들어갔다가 닫으며 출력"인지 "들어가며 출력"인지 — 출력문이 재귀 호출 앞이냐 뒤냐가 순서를 결정합니다. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「dcba」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-2회 · 20번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
public static void main(String[] args) {
String value = "S/W/ENGINEER";
String[] words = value.split("/");
System.out.print(words[0]);
}
}
정답S
Java의 split("구분자")은 String 배열을 반환. arr[i].charAt(j)로 "i번째 조각의 j번째 글자"에 접근하는 2단 인덱싱이 포인트. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「S」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-3회 · 1번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
static String[] words = new String[3];
static void printWords(String[] values, int size) {
for (int i = 1; i < size; i++) {
System.out.print(values[i - 1].equals(values[i]) ? "O" : "N");
}
for (String value : values) {
System.out.print(value);
}
}
public static void main(String[] args) {
words[0] = "A";
words[1] = "A";
words[2] = new String("A");
printWords(words, 3);
}
}
정답OOAAA
equals()는 내용 비교이므로 정직하게 비교하면 됩니다(==였다면 함정). 배열 요소를 표로 적고 인접 쌍을 하나씩 대조. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「OOAAA」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-3회 · 16번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
public static void main(String[] args) {
int sum = 0;
try {
fail();
} catch (NullPointerException e) {
sum += 1;
} catch (Exception e) {
sum += 10;
} finally {
sum += 100;
}
System.out.print(sum);
}
static void fail() throws Exception {
throw new NullPointerException();
}
}
정답101
에어백 법칙: try에서 예외 발생 즉시 catch로 점프(그 아래 try 코드는 실행 안 됨), finally는 무조건 실행. return이 있어도 finally가 먼저 실행됩니다. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「101」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-1회 · 5번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
public static void main(String[] args) {
int number = 5;
int divisor = 0;
try {
System.out.print(number / divisor);
} catch (ArithmeticException e) {
System.out.print("출력1");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.print("출력2");
} catch (Exception e) {
System.out.print("출력4");
} finally {
System.out.print("출력5");
}
}
}
정답출력1출력5
예외 발생 즉시 try의 나머지는 건너뛰고, 일치하는 catch(자식 예외 우선)로 점프. 예외가 발생하기 전의 출력은 이미 찍혔다는 점을 놓치지 마세요. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「출력1출력5」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-1회 · 16번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
static int search(int[] data, int start, int end) {
if (start >= end)
return 0;
int middle = (start + end) / 2;
return data[middle] + Math.max(
search(data, start, middle),
search(data, middle + 1, end)
);
}
public static void main(String[] args) {
int[] data = {
3, 5, 8, 12, 17
};
System.out.println(search(data, 0, data.length - 1));
}
}
정답20
재귀는 종료 조건부터 확인 → 호출 트리를 그리며 "돌아오면서" 계산. 개념 1-4의 러시아 인형 원리 그대로. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「20」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-2회 · 5번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
static void change(String[] words, String label) {
words[0] = label;
label = "Z";
}
public static void main(String[] args) {
String[] words = {
"A"
};
String label = "B";
change(words, label);
System.out.print(words[0] + label);
}
}
정답BB
Java는 참조값을 복사해 전달 — 메서드 안에서 객체 내용 변경은 밖에 반영되지만, 참조 자체를 새 객체로 바꾸는 것은 반영 안 됨. 이 구분이 정답을 가릅니다. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「BB」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-2회 · 9번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
interface Operation {
int apply(int value) throws Exception;
}
static int run(Operation operation) {
try {
return operation.apply(3);
} catch (Exception e) {
return 7;
}
}
public static void main(String[] args) {
Operation first = value -> {
if (value > 2) {
throw new Exception();
}
return value * 2;
};
System.out.print(run(first) + run(value -> value + 9));
}
}
정답19
람다 (x) -> x + 1은 "이름 없는 즉석 함수". 함수형 인터페이스의 추상 메서드를 즉석에서 구현한 것으로 읽으면 일반 메서드 호출과 동일하게 추적됩니다. 2025년 신출 문법! 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「19」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-2회 · 15번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
static class Box {
int value;
Box(int value) {
this.value = value;
}
}
public static void main(String[] args) {
Box a = new Box(1);
Box b = new Box(2);
Box c = new Box(3);
Box[] boxes = {
a, b, c
};
Box temp = boxes[0];
boxes[0] = boxes[2];
boxes[2] = temp;
boxes[1].value = boxes[0].value;
System.out.print(a.value + "a" + b.value + "b" + c.value);
}
}
정답1a3b3
객체 배열에서 두 변수가 같은 객체를 가리키면 한쪽 수정이 다른 쪽에도 보입니다. "쪽지 복사 ≠ 집 복사" — 참조의 본질. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「1a3b3」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-3회 · 5번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
enum Word {
A("A"), B("AB"), C("ABC");
private final String text;
Word(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
public class Main {
public static void main(String[] args) {
Word w = Word.values()[Word.B.name().length()];
System.out.print(w.getText());
}
}
정답AB
enum = "정해진 선택지 목록"(요일, 등급 등). values()는 전체 배열, ordinal()은 순번(0부터), name()은 이름 문자열. 2025년 신출 문법. 복원된 코드를 JDK 17 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「AB」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-1회 · 17번Java
다음 Java 프로그램을 실행했을 때 출력되는 값을 쓰시오.
public class Main {
public static void main(String[] args) {
int x1 = 9;
int x2 = 2;
String x3 = "3";
System.out.println(x1 + x2 + "2" + x3);
}
}
정답1123
+ 는 왼쪽부터: 11(숫자 덧셈) → "11"+"2"="112"(문자열 연결 시작) → "112"+3="1123". 문자열을 만나는 순간부터 전부 연결 모드 — 2023년 1회 함정의 재림. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (JDK 17) 그랜드라이프 가답안 표기는 「1123」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-2회 · 14번Java
다음 Java 프로그램의 실행 결과를 쓰시오.
public class Main {
static int compute(int num) {
if (num <= 1) {
return num;
}
return compute(num - 1) + compute(num - 3);
}
public static void main(String[] args) {
System.out.print(compute(5));
}
}
정답1
기저 조건이 num <= 1 이라 0 과 음수도 그 값 그대로 돌려준다. compute(2) = compute(1)+compute(-1) = 1+(-1) = 0, compute(3) = compute(2)+compute(0) = 0, compute(4) = compute(3)+compute(1) = 1, compute(5) = compute(4)+compute(2) = 1. JDK 17 로 실행해 1 을 확인했다. 음수 인자가 0 이 아니라 음수를 돌려주는 것이 함정이다. 복원 출처는 grandlife.co.kr 2026-2회 복원 풀이(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·수치가 실제와 다를 수 있다.
arr[0]=1 출력 → arr[3]에서 예외 발생(출력 없음, arr[1]도 건너뜀) → catch "E" → finally는 무조건 "F" → 예외가 처리됐으므로 프로그램 계속 "G". 2024 3회 Q16·2025 1회 Q5와 동일 원리.
예상 1회 · 8번Java빈출 원리: 문자열 연결 순서
다음 코드의 출력을 쓰시오.
int a = 5, b = 3;
System.out.println(a + b + "결과" + a + b);
정답8결과53
+는 왼쪽부터: 5+3=8(아직 숫자) → 8+"결과"="8결과"(연결 모드 시작) → +5, +3은 전부 문자열 연결. 문자열을 만나기 전은 덧셈, 만난 후는 연결 — 2026 1회 Q17과 동일 함정.
예상 2회 · 1번Java빈출 원리: static 공유
다음 코드의 출력을 쓰시오.
class Counter {
static int total = 0;
int num;
Counter() { total++; num = total; }
}
public class Main {
public static void main(String[] args) {
Counter a = new Counter();
Counter b = new Counter();
Counter c = new Counter();
System.out.print(Counter.total + "" + a.num + b.num + c.num);
}
}
정답3123
static total은 "공용 게시판" — 객체 3개가 하나를 공유하며 1,2,3으로 증가(최종 3). num은 각자의 사물함이라 생성 순서대로 1,2,3. total + ""에서 문자열 연결 모드가 시작되어 "3"+"1"+"2"+"3". 2023 1회 Q1·2024 3회 Q6의 결합 유형.
예상 2회 · 5번Java빈출 원리: 배열 참조 공유 vs 복사
다음 코드의 출력을 쓰시오.
int[] a = {1, 2, 3};
int[] b = a;
b[0] = 9;
int[] c = a.clone();
c[1] = 8;
System.out.print(a[0] + "" + a[1] + a[2]);
정답923
b = a는 "같은 집을 가리키는 쪽지 복사" — b[0]=9는 a에도 반영. clone()은 "새 집 짓기" — c[1]=8은 a와 무관. 최종 a={9,2,3}. 2024 2회 Q1(배열 ==)·2025 2회 Q15와 같은 참조 원리.
05틀리는 자리
왜 이걸 하나 — 이 장은 줄바꿈과 순서에서 깎인다.
자리
새는 꼴
적는 법
기출
println
4줄 출력을 한 줄로
println 은 줄바꿈, print 는 이어짐. 문제가 「줄마다」라 하면 줄을 나눈다
2023-1회 1번 · 2023-2회 8번
== 리터럴
리터럴 == 를 false 로
같은 리터럴은 같은 상수 → true. new 끼리만 false
2023-2회 8번 · 2024-2회 1번
catch 순서
Exception catch 도 실행된다고 본다
맞는 첫 catch 하나만
2024-3회 16번 · 2025-1회 5번
finally
예외가 안 났으니 finally 를 뺀다
finally 는 언제나
2025-1회 5번
연결 순서
"2" 뒤의 3 을 더한다
문자열이 끼면 그 뒤는 전부 연결
2026-1회 17번 · 예상 1회 8번
종료 조건
음수 호출을 0 으로
코드가 돌려주는 값 그대로
2026-2회 14번
줄 번호
「7」만 적거나 다른 줄
문제가 「줄 번호」를 물으면 숫자, 정답표 표기가 「7번 줄」이면 그대로
2023-3회 12번
참조 교환
배열 칸을 바꾸면 a · b · c 변수도 바뀐다고 본다
변수는 그대로, 배열 칸의 쪽지만 바뀐다. 값을 바꾼 줄이 어느 객체인지 그림으로
2025-2회 15번
Java 출력 문제는 print 인지 println 인지가 줄 수를 정한다. 코드에서 println 을 세어 답의 줄 수와 맞춘다.
06훈련
왜 이걸 하나 — 규칙 9개를 짧은 코드 20개로 돌린다. Java 훈련의 3분의 2가 여기 있다.
훈련 20문항은 static 카운터, == 와 equals, StringBuilder, 정수 나눗셈, 예외 흐름, 배열 clone, switch, 문자열 연결, charAt · substring · split, 중첩 루프, 증감, 비트, 최댓값 탐색, 재귀 피보나치 · 역순, 2차원 배열, char + int, catch 선택이다. 정답은 전부 JDK 17 로 실행해 확인했다.
훈련 Java · 4번Javastatic 카운터
class C { static int cnt = 0; C() { cnt++; } }
public class Main {
public static void main(String[] args) {
new C(); new C(); new C();
System.out.print(C.cnt);
}
}
정답3
static = 공용 게시판. 객체 3개가 하나의 cnt를 공유하며 증가. 2023 3회·2025 1회 기출 유형.
훈련 Java · 6번JavaString == vs equals
String a = "Java";
String b = "Java";
String c = new String("Java");
System.out.print((a == b) + " " + (a == c) + " " + a.equals(c));
정답true false true
리터럴은 문자열 풀에서 같은 집 공유(true), new는 새 집(false), equals는 내용 비교(true). 2023 2회 기출 재훈련.
훈련 Java · 7번JavaStringBuilder 체인
StringBuilder sb = new StringBuilder("abc");
sb.append("de").reverse();
System.out.print(sb);
정답edcba
체인은 왼쪽부터: "abc"+"de"="abcde" → 뒤집기 "edcba". String과 달리 StringBuilder는 원본 자체가 변함.
훈련 Java · 8번Java정수 나눗셈 + 삼항
int a = 7, b = 2;
System.out.print(a / b + " " + a % b + " " + (a > b ? a - b : b - a));
x[2]에서 예외 → "T" 건너뜀 → catch "C" → finally "F" → 예외가 처리됐으니 계속 진행 "END".
훈련 Java · 10번Java배열 참조 vs clone
int[] a = {1, 2, 3};
int[] b = a;
b[0] = 9;
int[] c = a.clone();
c[2] = 7;
System.out.print(a[0] + "" + a[1] + a[2]);
정답923
b는 같은 집(b[0]=9가 a에 반영), c는 새 집(c[2]=7은 무관). a={9,2,3}.
훈련 Java · 11번Javaswitch fall-through (Java판)
int score = 75;
switch (score / 10) {
case 9: System.out.print("A");
case 8: System.out.print("B");
case 7: System.out.print("C");
case 6: System.out.print("D"); break;
default: System.out.print("F");
}
정답CD
75/10=7에 착지, break까지 흘러내려 C·D 출력. 2023 2회 C언어 fall-through와 동일 원리 — Java도 같습니다.
훈련 Java · 12번Java문자열 연결 순서
System.out.print(1 + 2 + "a" + 1 + 2);
정답3a12
왼쪽부터: 1+2=3(덧셈) → "a"를 만난 순간부터 연결 모드 → "3a"+"1"+"2". 2026 1회 Q17의 원형.
훈련 Java · 13번JavacharAt + 문자 연산
String s = "korea";
char c = s.charAt(1);
System.out.print((char)(c - 32) + "" + (char)(s.charAt(0) + 1));
정답Ol
'o'−32='O', 'k'+1='l'. (char) 캐스팅이 없으면 숫자로 출력된다는 것도 함께(J-26 참고).