💻 AP Computer Science A 족집게 요약

📚 CED V.1 (Effective Fall 2025) — 4 Units · 5 Computational Thinking Practices · 시험 정보 정정 필독
⚠️ 시험 정보 갱신 (2026 기준 — 본 cheat sheet 기존 표기 일부 정정):
· Section I — Multiple-Choice 42문항 / 90 minutes / 55% (기존 "MC 70분/40문항 / 50%" 표기 → 정정)
· Section II — Free-Response 4문항 / 90 minutes / 45%, 총 25점 = Q1 (7) + Q2 (7) + Q3 (5) + Q4 (6) (기존 "각 9점 36점" 표기 → 정정)
· 시험 시간 합계: 3시간 (180분) (기존 "160분" 표기 → 정정)
· Bluebook 디지털 시험 + Java Quick Reference 제공 + 계산기 없음.

🗂️ CED V.1 4 Units — 옛 10-Unit 체계 매핑

아래 카드의 옛 Unit 1~10은 본 cheat sheet 내 토픽 분류용. 2026 시험은 CED V.1 4-Unit 체계로 출제되므로 옛 Unit ↔ CED V.1 매핑을 우선 확인하라. 비중 표기: 15-25% / 25-35% / 10-18% / 30-40% (각각 Unit 1·2·3·4).

FRQ 4문항 매핑: Q1 Methods and Control Structures (Unit 1·2 통합, 7점) · Q2 Class Design (Unit 3, 7점) · Q3 Data Analysis with ArrayList (Unit 4, 5점) · Q4 2D Array (Unit 4, 6점) = 25점. 모두 Practice 2 평가.

CED V.1 Unit비중 (MCQ)차시본 cheat의 옛 Unit 매핑
Unit 1: Using Objects and Methods
primitive·casting·expression·API·method signature·Math·String·instantiation
15–25%32–34Unit 1 (Primitive Types) + 옛 Unit 2 (Using Objects · String · Math)
Unit 2: Selection and Iteration
if·nested if·compound boolean·while·for·향상된 for·String 알고리즘·run-time
25–35%29–31Unit 3 (Boolean·if) + 옛 Unit 4 (Iteration ⭐)
Unit 3: Class Creation
abstraction·constructor·passing reference·static·scope·this
10–18%20–22Unit 5 (Writing Classes)
Unit 4: Data Collections 최다 비중
윤리·array·ArrayList·2D·search·sort·recursion·inheritance
30–40%50–52Unit 6~10 (Array · ArrayList · 2D Array · Inheritance · Recursion)

🛠️ 5 Computational Thinking Practices (Big Idea 역할)

Practice의미MCQ 비중
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 and Computing Systems프로그램이 결과를 생성하는 동작·조건 기술10–15%
Practice 5: Use Computers Responsibly컴퓨팅의 윤리·사회적 영향2–10%

📝 3 Task Verbs (CED p.148)

📚 보충 자료: 본 cheat sheet는 Java 문법·Top 함정·Bluebook 가이드 중심. CED V.1 시험 구조 정독은 ⭐ CED 1장 요약으로, FRQ 점수 분배는 📝 FRQ 채점 가이드 (재제작)로, 코드 직접 작성 훈련은 💻 Code Patterns Checklist로 보완하라.
Unit 1: Primitive Types 2.5-5%

기본 자료형 (Primitive Types)

Type크기범위 / 설명기본값
int32 bit-2,147,483,648 ~ 2,147,483,6470
double64 bit소수점 포함 실수0.0
boolean1 bittrue / falsefalse
AP 시험 범위: int, double, boolean 3가지만 출제. char, long, float 등은 범위 밖.

Type Casting (형변환)

// int → double: 자동 변환 (widening)
int a = 5;
double b = a;  // b = 5.0

// double → int: 명시적 캐스팅 필요 (narrowing, 소수점 버림)
double x = 9.7;
int y = (int) x;  // y = 9 (반올림 아님!)

