College Board CED V.1 (Effective Fall 2025) p.148 원문 + AP CSA 채점기준에서 점수 받는 답안 vs 감점 답안 예시
public·private·static 키워드 정확)College Board AP CSA CED V.1 (Effective Fall 2025) 표기.
| Practice 1: Design Code | 2–10% |
| Practice 2: Develop Code (FRQ 4문항 모두) | 22–38% |
| Practice 3: Analyze Code (MCQ 최다) | 37–53% |
| Practice 4: Document Code · Computing Systems | 10–15% |
| Practice 5: Use Computers Responsibly | 2–10% |
| Unit 1: Using Objects and Methods | 15–25% |
| Unit 2: Selection and Iteration | 25–35% |
| Unit 3: Class Creation | 10–18% |
| Unit 4: Data Collections | 30–40% |
public/private, return type, parameter type, ;, { }length(), substring(), ArrayList.get() 등)는 정확한 시그니처 사용}까지문제: "Write the method countEvens that returns the number of even integers in the array."
public int countEvens(int[] arr) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
count++;
}
}
return count;
}
→ public + return type + 정확한 parameter + return + ; 모두 ✓
// 배열을 돌면서 짝수 개수 세기
// for 문 사용해서 count++ 하기
// return count;
→ 한국어 주석 + pseudo-code = 0점. CED: "express in print form the proper syntax" 위반.
int countEvens(arr) {
for i in arr:
if i % 2 == 0: count = count + 1
return count
}
→ Python syntax 혼용 + public 누락 + parameter type 누락 → 0점.
return 누락 — return type이 void가 아닌데 return 없음 → 컴파일 안 됨 → -1~-2점public/private 키워드 누락 — Q2 Class Design에서 instance var는 private, 메서드는 public이 관례 → 누락 시 -1점; 누락 — 한 줄에 하나라도 빠지면 syntax error → 채점관에 따라 -1점arr이라 했는데 array로 쓰면 -1점 (선언과 본문 일관성)arr.length() (X, 배열은 .length) / str.length (X, String은 .length()) / list.size (X, ArrayList는 .size())
isValid(), helper())가 있으면 반드시 호출 — 안 쓰면 감점 위험문제: "Complete the method removeNegatives. Use the helper isNegative(int) already provided."
public void removeNegatives(ArrayList<Integer> nums) {
/* given: method header above */
for (int i = nums.size() - 1; i >= 0; i--) {
if (isNegative(nums.get(i))) {
nums.remove(i);
}
}
}
→ 주어진 헬퍼 isNegative 호출 ✓ 메서드 시그니처 변경 X ✓ 변수명 nums 그대로 ✓
public void removeNegatives(ArrayList<Integer> list) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i) < 0) {
list.remove(i);
}
}
}
→ 주어진 변수명 nums → list로 변경 (감점) + 주어진 헬퍼 isNegative 무시 (감점) + 정방향 + remove → 인덱스 건너뛰기 버그 (-1~-2점)
arr.length > 0" → if (arr.length == 0) return ...; 같은 분기 추가하지 않음문제: "Write a method average that returns the average. Assume that arr.length > 0."
public double average(int[] arr) {
int sum = 0;
for (int v : arr) sum += v;
return (double) sum / arr.length;
}
→ Assume 조건 신뢰. arr.length == 0 체크 없이 바로 나눗셈. 만점.
public double average(int[] arr) {
if (arr == null || arr.length == 0) {
return 0; // Assume 무시한 불필요한 분기
}
int sum = 0;
for (int v : arr) sum += v;
return (double) sum / arr.length;
}
→ 점수는 같지만 2~3분 시간 낭비. Q1당 22.5분 룰에 치명적. 게다가 "return 0"이 잘못된 명세가 되어 감점 가능.
row and col are valid indices" → 범위 체크 코드 추가하면 코드만 길어짐. Assume 조건을 의심하지 말고 그대로 사용하는 것이 시간을 아끼는 길.
@Override 어노테이션은 선택 (안 써도 감점 X, 쓰면 가독성 ↑)super.methodName(...) 으로 superclass 동작 호출 가능 (특히 toString, 생성자)private 메서드는 override 불가, final 메서드도 override 불가문제: "The class Dog extends Animal. Override makeSound to return "Woof"."
public class Dog extends Animal {
@Override
public String makeSound() {
return "Woof";
}
}
→ 동일 시그니처 (public String makeSound()) ✓ 본문만 변경 ✓
public class Dog extends Animal {
public String makeSound(String mood) {
return "Woof";
}
}
→ parameter (String mood) 추가 → overload. superclass의 makeSound()는 그대로 살아있음 → override 효과 없음 → 0점.
public void makeSound() {
System.out.println("Woof");
}
→ return type String → void 변경 → 컴파일 에러 → 0점.
toString() override 시 super.toString() 호출 누락 — superclass 정보를 포함해야 하는 경우 return super.toString() + " " + breed; 형태 필요. ② 생성자에서 super(...) 호출 누락 — superclass에 default 생성자가 없으면 컴파일 에러. ③ Override 한다고 했으면 superclass에 그 메서드가 있어야 함 — 없으면 그냥 새 메서드일 뿐.
i | x | result 식으로++i는 먼저 증가 후 사용, i++은 사용 후 증가&&는 왼쪽이 false면 오른쪽 평가 X, ||는 왼쪽이 true면 오른쪽 평가 X5 / 2 = 2 (정수), 5.0 / 2 = 2.5obj1 = obj2;은 같은 객체 가리킴 — 한 쪽 변경 = 둘 다 반영int x = 5;
int y = x++ + ++x;
System.out.println(x + " " + y);
추적표:
step 1: x++ 평가 → x 값 5 사용, x = 6
step 2: ++x 평가 → x = 7, 값 7 사용
step 3: y = 5 + 7 = 12
step 4: x = 7, y = 12
출력: "7 12"
→ 정확한 단계별 추적. 정답.
"x = 6, y = 11" 또는 "그냥 12 12"
→ pre/post increment를 같은 것으로 처리한 빈출 오답. x++은 5를 반환 후 6, ++x는 7로 만든 후 7 반환.
i++ vs ++i(arr != null && arr.length > 0)에서 arr == null이면 오른쪽은 평가 안 됨 (NullPointerException 회피)int.MAX_VALUE + 1 = 음수 (rare, but happens)str1 == str2 (X, reference 비교) vs str1.equals(str2) (O, 값 비교)
문제: "Identify the line that contains the bug."
"Line 4: if (i < arr.length) {
should be if (i <= arr.length - 1)
or equivalently arr.length should be arr.size() if it's an ArrayList."
→ 정확한 라인 + 한 줄 이유. 1점.
"코드에 버그가 있어요. 반복문 부분이 잘못된 것 같아요."
→ 라인 번호 X, 정확한 요소 X. 0점.
"Line 3, Line 4, Line 7 모두 의심됨"
→ 여러 요소 나열 → 부분점 안 줄 수 있음. 가장 확실한 하나만.
int인지 Integer인지 정확히. ArrayList의 element는 Integer (wrapper class), 배열의 element는 int (primitive). ArrayList<Integer>에 int 넣어도 autoboxing 되지만, identify 답안에서는 Integer로 답해야 정확.
println), 공백, 따옴표 Xx" → 마지막 시점의 x 값int a = 7, b = 2;
System.out.println(a / b);
System.out.println((double) a / b);
답:
줄 1: a / b = 7 / 2 = 3 (integer division)
줄 2: (double) a / b = 7.0 / 2 = 3.5
출력:
3
3.5
→ 도출 과정 + 정확한 출력. 만점.
"3
3.5"
→ 정답이지만 도출 과정 없음 → 부분점만. 특히 부분 정답일 경우 어디서 틀렸는지 채점관이 알 수 없어 감점.
"3.5
3.5"
→ integer division 무시. 한국 학생 빈출 오답.
println("Hello")는 Hello (따옴표 없이) + 줄바꿈. print("Hello")는 Hello (줄바꿈 없이). println("Hello, " + name) 처럼 + 연산자 → String 결합. 한국 학생들이 답안에 따옴표를 그대로 쓰는 실수가 빈번.
Dog d = new Dog(); d.makeSound();){1, 3, 5, 7} 식으로)문제: "Show how to create a Dog object and print its sound."
Dog myDog = new Dog("Buddy", 3);
System.out.println(myDog.makeSound());
// 출력: Woof
→ 객체 생성 + 메서드 호출 + 출력 명시. 만점.
"Dog 객체를 만들고 makeSound 메서드를 호출하면 Woof가 출력됩니다."
→ 코드 0줄 → 0점. "Show"는 코드 또는 구체적 결과 필수.
arr[0][0]가 좌상단, arr[row][col]에서 row가 먼저. { {1,2}, {3,4} }는 2 rows × 2 cols. 한국 학생들은 transpose 실수가 자주 발생.
| Task Verb | CED? | 핵심 행동 | 0점되는 실수 |
|---|---|---|---|
| Implement / Write | ✓ CED 공식 | 처음부터 끝까지 정확한 Java syntax | pseudo-code, 한국어 주석 → 0점 |
| Complete (program code) | ✓ CED 공식 | 빈칸만 채우고 주변 그대로 | 주어진 헬퍼·변수명 무시 → 감점 |
| Assume | ✓ CED 공식 | 조건 그대로 받아들이기 (검증 X) | 의심해서 if 분기 추가 → 시간 낭비 |
| Override | FRQ 빈출 (Q2) | 동일 시그니처 + 본문만 변경 | parameter·return type 변경 → overload (0점) |
| Trace | MCQ 최다 | 변수 변화 표, 단계별 | pre/post increment, short-circuit, integer division |
| Identify | FRQ + MCQ | 정확한 라인·요소 + 한 줄 이유 | 여러 요소 나열, 모호한 표현 |
| Determine | MCQ 최다 | 결과 + 도출 과정 1줄 | 결과만 / integer division 무시 |
| Show | FRQ 부분 | 작동하는 코드 + 결과 명시 | 설명만 (코드 0줄) → 0점 |
| 문항 | 점수·시간 | 주 출제 동사 | 가끔 등장 |
|---|---|---|---|
| Q1 Methods / Control Structures | 7점 / 22.5분 | Implement, Complete | Show (호출 예시), Assume |
| Q2 Class Design | 7점 / 22.5분 | Write, Implement | Override (자주), Complete, Show |
| Q3 Data Analysis (ArrayList) | 5점 / 22.5분 | Write, Complete | Assume (조건 단순화) |
| Q4 2D Array | 6점 / 22.5분 | Write, Implement | Show (배열 내용), Assume |
| MCQ Section I | 40문항 / 90분 | Trace, Identify, Determine | (코드 작성 동사는 거의 X) |
| # | 실수 | 잘못된 예 | 옳은 형태 |
|---|---|---|---|
| 1 | 한국어 주석으로 답안 대체 | // 짝수만 세기 |
실제 Java 코드 작성 (if (x % 2 == 0) count++;) |
| 2 | 배열 vs String vs ArrayList 길이 혼동 | arr.length() / str.length / list.size |
arr.length / str.length() / list.size() |
| 3 | return 누락 | public int foo() { ... } (return 없음) |
return result; 명시 |
| 4 | ; 누락 / 괄호 짝 안 맞음 |
int x = 5 (세미콜론 X) |
int x = 5; |
| 5 | Override를 overload로 작성 | parameter 추가 / return type 변경 | 동일 시그니처 + 본문만 변경 |
| 6 | Assume 무시 (불필요한 검증) | if (arr == null) return 0; |
Assume 조건 신뢰, 분기 생략 |
| 7 | integer division 무시 | 5 / 2 == 2.5 (X) |
5 / 2 == 2 · (double) 5 / 2 == 2.5 |
| 8 | String 비교 == 사용 |
if (s1 == s2) (reference) |
if (s1.equals(s2)) (값 비교) |
public(메서드) / private(instance var)이 관례, 누락 시 default 접근 → -1점ArrayList<Integer>에 int 넣어도 작동하지만, identify 답안에서는 Integer가 정확for (int i = list.size()-1; i >= 0; i--)) 사용arr[row][col], row가 먼저. transpose 실수 빈번
| 순서 | 자료 | 용도 |
|---|---|---|
| 1 | 📝 Task Verbs (지금 이 자료) | FRQ 답안 형태 — 30분 정독 |
| 2 | 💻 AP CSA 치트시트 | Java 문법·Quick Reference 1쪽 압축본 — 20분 |
| 3 | 📊 FRQ 채점 가이드 | 실제 rubric 분석 (Q1~Q4) — 30분 |
| 4 | 📅 D-13 학습 계획 | 13일 일별 학습 로드맵 |