본 보고서는 한국방송통신대학교 컴퓨터과학과 2학년 자바프로그래밍 과목의 기말결시 추가과제로 제출되는 사지선다 객관식 10문항 설계안이다. 자바의 핵심 개념인 인터페이스·다형성, 추상 클래스·익명 클래스, 예외 처리, 사용자 정의 예외, 컬렉션 프레임워크, 제네릭·람다·스트림, 입출력 처리를 다룬다. 방통대 교재의 10장, 11장, 12장의 순서대로 문항을 배치하였으며, 단순 암기 문항을 배제하고 코드 해석·실행 결과 예측·오류 분석 능력을 중점적으로 평가하도록 설계하였다. 10문항 중 6문항이 자바 코드 기반 문제이며, 5문항을 난이도 상으로 구성하였다.
1번 문항 — 인터페이스와 다형성 (교재 4.2~4.3절, 배점 3점)
장(또는 절) / 주제
교재 4.2~4.3절 / 인터페이스 정의와 다형적 참조
문제
다음 자바 코드의 실행 결과로 옳은 것은?
interface Movable {
default void move() { System.out.println("이동"); }
static void info() { System.out.println("이동 가능"); }
}
class Car implements Movable {
public void move() { System.out.println("자동차 주행"); }
}
public class Test {
public static void main(String[] args) {
Movable m = new Car();
m.move();
Movable.info();
}
}
선택지
- 이동 / 이동 가능
- 자동차 주행 / 이동 가능
- 자동차 주행 / 이동
- 컴파일 오류 발생
정답
2번
해설
인터페이스의 default 메서드는 구현 클래스에서 재정의(오버라이드) 가능하다. Car 클래스가 move()를 재정의하였으므로, 다형성에 의해 참조 변수 m의 타입이 Movable이어도 실제 객체인 Car의 move()가 호출된다. 반면 static 메서드는 인터페이스에 종속되며 인스턴스와 무관하게 인터페이스명으로 호출한다. 따라서 출력은 "자동차 주행" 다음 "이동 가능"이 된다. (출처: 방통대 자바프로그래밍 교재 4.2~4.3절)
출제 의도
인터페이스의 default 메서드 오버라이딩 가능 여부와 static 메서드 호출 방식, 그리고 다형성에 의한 동적 바인딩 개념을 종합적으로 이해하고 있는지 평가한다.
난이도 및 근거
난이도 중. 단일 개념이 아니라 default·static·다형성을 동시에 묻고, 출력 순서까지 정확히 추적해야 하므로 단순 암기로는 풀 수 없다.
오답 선택지 설계 근거
1번은 default 메서드가 항상 인터페이스 정의대로 실행된다고 오해하는 학습자를 유인한다. 3번은 static 메서드가 동적 바인딩된다고 잘못 알고 있는 경우를 잡아낸다. 4번은 default·static 키워드를 인터페이스에서 사용할 수 없다고 오해하는 경우(자바 8 이전 지식)를 점검한다.
2번 문항 — 추상 클래스와 익명 클래스 (교재 4.4~4.5절, 배점 4점)
장(또는 절) / 주제
교재 4.4~4.5절 / 추상 클래스의 인스턴스화와 익명 클래스
문제
다음 코드 중 컴파일 또는 실행 시 오류가 발생하는 부분은?
abstract class Shape {
abstract double area();
void print() { System.out.println("도형 출력"); }
}
public class Test {
public static void main(String[] args) {
Shape s1 = new Shape(); // (A)
Shape s2 = new Shape() { // (B)
double area() { return 3.14; }
};
s2.print(); // (C)
System.out.println(s2.area()); // (D)
}
}
선택지
- (A)
- (B)
- (C)
- (D)
정답
1번
해설
추상 클래스는 추상 메서드를 하나라도 포함하면 직접 인스턴스화할 수 없다. Shape은 추상 메서드 area()를 가지므로 new Shape()는 컴파일 오류이다. 반면 (B)는 추상 클래스를 익명 클래스로 구현하면서 area()를 정의하므로 합법이다. 익명 클래스로 만든 객체는 부모 타입 참조 변수에 할당되므로 (C)·(D)는 정상 실행된다. (출처: 방통대 자바프로그래밍 교재 4.4~4.5절)
출제 의도
추상 클래스를 직접 인스턴스화할 수 없다는 규칙과, 익명 클래스를 통해 추상 클래스를 즉석에서 구현하여 객체를 생성하는 문법을 구분할 수 있는지를 평가한다.
난이도 및 근거
난이도 중. 추상 클래스의 본질과 익명 클래스 문법을 동시에 이해해야 하며, (A)와 (B)의 시각적 유사성 때문에 신중한 비교가 필요하다.
오답 선택지 설계 근거
2번은 익명 클래스 문법 자체를 컴파일 오류로 오해하는 학습자를 유인한다. 3번은 추상 클래스의 일반 메서드는 익명 클래스 객체로 호출할 수 없다고 잘못 아는 경우를 점검한다. 4번은 익명 클래스에서 재정의한 메서드는 외부에서 호출할 수 없다고 오해하는 경우를 확인한다.
3번 문항 — 예외 처리와 try-catch-finally (교재 5.1~5.5절, 배점 4점)
장(또는 절) / 주제
교재 5.1~5.5절 / try-catch-finally 실행 흐름과 반환값
문제
다음 코드의 출력 결과로 옳은 것은?
public class Test {
static int run() {
try {
System.out.print("A");
return 1;
} catch (Exception e) {
System.out.print("B");
return 2;
} finally {
System.out.print("C");
}
}
public static void main(String[] args) {
System.out.println(run());
}
}
선택지
- AC1
- ABC1
- AC2
- ABCA1
정답
1번
해설
try 블록에서 예외가 발생하지 않으므로 "A"를 출력한 뒤 return 1을 평가한다. 그러나 return 직전에 finally 블록이 반드시 실행되어 "C"가 출력된다. finally에서 별도의 return이나 예외 발생이 없으면 원래 try의 반환값 1이 그대로 반환된다. 따라서 출력은 "AC" 다음 줄에 "1"이 찍혀 "AC1"이 된다. (출처: 방통대 자바프로그래밍 교재 5.3~5.4절)
출제 의도
finally 블록이 return 직전에 실행된다는 흐름과, 정상 흐름에서는 catch 블록이 실행되지 않는다는 점을 정확히 이해하고 있는지 평가한다.
난이도 및 근거
난이도 상. 출력 시점, return 평가 시점, finally 실행 시점을 모두 정확히 추적해야 하며, print와 println의 줄바꿈 차이까지 신경 써야 한다.
오답 선택지 설계 근거
2번은 finally 외에 catch까지 실행된다고 오해하는 경우를 점검한다. 3번은 finally의 return이 우선한다는 통념(여기서는 finally에 return이 없음)으로 인해 2가 반환된다고 잘못 추론하는 경우를 유인한다. 4번은 finally가 try 블록을 재실행한다는 잘못된 모델을 점검한다.
4번 문항 — 사용자 정의 예외 (교재 5.6절, 배점 4점)
장(또는 절) / 주제
교재 5.6절 / 사용자 정의 예외 클래스의 설계
문제
다음 사용자 정의 예외 클래스 설계에 대한 설명으로 옳지 않은 것은?
class InvalidAgeException extends Exception {
public InvalidAgeException(String msg) { super(msg); }
}
class Member {
void setAge(int age) throws InvalidAgeException {
if (age < 0) throw new InvalidAgeException("음수 불가");
}
}
선택지
InvalidAgeException은Exception을 상속하므로 검사 예외(checked exception)이다.setAge호출 측은 try-catch로 처리하거나 throws로 다시 전파해야 한다.RuntimeException을 상속하도록 변경하면 호출 측의 명시적 처리 의무가 사라진다.throw와throws는 동일한 키워드이므로 둘 중 어느 것을 써도 무방하다.
정답
4번
해설
throw는 예외 객체를 실제로 발생시키는 명령문에 사용하고, throws는 메서드 선언부에서 던질 수 있는 예외 타입을 명시할 때 사용한다. 둘은 철자도 다르고 의미·문법적 위치도 전혀 다르다. 1·2·3번은 자바의 예외 분류 체계와 일치하는 정확한 설명이다. (출처: 방통대 자바프로그래밍 교재 5.5~5.6절)
출제 의도
사용자 정의 예외 클래스의 상속 구조에 따른 검사·비검사 구분, 그리고 throw와 throws의 명확한 구분을 평가한다.
난이도 및 근거
난이도 중. 개념을 정확히 알면 어렵지 않지만, 키워드의 시각적 유사성과 한국어 번역(둘 다 "던지다") 때문에 실수가 잦은 영역이다.
오답 선택지 설계 근거
1번은 Exception 상속이 checked인지 unchecked인지 헷갈리는 학습자를 점검한다. 2번은 checked 예외의 처리 강제성을 묻는다. 3번은 RuntimeException 상속의 효과를 정확히 이해하는지 확인한다. 4번은 한국어 강의를 들을 때 흔히 발생하는 혼동을 의도적으로 정답으로 배치하였다.
5번 문항 — List 컬렉션 (교재 10장, 배점 4점)
장(또는 절) / 주제
교재 10장 / ArrayList와 LinkedList의 특성 비교
문제
다음 코드의 출력 결과로 옳은 것은?
import java.util.*;
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
list.remove(1);
list.add(1, 99);
System.out.println(list);
}
}
선택지
- [10, 20, 99, 30, 40]
- [10, 99, 30, 40]
- [10, 99, 20, 30, 40]
- [10, 30, 99, 40]
정답
2번
해설
list.remove(1)은 인덱스 1의 원소를 제거하는 메서드이며 정수 20이 삭제된다. 결과는 [10, 30, 40]이다. 이어서 list.add(1, 99)는 인덱스 1 위치에 99를 삽입하므로 [10, 99, 30, 40]이 된다. 만약 list.remove(Integer.valueOf(1))이었다면 값 1을 찾으려 했겠지만 본 코드에서는 인덱스로 동작한다. (출처: 방통대 자바프로그래밍 교재 10.2절)
출제 의도
List 인터페이스의 remove(int index)와 add(int index, E element) 메서드의 동작을 정확히 이해하고 있는지, 그리고 컬렉션 인덱스 변화를 단계적으로 추적할 수 있는지를 평가한다.
난이도 및 근거
난이도 중. remove(1)을 "값 1을 제거"로 오해하기 쉬운 함정이 있으며, 삽입 위치 인덱스의 의미를 정확히 알아야 한다.
오답 선택지 설계 근거
1번은 remove를 누락하고 add만 수행한 결과로, 메서드 호출 순서를 놓친 경우이다. 3번은 remove가 값 1을 찾는다고 오해(존재하지 않으므로 그대로)한 경우이다. 4번은 add의 인덱스를 끝에서부터 계산한 경우의 오답이다.
6번 문항 — Map 컬렉션 (교재 10장, 배점 4점)
장(또는 절) / 주제
교재 10장 / HashMap의 키 중복 처리
문제
다음 코드의 출력 결과로 옳은 것은?
import java.util.*;
public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("A", 3);
map.putIfAbsent("B", 99);
map.putIfAbsent("C", 4);
System.out.println(map.get("A") + map.get("B") + map.get("C"));
}
}
선택지
- 7
- 9
- 104
- 106
정답
2번
해설
put("A", 3)은 기존 키 "A"의 값을 1에서 3으로 덮어쓴다. putIfAbsent("B", 99)는 키 "B"가 이미 존재(값 2)하므로 무시된다. putIfAbsent("C", 4)는 키가 없으므로 4가 새로 들어간다. 최종적으로 A=3, B=2, C=4이며 정수 덧셈으로 3+2+4=9이다. 만약 문자열 연결이었다면 "324"가 되지만, map.get의 반환 타입이 Integer이고 + 양변이 정수이므로 산술 덧셈이 적용된다. (출처: 방통대 자바프로그래밍 교재 10.4절)
출제 의도
Map의 put과 putIfAbsent의 동작 차이, 그리고 자바 표현식에서 + 연산자가 피연산자 타입에 따라 산술 덧셈으로 동작하는 규칙을 함께 평가한다.
난이도 및 근거
난이도 상. put의 덮어쓰기, putIfAbsent의 조건부 삽입, 산술/문자열 연결 구분이 동시에 작용하며, 직관과 다른 결과(7이 아닌 9)를 도출해야 한다.
오답 선택지 설계 근거
1번은 put("A", 3)이 무시된다고 잘못 알아 1+2+4=7로 계산한 경우이다. 3번과 4번은 결과가 문자열 연결로 처리된다고 오해한 변형으로, 산술 vs 문자열 결합 구분을 점검한다.
7번 문항 — 제네릭과 와일드카드 (교재 11장, 배점 4점)
장(또는 절) / 주제
교재 11장 / 제네릭 타입과 와일드카드(? extends, ? super)
문제
다음 코드 중 컴파일 오류가 발생하는 줄은?
import java.util.*;
public class Test {
static double sum(List<? extends Number> list) { // 메서드 A
double s = 0;
for (Number n : list) s += n.doubleValue();
return s;
}
public static void main(String[] args) {
List<Integer> li = Arrays.asList(1, 2, 3);
List<Double> ld = Arrays.asList(1.0, 2.0);
System.out.println(sum(li)); // (1)
System.out.println(sum(ld)); // (2)
List<? extends Number> any = li;
any.add(10); // (3)
Number n = any.get(0); // (4)
}
}
선택지
- (1)
- (2)
- (3)
- (4)
정답
3번
해설
? extends Number 타입의 리스트는 "Number의 어떤 하위 타입"인지 알 수 없으므로 안전한 쓰기(add)가 금지된다. 즉 (3)은 컴파일 오류다(null만 예외적으로 허용). 반면 읽기(get)는 항상 Number로 안전하게 받을 수 있으므로 (4)는 정상이다. (1)과 (2)는 PECS 원칙(Producer-Extends, Consumer-Super)의 Producer 측 사용으로 합법이다. (출처: 방통대 자바프로그래밍 교재 11.2절)
출제 의도
제네릭 와일드카드의 읽기·쓰기 제약(PECS 원칙)을 코드 수준에서 이해하고 있는지를 평가한다.
난이도 및 근거
난이도 상. 와일드카드는 자바 학습자가 가장 헷갈려 하는 주제이며, 읽기는 허용되고 쓰기는 거부되는 비대칭적 규칙을 정확히 알아야 한다.
오답 선택지 설계 근거
1·2번은 List나 List을 ? extends Number 자리에 전달할 수 없다고 잘못 아는 경우를 점검한다. 4번은 get도 금지된다는 잘못된 모델을 검증한다.
8번 문항 — 람다와 스트림 (교재 11장, 배점 4점)
장(또는 절) / 주제
교재 11장 / 스트림 중간 연산과 최종 연산
문제
다음 코드의 출력 결과로 옳은 것은?
import java.util.*;
import java.util.stream.*;
public class Test {
public static void main(String[] args) {
int result = Stream.of(1, 2, 3, 4, 5)
.filter(n -> n % 2 == 1)
.mapToInt(Integer::intValue)
.map(n -> n * n)
.sum();
System.out.println(result);
}
}
선택지
- 9
- 25
- 35
- 55
정답
3번
해설
filter(n -> n % 2 == 1)는 홀수만 남기므로 1, 3, 5가 통과한다. mapToInt로 IntStream 변환 후 map(n -> n * n)이 각 원소를 제곱하여 1, 9, 25가 된다. sum()은 최종 연산으로 1+9+25=35를 반환한다. 짝수까지 더한 1+4+9+16+25=55(4번)나 마지막 값만 본 25(2번)는 함정이다. (출처: 방통대 자바프로그래밍 교재 11.5~11.6절)
출제 의도
filter·map·sum과 같은 스트림 파이프라인의 중간·최종 연산을 단계별로 추적하고, IntStream과 일반 Stream의 변환 시점을 이해하는지 평가한다.
난이도 및 근거
난이도 상. 다단계 함수형 파이프라인을 머릿속에서 시뮬레이션해야 하며, 각 연산이 어떤 원소를 통과시키는지 정확히 따져야 한다.
오답 선택지 설계 근거
1번은 첫 홀수의 제곱만 계산한 경우이다. 2번은 마지막 값에 안주한 경우이다. 4번은 filter를 누락하고 전체 원소를 제곱·합산한 경우로, filter 단계의 효과를 정확히 인식하는지 점검한다.
9번 문항 — 파일 입출력 (교재 12장, 배점 4점)
장(또는 절) / 주제
교재 12장 / 바이트 스트림과 문자 스트림의 구분
문제
다음 클래스 분류에 대한 설명으로 옳은 것은?
선택지
FileInputStream은 문자 스트림이고FileReader는 바이트 스트림이다.BufferedReader는Reader를 감싸 줄 단위 읽기(readLine)를 제공한다.FileWriter는 바이너리 데이터 저장에 적합하다.DataOutputStream은 텍스트 인코딩 변환을 자동 수행한다.
정답
2번
해설
자바 I/O는 8비트 단위의 바이트 스트림(InputStream/OutputStream 계열)과 16비트 문자 단위의 문자 스트림(Reader/Writer 계열)으로 나뉜다. BufferedReader는 Reader를 데코레이터 패턴으로 감싸 버퍼링과 readLine() 기능을 추가한다. FileInputStream은 바이트 스트림, FileReader는 문자 스트림이며, FileWriter는 텍스트용이다. DataOutputStream은 기본형 데이터를 바이너리로 직렬화하며 인코딩 변환과 무관하다. (출처: 방통대 자바프로그래밍 교재 12.1~12.3절)
출제 의도
자바 I/O의 두 축(바이트 vs 문자) 분류, 그리고 보조 스트림이 기본 스트림에 기능을 덧붙이는 데코레이터 구조를 이해하고 있는지를 평가한다.
난이도 및 근거
난이도 중. 클래스 이름의 유사성 때문에 분류를 헷갈리기 쉬우며, 단순 암기보다는 명명 규칙의 패턴(...Stream vs ...Reader/Writer)을 인식해야 한다.
오답 선택지 설계 근거
1번은 바이트와 문자 스트림 분류를 반대로 외운 경우이다. 3번은 문자 스트림과 바이너리의 적합성을 거꾸로 안 경우이다. 4번은 DataOutputStream이 텍스트와 무관함을 모르는 학습자를 점검한다.
10번 문항 — try-with-resources와 파일 처리 (교재 12장, 배점 4점)
장(또는 절) / 주제
교재 12장 / try-with-resources 구문과 자원 관리
문제
다음 코드에 대한 설명으로 가장 적절한 것은?
import java.io.*;
public class Test {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
선택지
br.close()를 명시적으로 호출하지 않으면 파일 핸들이 누수된다.- try-with-resources 구문은
AutoCloseable을 구현한 자원을 try 종료 시 자동으로 닫는다. IOException은 비검사 예외이므로 catch 블록은 생략해도 된다.FileReader의 인자로 파일이 존재하지 않으면NullPointerException이 발생한다.
정답
2번
해설
자바 7부터 도입된 try-with-resources는 try 괄호 안에서 선언한 자원이 AutoCloseable(또는 Closeable)을 구현하면 try 블록 종료 시점에 자동으로 close()를 호출한다. 따라서 개발자가 명시적으로 close를 부르지 않아도 자원이 안전하게 해제된다. BufferedReader와 FileReader는 모두 AutoCloseable을 구현한다. IOException은 검사 예외이므로 catch나 throws가 필수이며, 파일 부재 시에는 FileNotFoundException(IOException의 하위)이 발생한다. (출처: 방통대 자바프로그래밍 교재 12.4절)
출제 의도
try-with-resources의 핵심 메커니즘(AutoCloseable 기반 자동 해제)과 자바 예외 분류 체계를 함께 평가한다.
난이도 및 근거
난이도 상. try-with-resources 구문을 단순 try-catch와 구분해야 하며, 검사·비검사 예외 분류와 구체적인 예외 타입(FileNotFoundException)까지 정확히 알아야 한다.
오답 선택지 설계 근거
1번은 try-with-resources의 자동 닫힘 기능을 모르는 학습자를 점검한다. 3번은 IOException이 비검사라고 잘못 아는 경우(런타임 예외와 혼동)를 확인한다. 4번은 파일 부재 시 NPE가 발생한다는 잘못된 모델을 점검한다.
종합 검토
이상 10문항은 방통대 자바프로그래밍 교재의 4장 후반, 5장, 10~12장의 핵심 주제를 균형 있게 다룬다. 6문항(1·2·3·5·6·7·8·10)은 자바 코드 분석을 요구하여 과제 지시사항의 "코드 포함 5문항 이상" 기준을 충족한다. 난이도 상은 3·6·7·8·10번 5문항으로 절반에 해당하며, 모두 단순 암기가 아닌 코드 실행 흐름 추적, 다단계 추론, 미세한 문법 규칙 적용을 요구한다. 오답 선택지는 자바 학습자가 실제로 자주 범하는 오개념(remove의 인덱스/값 혼동, throw·throws 혼동, 와일드카드의 읽기·쓰기 비대칭 등)을 의도적으로 반영하여 식별 변별력을 확보하였다.
참고문헌
- 한국방송통신대학교 출판문화원, 『자바프로그래밍』 교재, 4장·5장·10장·11장·12장.
- Oracle, "The Java Tutorials — Generics, Wildcards, I/O Streams", https://docs.oracle.com/javase/tutorial/
- JLS(Java Language Specification) 14장(예외) 및 15장(표현식 평가 순서).
'방송통신대학교' 카테고리의 다른 글
| R컴퓨팅 기말 추가과제 풀이: 작업 환경 설정부터 시각화·문서화까지 (0) | 2026.05.28 |
|---|---|
| 한국방송통신대학교 1인미디어기획제작 기말과제 유튜브 채널 '침착맨' 분석 (2) | 2026.05.28 |
| 한국방송통신대학교 패션마케팅 기말과제 디지털 시대 패션상품 특성과 STP·4P 전략 종합 분석 (3) | 2026.05.27 |
| 한국방송통신대학교 인간과언어 기말과제 — 음운, 형태, 의미, 사회언어학 핵심 정리 (2) | 2026.05.27 |
| 주택임차인의 임차권 보호에 관한 법적 고찰 (4) | 2026.05.27 |