// 정수 나눗셈 주의!
int result = 7 / 2;       // result = 3 (정수끼리 → 정수)
double result2 = 7.0 / 2; // result2 = 3.5
double result3 = (double) 7 / 2; // result3 = 3.5

Integer Overflow

주의: Integer.MAX_VALUE + 1Integer.MIN_VALUE (오버플로우 발생, 에러 없이 값 변경됨!)
int max = Integer.MAX_VALUE;  // 2147483647
System.out.println(max + 1); // -2147483648 (overflow!)

연산자 우선순위 (시험 빈출)

우선순위연산자
1 (높음)! (NOT), (cast), ++, --
2*, /, %
3+, -
4<, >, <=, >=
5==, !=
6&&
7 (낮음)||
Unit 2: Using Objects 5-7.5%

String 메서드 (필수 암기)

메서드반환설명예시
length()int문자열 길이"hello".length() → 5
substring(i, j)String인덱스 i부터 j-1까지"hello".substring(1,3) → "el"
substring(i)String인덱스 i부터 끝까지"hello".substring(2) → "llo"
indexOf(str)int처음 발견 위치, 없으면 -1"hello".indexOf("ll") → 2
equals(str)boolean내용 비교 (대소문자 구분)"Hi".equals("hi") → false
compareTo(str)int사전순 비교 (음/0/양)"a".compareTo("b") → 음수
최빈출 함정: ==는 참조(주소) 비교! 문자열 내용 비교는 반드시 .equals() 사용.
String a = new String("hi");
String b = new String("hi");
a == b       // false (다른 객체)
a.equals(b)  // true  (같은 내용)

Math 클래스

메서드설명예시
Math.abs(x)절대값Math.abs(-5) → 5
Math.pow(b, e)거듭제곱 (double 반환)Math.pow(2, 3) → 8.0
Math.sqrt(x)제곱근Math.sqrt(16) → 4.0
Math.random()0.0 ≤ x < 1.0랜덤 실수
랜덤 정수 공식: (int)(Math.random() * (max - min + 1)) + min
예: 1~6 주사위 → (int)(Math.random() * 6) + 1

Wrapper Classes

Integer num = new Integer(5);  // deprecated, but may appear
Integer num2 = 5;              // autoboxing
int val = num2;                 // unboxing
Integer.MAX_VALUE               // 2147483647
Integer.MIN_VALUE               // -2147483648
Unit 3: Boolean Expressions & if Statements 15-17.5%

비교 연산자

연산자의미주의
==같다primitive만! 객체는 .equals()
!=같지 않다
<, >, <=, >=크기 비교primitive만 사용 가능

if / else if / else 구조

if (score >= 90) {
    grade = "A";
} else if (score >= 80) {
    grade = "B";
} else if (score >= 70) {
    grade = "C";
} else {
    grade = "F";
}
팁: else if 체인에서 조건은 위에서 아래로 순서대로 검사. 첫 번째 true에서 멈춤. 조건 순서가 중요!

논리 연산자 & Short-Circuit Evaluation

연산자의미Short-circuit
&&AND왼쪽이 false면 오른쪽 평가 안 함
||OR왼쪽이 true면 오른쪽 평가 안 함
!NOT-
NullPointerException 방지 패턴:
if (str != null && str.length() > 0) { ... }
// str이 null이면 &&에서 short-circuit → length() 호출 안 함

DeMorgan's Law (드모르간 법칙) ⭐ 매년 출제

!(A && B)!A || !B
!(A || B)!A && !B

기억법: NOT을 분배하면 &&|| 뒤집힘!

// 예시: "18세 미만이 아니고 65세 이상이 아닌" 사람
!(age < 18 || age >= 65)
// 드모르간 적용:
age >= 18 && age < 65

Compound Boolean 함정 문제

// 범위 체크: 1 <= x <= 10 (수학 표기)
// Java에서는:
x >= 1 && x <= 10   // ✅ 올바른 방법
1 <= x <= 10         // ❌ 컴파일 에러 또는 잘못된 결과
Unit 4: Iteration ⭐ 17.5-22.5% 최고 비중

while 루프

int count = 0;
while (count < 5) {
    System.out.println(count);
    count++;  // 이걸 빼먹으면 무한루프!
}

for 루프

// 기본 구조: for(초기화; 조건; 갱신)
for (int i = 0; i < n; i++) {
    // i: 0, 1, 2, ..., n-1  (총 n번)
}

// 역순
for (int i = n - 1; i >= 0; i--) {
    // i: n-1, n-2, ..., 0
}

Off-by-One Errors (1 차이 오류) ⭐ 최다 함정

코드실행 횟수i 값
for(i=0; i<n; i++)n번0 ~ n-1
for(i=0; i<=n; i++)n+1번0 ~ n
for(i=1; i<n; i++)n-1번1 ~ n-1
for(i=1; i<=n; i++)n번1 ~ n

Nested Loops (중첩 루프)

// 구구단 출력 패턴
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        System.out.print(i * j + " ");
    }
    System.out.println();
}
// 바깥 루프 1회 = 안쪽 루프 전체 실행
// 총 실행 횟수 = 9 × 9 = 81회

Loop Tracing (추적) 기법

추적표 만들기: 변수별 열을 만들고 각 반복마다 값 기록
// 문제: 출력값은?
int s = 0;
for (int i = 1; i <= 4; i++) {
    s += i;
}
// 추적: i=1,s=1 → i=2,s=3 → i=3,s=6 → i=4,s=10
// 답: s = 10

String 순회 패턴

String str = "Hello";
// 각 문자 접근
for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
}

// 역순 출력
String reversed = "";
for (int i = str.length() - 1; i >= 0; i--) {
    reversed += str.charAt(i);
}

빈출 루프 패턴

합계/평균
int sum = 0;
for (int v : arr)
    sum += v;
double avg = (double)sum / arr.length;
최대/최소
int max = arr[0];
for (int v : arr)
    if (v > max) max = v;
Unit 5: Writing Classes 5-10%

클래스 기본 구조

public class Student {
    // Instance variables (private!)
    private String name;
    private int grade;
    private static int count = 0; // 클래스 변수

    // Constructor (생성자)
    public Student(String name, int grade) {
        this.name = name;
        this.grade = grade;
        count++;
    }

    // Accessor (getter)
    public String getName() { return name; }

    // Mutator (setter)
    public void setGrade(int g) { grade = g; }

    // toString
    public String toString() {
        return name + ": " + grade;
    }

    // Static method
    public static int getCount() { return count; }
}

static vs instance

InstanceStatic
소속각 객체마다 별도클래스에 하나만
접근obj.method()Class.method()
this 사용가능불가능
예시name, getName()count, Math.abs()

this 키워드

this = 현재 객체 자신에 대한 참조
주 용도: 매개변수와 인스턴스 변수 이름이 같을 때 구분
this.name = name; (인스턴스 변수 = 매개변수)

Encapsulation (캡슐화)

  • Instance variables는 항상 private
  • 외부 접근은 public getter/setter를 통해서만
  • 데이터 보호 + 유효성 검사 가능
Unit 6: Array 2.5-7.5%

배열 선언 & 초기화

// 방법 1: 크기 지정 (기본값으로 초기화)
int[] arr = new int[5]; // {0, 0, 0, 0, 0}

// 방법 2: 초기값 지정
int[] arr = {1, 2, 3, 4, 5};

// 길이: arr.length (메서드 아님! 괄호 없음!)
ArrayIndexOutOfBoundsException: 유효 인덱스는 0 ~ arr.length-1. arr[arr.length]는 항상 에러!

배열 순회

// 인덱스 기반 (값 수정 가능)
for (int i = 0; i < arr.length; i++) {
    arr[i] = arr[i] * 2;
}

// enhanced for-loop (읽기 전용)
for (int val : arr) {
    System.out.println(val);
    // val을 수정해도 원본 배열은 변하지 않음!
}

핵심 배열 알고리즘

합계 / 평균
int sum = 0;
for (int v : arr) sum += v;
double avg = (double) sum / arr.length;
최댓값 찾기
int max = arr[0];
for (int i = 1; i < arr.length; i++)
    if (arr[i] > max) max = arr[i];
특정 값 개수 세기
int count = 0;
for (int v : arr)
    if (v == target) count++;
왼쪽으로 시프트
int first = arr[0];
for (int i = 0; i < arr.length-1; i++)
    arr[i] = arr[i+1];
arr[arr.length-1] = first;
Unit 7: ArrayList 2.5-7.5%

ArrayList 메서드

메서드설명반환
add(obj)끝에 추가boolean
add(i, obj)인덱스 i에 삽입void
get(i)인덱스 i의 값 반환E
set(i, obj)인덱스 i를 obj로 교체이전 값
remove(i)인덱스 i 삭제 (뒤 요소 앞으로 이동)삭제된 값
size()요소 개수int
⚠ 가장 큰 함정: 순회하면서 삭제
// ❌ 잘못된 방법 - 요소를 건너뜀!
for (int i = 0; i < list.size(); i++) {
    if (list.get(i).equals("remove")) {
        list.remove(i);  // 삭제 후 뒤 요소가 앞으로 이동
    }                     // 다음 i++로 하나 건너뜀!
}

// ✅ 방법 1: 뒤에서부터 순회
for (int i = list.size() - 1; i >= 0; i--) {
    if (list.get(i).equals("remove"))
        list.remove(i);
}

// ✅ 방법 2: 삭제 후 i-- (또는 i 그대로 유지)
for (int i = 0; i < list.size(); i++) {
    if (list.get(i).equals("remove")) {
        list.remove(i);
        i--;  // 인덱스 보정
    }
}

ArrayList vs Array

ArrayArrayList
크기고정가변 (자동 확장)
길이.length.size()
타입primitive + 객체객체만 (wrapper 필요)
접근arr[i]list.get(i)
선언int[] a = new int[5]ArrayList<Integer> a = new ArrayList<>()
Unit 8: 2D Array 7.5-10%

2D 배열 선언

int[][] grid = new int[3][4]; // 3행 4열
int[][] grid = {{1,2,3}, {4,5,6}}; // 2행 3열

grid.length     // 행(row) 수
grid[0].length  // 열(column) 수

Row-Major 순회 (행 우선) ⭐ 기본 패턴

for (int r = 0; r < grid.length; r++) {
    for (int c = 0; c < grid[r].length; c++) {
        System.out.print(grid[r][c] + " ");
    }
    System.out.println();
}
// 출력: 1 2 3
//       4 5 6

Column-Major 순회 (열 우선)

for (int c = 0; c < grid[0].length; c++) {
    for (int r = 0; r < grid.length; r++) {
        System.out.print(grid[r][c] + " ");
    }
    System.out.println();
}
// 출력: 1 4
//       2 5
//       3 6

Enhanced For-Loop (2D)

for (int[] row : grid) {
    for (int val : row) {
        System.out.print(val + " ");
    }
}

빈출 2D 알고리즘

행 합계
for (int r = 0; r < grid.length; r++) {
    int rowSum = 0;
    for (int c = 0; c < grid[r].length; c++)
        rowSum += grid[r][c];
}
열 합계
for (int c = 0; c < grid[0].length; c++) {
    int colSum = 0;
    for (int r = 0; r < grid.length; r++)
        colSum += grid[r][c];
}
Unit 9: Inheritance 5-10%

상속 기본

public class Animal {
    private String name;
    public Animal(String name) { this.name = name; }
    public String speak() { return "..."; }
    public String getName() { return name; }
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);  // 반드시 첫 줄!
    }

    @Override
    public String speak() { return "Woof!"; }
}

핵심 규칙

규칙설명
super()부모 생성자 호출, 자식 생성자의 첫 줄이어야 함
super.method()부모의 원래 메서드 호출
Override같은 메서드 시그니처, 자식에서 재정의
private 접근자식 클래스도 부모의 private 변수에 직접 접근 불가 → getter 사용

Polymorphism (다형성) ⭐

Animal a = new Dog("Rex");
a.speak();  // "Woof!" — 런타임에 실제 객체 타입의 메서드 실행

// 컴파일 타입 vs 런타임 타입
// 컴파일: Animal → Animal 메서드만 호출 가능
// 런타임: Dog → Dog에서 override된 메서드 실행
다형성 규칙:
1. 변수 타입(왼쪽)이 호출 가능한 메서드를 결정 (컴파일 시)
2. 객체 타입(오른쪽)이 실행될 메서드 버전을 결정 (런타임 시)

Object 클래스

모든 클래스는 Object를 자동 상속. toString()equals()를 override하여 사용.

Unit 10: Recursion 5-7.5%

재귀 구조

public static int factorial(int n) {
    // Base case (기저 조건) — 반드시 필요!
    if (n == 0 || n == 1) return 1;

    // Recursive case (재귀 호출)
    return n * factorial(n - 1);
}
Base case가 없으면: StackOverflowError (무한 재귀)

재귀 추적 방법

// factorial(4) 추적:
factorial(4)
  = 4 * factorial(3)
  = 4 * 3 * factorial(2)
  = 4 * 3 * 2 * factorial(1)
  = 4 * 3 * 2 * 1
  = 24

빈출 재귀 패턴

문자열 뒤집기
public static String reverse(String s) {
    if (s.length() <= 1) return s;
    return reverse(s.substring(1))
           + s.charAt(0);
}
거듭제곱
public static int power(int b, int e) {
    if (e == 0) return 1;
    return b * power(b, e - 1);
}
이진 탐색 (재귀)
public static int binSearch(
    int[] a, int lo, int hi, int t) {
  if (lo > hi) return -1;
  int mid = (lo + hi) / 2;
  if (a[mid] == t) return mid;
  if (a[mid] < t)
    return binSearch(a, mid+1, hi, t);
  return binSearch(a, lo, mid-1, t);
}
합계
public static int sum(int[] a, int i) {
    if (i < 0) return 0;
    return a[i] + sum(a, i - 1);
}

재귀 vs 반복

모든 재귀는 반복으로 바꿀 수 있고 반대도 마찬가지. AP 시험에서는 재귀 추적 능력이 핵심.
FRQ 4가지 유형 & 템플릿 시험의 45% · 25점
CED V.1 정정: FRQ는 4문제, 총 25점 (Q1 7 + Q2 7 + Q3 5 + Q4 6), 전체 시험의 45%. 유형별 1문제씩 반드시 출제. 모두 Practice 2 (Develop Code) 평가.

Type 1: Methods & Control Structures

// 패턴: if/else + 루프 조합
public returnType methodName(parameters) {
    // 결과 변수 초기화
    for (순회 조건) {
        if (조건) {
            // 처리
        }
    }
    return result;
}

Type 2: Class Design (클래스 설계)

public class ClassName {
    // 1. private instance variables
    private Type var1;
    private Type var2;

    // 2. Constructor
    public ClassName(Type param1, Type param2) {
        var1 = param1;
        var2 = param2;
    }

    // 3. Methods (문제에서 요구하는 것들)
    public Type methodName() {
        // 구현
    }
}

Type 3: Array / ArrayList

// 패턴: 순회 → 조건 확인 → 수집/변환
public ArrayList<Type> filterMethod(Type[] arr) {
    ArrayList<Type> result = new ArrayList<>();
    for (Type item : arr) {
        if (조건) {
            result.add(변환(item));
        }
    }
    return result;
}

Type 4: 2D Array

// 패턴: 이중 루프 순회
public ReturnType process2D(int[][] grid) {
    for (int r = 0; r < grid.length; r++) {
        for (int c = 0; c < grid[r].length; c++) {
            // grid[r][c] 처리
        }
    }
}

FRQ 채점 팁

  • 부분 점수 있음! 완벽하지 않아도 아는 것은 무조건 작성
  • System.out.println 대신 return 사용 (메서드 문제)
  • 변수 선언 타입 정확히 (int vs double)
  • 배열 범위 초과 주의 (.length vs .length - 1)
  • ArrayList 삭제 시 인덱스 보정 잊지 말 것
핵심 알고리즘 (정렬 & 탐색) MCQ 빈출

Binary Search (이진 탐색)

전제: 배열이 정렬되어 있어야 함
시간: O(log n) — n개에서 최대 log₂(n) + 1번 비교
public static int binarySearch(int[] arr, int target) {
    int lo = 0, hi = arr.length - 1;
    while (lo <= hi) {
        int mid = (lo + hi) / 2;
        if (arr[mid] == target) return mid;
        else if (arr[mid] < target) lo = mid + 1;
        else hi = mid - 1;
    }
    return -1;
}

Selection Sort (선택 정렬)

// 매 단계마다 최솟값을 찾아 앞으로 이동
for (int i = 0; i < arr.length - 1; i++) {
    int minIdx = i;
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[j] < arr[minIdx]) minIdx = j;
    }
    // swap
    int temp = arr[i];
    arr[i] = arr[minIdx];
    arr[minIdx] = temp;
}
// 시간: O(n²) 항상

Insertion Sort (삽입 정렬)

// 각 요소를 정렬된 부분의 올바른 위치에 삽입
for (int i = 1; i < arr.length; i++) {
    int key = arr[i];
    int j = i - 1;
    while (j >= 0 && arr[j] > key) {
        arr[j + 1] = arr[j];
        j--;
    }
    arr[j + 1] = key;
}
// 최선: O(n) 이미 정렬, 최악: O(n²)

Merge Sort (병합 정렬) — 개념만

원리: 배열을 반으로 나누고 → 각각 정렬 → 합치기 (Divide & Conquer)
시간: O(n log n) 항상
공간: O(n) 추가 메모리 필요

정렬 비교표

알고리즘최선평균최악특징
Selection SortO(n²)O(n²)O(n²)교환 횟수 최소
Insertion SortO(n)O(n²)O(n²)거의 정렬된 데이터에 유리
Merge SortO(n log n)O(n log n)O(n log n)안정적, 추가 메모리
Java Quick Reference (시험장에서 제공) 참고용
AP 시험에서 실제로 제공되는 Quick Reference Sheet 내용입니다. 암기 불필요하지만 익숙해져야 합니다.

String 메서드

int length()
String substring(int from, int to)  // from 포함, to 미포함
String substring(int from)
int indexOf(String str)
int compareTo(String other)
boolean equals(String other)

Math 메서드

static int abs(int x)
static double abs(double x)
static double pow(double base, double exponent)
static double sqrt(double x)
static double random()  // 0.0 <= x < 1.0

Integer 메서드

Integer.MIN_VALUE  // -2147483648
Integer.MAX_VALUE  // 2147483647

ArrayList 메서드

int size()
boolean add(E obj)
void add(int index, E obj)
E get(int index)
E set(int index, E obj)
E remove(int index)

List Interface

// 시험에서 사용 가능한 선언:
List<E> list = new ArrayList<E>();
🎯 시험 직전 1페이지 — Top 함정 10개 최다 출제
시험 30분 전에 한 번만 더 훑으세요. 매년 정답률이 가장 낮은 트랩 모음 — 이것만 알면 MC 5~10문제 더 맞을 수 있어요.
함정핵심 규칙예시
1. String == vs .equals() == 는 참조 비교 → 문자열 내용 비교는 .equals() "hi" == "hi" 결과 예측 불가, "hi".equals("hi") 만 안전
2. 정수 나눗셈 절삭 int 끼리 나누면 소수점 버림 7/2 = 3, (double)7/2 = 3.5
3. length vs length() vs size() 배열=필드, String=메서드, ArrayList=메서드 arr.length, s.length(), list.size()
4. ArrayList remove(0) 인덱스 0 제거 (값 0 아님) 값으로 제거: list.remove(Integer.valueOf(0))
5. Short-circuit 평가 && 앞 false면 뒤 안 봄, || 앞 true면 뒤 안 봄 obj != null && obj.method() ← null 가드 패턴
6. Off-by-one < size() 또는 <= size()-1 만 OK i <= arr.length → IndexOutOfBoundsException
7. private 메서드 오버라이드 불가 오버라이드는 public / protected private void f() 자식이 다시 써도 새 메서드
8. super() 첫 줄 생성자 첫 줄에서만. 안 쓰면 자동으로 super() 호출 인자 있는 부모 생성자는 명시 필수
9. String immutable s.replace() 는 새 String 반환, 원본 불변 s = s.replace("a","b"); 로 받아야 변경됨
10. ArrayList 순회 중 remove 인덱스 꼬임 → 뒤에서부터 또는 별도 처리 for (int i = list.size()-1; i >= 0; i--)
📝 FRQ 채점 — 한국 학생 빈출 감점 필수 확인
FRQ 4문항 총 25점 (Q1 7 + Q2 7 + Q3 5 + Q4 6 — CED V.1 정정). 부분점수 큰 비중 — 완벽한 답안 1개보다 4문항 부분점수 합치기가 점수 더 높음. 자세한 채점 가이드는 FRQ 채점 가이드 →

✂️ 메서드 헤더 (-1점 단골)

🚫 다른 클래스 인스턴스 변수 직접 접근 금지

// ❌ 직접 접근 — 감점
obj.score = 0;

// ✅ getter/setter 호출
obj.setScore(0);
int s = obj.getScore();

🔢 length / size / get / set 혼동

대상길이접근변경
배열 int[]arr.lengtharr[i]arr[i] = x
Strings.length()s.charAt(i)변경 불가 (immutable)
ArrayListlist.size()list.get(i)list.set(i, x)

🔁 Boundary (경계) 명시

↩️ return 누락

📦 부분 점수 노리기

시간 부족하면 메서드 헤더 + boundary + return 만이라도 쓰세요. 최소 2~3점은 확보 가능. 빈 메서드도 적어두기:
public int countX(String s) {
    // 시간 없으면 일단 헤더 + return 만 쓰기
    int count = 0;
    return count;
}
💻 Bluebook 디지털 시험 환경

📲 시험 형식 (2026년 기준)

📖 Quick Reference 항상 열람 가능

⌨️ 디지털 FRQ 환경 팁

⏰ 시간 분배

구간권장 시간전략
MC 42문항90분약 2.1분/문항. 막히면 표시 후 다음. 마지막에 다시
FRQ Q1 (7점) Methods22-23분메서드 작성 + Part B (String 메서드) 분리
FRQ Q2 (7점) Class Design23-24분클래스 작성 — 생성자·인스턴스 변수 private
FRQ Q3 (5점) ArrayList18-20분ArrayList 처리 — remove 인덱스 주의·ConcurrentModification
FRQ Q4 (6점) 2D Array20-22분2D Array — row·col 순회 명확히
전체 검토3-5분return 누락·헤더 오류 확인
AP Computer Science A 족집게 요약 · 2026
모든 Unit 커버 · 함정 Top 10 · FRQ 채점 · Bluebook 가이드
📅 학습 대시보드 · 📝 FRQ 채점 가이드