본문 바로가기

클래스 생성

AP 컴퓨터 과학 A · 주제 3

이 주제용 영상 수업 영상 페이지 열기
7:26

클래스 생성

여기에는 이름, 학년, 등급이라는 세 개의 독립된 변수로 저장된 한 학생이 있습니다. 이것은 작동합니다. 이제 학생 천 명을 추가하십시오. 삼천 개의 변수가 필요합니다…

영어 내레이션 · 영어 + 중국어 자막 burned-in

3.1

추상화와 프로그램 설계

Syllabus

학습 목표 3.1.A: 자연어 사용 또는 도표 작성을 통해 프로그램의 설계를 표현하며, 모든 속성과 거동을 포함하여 각 클래스에서 발견되는 데이터 및 절차적 추상화를 나타냅니다.

  • 3.1.A.1 Abstraction is the process of reducing complexity by focusing on the main idea. By hiding details irrelevant to the question at hand and bringing together related and useful details, abstraction reduces complexity and allows one to focus on the idea.
  • 3.1.A.2 데이터 추상화는 데이터 유형의 추상적 속성과 그 표현의 구체적 세부 사항 사이의 분리를 제공합니다. 데이터 추상화는 표현의 구체적인 세부 사항을 참조하지 않고 데이터를 이름만 부여하여 복잡성을 관리합니다. 데이터는 단일 변수 또는 클래스나 데이터 집합과 같은 데이터 모음의 형태로 존재할 수 있습니다.
  • 3.1.A.3 속성은 메서드나 컨스트럭터 외부의 클래스 내에서 정의되는 데이터 추상화의 일종입니다. 인스턴스 변수는 클래스의 각 인스턴스에 대해 고유한 값을 가지는 속성입니다. 클래스 변수는 클래스의 모든 인스턴스가 공유하는 속성입니다.
  • 3.1.A.4 Procedural abstraction provides a name for a process and allows a method to be used only knowing what it does, not how it does it. Through method decomposition, a programmer breaks down larger behaviors of the class into smaller behaviors by creating methods to represent each individual smaller behavior. A procedural abstraction may extract shared features to generalize functionality instead of duplicating code. This allows for code reuse, which helps manage complexity.
  • 3.1.A.5 매개변수를 사용하면 프로시저를 일반화하여 다양한 입력 값이나 인자로 재사용할 수 있게 한다.
  • 3.1.A.6 프로그램에서 프로시저 추상화를 사용하면 메서드 서명 및 메서드가 수행하는 기능이 유지되는 한 메서드 사용자에게 변경 사항을 알릴 필요 없이 메서드의 내부 구현(속도 향상, 효율성 증가, 저장소 사용량 감소 등)을 변경할 수 있다.
  • 3.1.A.7 클래스를 구현하기 전에 속성과 거동을 포함하여 각 클래스의 설계를 세우는 것이 유용합니다. 이 설계는 자연어 또는 도표를 사용하여 표현할 수 있습니다.

출처: College Board AP Course and Exam Description

진행 중인 퍼즐: 클래스와 메서드는 더 큰 프로그램 설계의 모듈러 요소입니다
진행 중인 퍼즐: 클래스와 메서드는 더 큰 프로그램 설계의 모듈러 요소입니다

추상화란 간단한 인터페이스 뒤에 디테일을 숨기는 것을 의미합니다 – String을 사용할 때 문자열 저장 방식을 알 필요는 없습니다. 좋은 설계는 문제를 클래스로 나누어 각 클래스가 하나의 개념만 담당하도록 합니다. 이 주제는 직접 작성하는 클래스에 대한 것입니다.

프로그램을 모듈과 서브모듈로 분해하는 모습
프로그램을 모듈과 서브모듈로 분해하는 것
3.2

프로그램 설계의 영향

Syllabus

학습 목표 3.2.A: 컴퓨팅 시스템의 사회적 및 윤리적 함의를 설명합니다.

  • 3.2.A.1 시스템 신뢰성은 명시된 조건 하에서 프로그램이 예상대로 작업을 수행하며 고장 없이 작동하는 능력을 의미합니다. 프로그래머는 다양한 조건으로 프로그램을 테스트하여 시스템 신뢰성을 극대화하려는 노력을 기울여야 합니다.
  • 3.2.A.2 프로그램의 개발은 사회, 경제, 문화에 영향을 미칩니다. 이러한 영향은 긍정적일 수도 있고 부정적일 수도 있습니다. 특정 필요를 충족시키거나 문제를 해결하기 위해 설계된 프로그램은 의도한 용도를 넘어 예상치 못한 부정적 효과를 낳을 수 있습니다.
  • 3.2.A.3 프로그램을 개발할 때 법적 문제와 지적 재산권 관련 이슈가 발생합니다. 프로그래머는 종종 다른 사람이 작성하고 오픈 소스로 공개하여 무료로 사용할 수 있는 코드를 재사용합니다. 오픈 소스로 공개되지 않은 코드를 포함할 경우 프로그래머는 해당 코드의 사용 허가를 얻어야 하며, 일반적으로 통합 전에 코드를 구매해야 합니다.

출처: College Board AP Course and Exam Description

설계 선택은 코드가 올바른지, 가독성이 높고 재사용 가능한지에 영향을 미칩니다. 엔캡슐레이션 – 데이터를 프라이빗으로 유지하고 메서드를 통해만 노출하여 – 객체의 **상태(state)**를 오용으로 보호하고 내부 변경 시에도 클래스 사용자를 파산시키지 않게 합니다. 신중하게 지어진 이름, 단일 목적의 메서드 및 테스트는 **버그(bugs)**를 줄입니다.

설계는 코드 beyond의 책임도 수반합니다. 시스템 신뢰성(system reliability) – 프로그램이 실패 없이 예상대로 작업을 수행하는 것 – 은 프로그래머가 신중한 설계와 테스트를 통해 극대화해야 할 사항입니다. 프로그램은 사회, 경제, 문화에 실제적인 영향을 미치며 이는 유익한 측면과 해로운 측면을 모두 가질 수 있습니다. 또한 프로그램을 개발할 때는 법률적 및 지식재산권(ip) 문제가 발생하는데: 프로그래머들은 종종 **오픈 소스(open source)**로 공개되어 무료로 사용할 수 있는 코드를 재사용하지만, 해당 **라이선스(licence)**를 준수하고 **출처를 명시(give credit)**하며 다른 사람의 작품을 자신의 것으로 복제해서는 안 됩니다.

English 한국어
state/steɪt/ 상태
testing/ˈtestɪŋ/ 테스트
bugs 버그(결함)
System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ 시스템 신뢰성
beneficial/ˌbenɪˈfɪʃl/ 유익한
harmful/ˈhɑːmfl/ 유해한
legal/ˈliːɡl/ 법적(합법적인)
intellectual-property 지식재산권
open source/ˈəʊpən sɔːs/ 오픈소스
licence/ˈlaɪsəns/ 라이선스(면허)
give credit 출처 표기
3.3

클래스의 해부학

Syllabus

학습 목표 3.3.A: 클래스, 데이터, 컨스트럭터 및 메서드에 대한 접근성 및 가시성 제한을 지정하는 코드를 작성합니다.

  • 3.3.A.1 데이터 캡슐화는 클래스의 구현 세부 사항을 외부 클래스로부터 숨기는 기법입니다. public과 private 키워드는 클래스, 데이터, 컨스트럭터 및 메서드의 접근성을 제어합니다. private 키워드는 선언된 클래스 내부로만 접근을 제한하며, public 키워드는 선언된 클래스 외의 다른 클래스에서도 접근을 허용합니다.
  • 3.3.A.2 이 과정에서는 클래스를 항상 public으로 지정하며, class 키워드와 함께 선언됩니다.
  • 3.3.A.3 이 과정에서는 컨스트럭터를 항상 public으로 지정합니다.
  • 3.3.A.4 *인스턴스 변수(instance variables)*는 객체에 속하며, 각 객체는 해당 변수의 자체 복사본을 가집니다.
  • 3.3.A.5 캡슐화를 달성하기 위해서는 속성에 대한 접근이 클래스 내부에 국한되어야 합니다. 따라서 클래스 규격에서 명시하지 않는 한, 이러한 속성의 인스턴스 변수를 private으로 지정하는 것이 좋은 프로그래밍 관행입니다.
  • 3.3.A.6 행동에 대한 접근은 클래스 내부 또는 외부에서 이루어질 수 있습니다. public로 지정된 메서드는 클래스 내부 및 외부에서 모두 접근할 수 있는 반면, private로 지정된 메서드는 클래스 내부에서만 접근할 수 있습니다.

출처: College Board AP Course and Exam Description

클래스는 세 부분으로 구성됩니다: 인스턴스 변수(instance variables) (필드(fields) – 객체의 데이터), 생성자(constructors) (객체 생성), 그리고 메서드(methods) (행동/behavior). 필드는 일반적으로 private; 메서드는 일반적으로 public:

클래스 도식:-private 속성과 public 메서드
클래스 도식: -private 속성과 public 메서드
public class Student {
    private String name;      // instance variable
    private int score;

    public Student(String n, int s) {   // constructor
        name = n;
        score = s;
    }
    public int getScore() { return score; }   // accessor
}
설계도: 클래스는 해당 타입의 객체가 어떻게 만들어지는지를 정의하는 템플릿입니다
설계도: 클래스는 해당 타입의 객체가 어떻게 만들어지는지를 정의하는 템플릿입니다

흔히 하는 실수. 생성자 내부에서 타입을 반복해서 선언하면 필드를 설정하는 것이 아니라 새로운 로컬(local) 변수를 선언하게 됩니다:

public Student(String n, int s) {
    String name = n;   // local variable: the field name stays null
    score = s;         // correct: sets the field
}

코드는 컴파일되지만, 이렇게 생성된 매 Student마다 name은 null과 같습니다.

탐색하기

객체의 필드를 상자처럼 보기

클래스는 관련 데이터(필드)와 메소드를 묶습니다. 각 객체는 자체 필드 상자 세트를 가지며, 하나에 할당하는 것은 그 객체에만 영향을 미칩니다.

English 한국어
Abstraction/əbˈstrækʃn/ 추상화
interface/ˈɪntəfeɪs/ 인터페이스
readable 가독성 높은
reusable/riːˈjuːzəbl/ 재사용 가능한
Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ 엔캡슐레이션
private/ˈpraɪvət/ 프라이빗(비공개)
methods/ˈmeθədz/ 메서드
instance variables/ˈɪnstəns ˈveərɪəblz/ 인스턴스 변수
fields 필드(항목)
behavior/bɪˈheɪvjə/ 행동(동작)
constructor/kənˈstrʌktə/ 생성자
accessor (getter)/əkˈsesə/ 액세서 (게터)
local variable/ˈləʊkl ˈveərɪəbl/ 로컬 변수
3.4

컨스트럭터

Syllabus

학습 목표 3.4.A: 컨스트럭터 본체에서 초기화될 속성에 대한 인스턴스 변수를 선언하는 코드를 작성합니다.

  • 3.4.A.1 객체의 상태는 특정 시점의 속성과 그 값을 의미하며, 객체에 속하는 인스턴스 변수에 의해 정의됩니다. 이는 객체와 인스턴스 변수 사이에 has-a(소유) 관계를 형성합니다.
  • 3.4.A.2 컨스트럭터는 객체의 초기 상태를 설정하는 데 사용되며, 모든 인스턴스 변수에 대한 초기 값이 포함되어야 합니다. 컨스트럭터가 호출되면 객체를 위한 메모리가 할당되고 관련 객체 참조가 반환됩니다. 컨스트럭터 매개변수는 (지정될 경우) 인스턴스 변수를 초기화하기 위한 데이터를 제공합니다.
  • 3.4.A.3 가변 객체가 컨스트럭터 매개변수인 경우, 인스턴스 변수에는 해당 객체의 사본으로 초기화되어야 합니다. 이렇게 하면 인스턴스 변수가 원본 객체에 대한 참조를 유지하지 않으며, 메서드가 원본 객체의 상태를 변경하는 것을 방지할 수 있습니다.
  • 3.4.A.4 컨스트럭터가 명시되지 않으면 Java는 무매개변수 컨스트럭터를 제공하며, 속성의 데이터 유형에 따라 인스턴스 변수가 기본값으로 설정됩니다. 이 컨스트럭터를 기본 컨스트럭터라고 합니다.
  • 3.4.A.5 int 타입의 속성에 대한 기본값은 0입니다. double 타입의 속성에 대한 기본값은 0.0입니다. boolean 타입의 속성에 대한 기본값은 false입니다. 참조 타입의 기본값은 null입니다.

출처: College Board AP Course and Exam Description

**생성자(constructor)**는 클래스와 동일한 이름을 가지며 리턴 타입(return type)이 없습니다. new을 작성할 때 실행되며, 그 역할은 필드(initialize)를 초기화하는 것입니다. 클래스는 서로 다른 **파라미터 리스트(parameter lists) (오버로딩(overloading))**를 가진 여러 개의 생성자를 가질 수 있으며, 인수가 없는(no-argument) 생성자는 인수를 받지 않고 적절한 **기본값(defaults)**을 선택할 수 있습니다. 생성자 할당 전에 인스턴스 필드는 Java의 타입 의존적 초기 값, 예를 들어 0 for int 및 참조(references)에 대한 null을 가집니다.

풀이 예제/worked example. 두 개의 생성자를 가진 Point 클래스:

public class Point {
    private int x, y;

    public Point() {             // no-argument: the origin
        x = 0;
        y = 0;
    }
    public Point(int a, int b) { // two int parameters
        x = a;
        y = b;
    }
}
호출(Call) 사용된 생성자(Constructor used) 필드(Fields)
new Point() 인수 없음(no-argument) x = 0, y = 0
new Point(3, 4) (int, int) x = 3, y = 4
new Point(3) 일치하는 것 없음(none matches) 컴파일 불가(does not compile)

생성자가 설정하지 않는 필드는 기본값을 유지합니다: int에 대해 0, double에 대해 0.0, boolean에 대해 false, 객체에 대해 null. public void Point()을 작성하면 메서드가 생성되지, 생성자가 아닙니다: 생성자는 리턴 타입(return type)이 전혀 없으며, 심지어 void조차도 없습니다.

English 한국어
return type 반환 유형
initialize 초기화
parameter lists 파라미터 목록(인수 목록)
overloading/ˌəʊvəˈləʊdɪŋ/ 오버로딩
no-argument 인수 없음(무인수)
defaults 기본값
signature/ˈsɪɡnɪtʃə/ 메서드 서명
body/ˈbɒdi/ 메서드 본체
reference/ˈrefrəns/ 참조
parameter/pəˈræmɪtə/ 형식 매개변수
Access modifiers 접근 수식자
visibility 시야
3.5

메서드: 작성 방법

Syllabus

학습 목표 3.5.A: 기본 데이터 유형(primitive values)을 사용하여 클래스에 정의된 메서드를 통해 객체의 행동을 정의하는 코드를 작성하고, 이러한 메서드를 호출한 결과를 결정합니다.

  • 3.5.A.1 void 메서드는 값을 반환하지 않습니다. 헤더에는 메서드 이름 앞에 void 키워드가 포함됩니다.
  • 3.5.A.2 비공백 메서드는 단일 값을 반환합니다. 헤더에는 void 키워드 대신 반환 타입이 포함됩니다.
  • 3.5.A.3 비공백 메서드에서는 반환 타입과 호환되는 반환 식이 평가되어 값이 반환됩니다. 이를 값에 의한 반환이라고 합니다.
  • 3.5.A.4 return 키워드는 제어를 메서드나 컨스트럭터가 호출되었던 지점으로 되돌리는 데 사용됩니다. 리턴 문장 이후에 순차적으로 배치된 코드 절대 실행되지 않습니다. 선택문이나 반복문 내부에서 리턴 문을 실행하면 해당 문장이 중단되고 메서드나 컨스트럭터에서 탈출하게 됩니다.
  • 3.5.A.5 액세서 메서드는 다른 클래스의 객체가 인스턴스 변수 또는 클래스 변수의 값 사본을 얻을 수 있게 해줍니다. 액세서 메서드는 비공백 메서드입니다.
  • 3.5.A.6 뮤테이터(수정자) 메서드는 인스턴스 변수 또는 클래스 변수의 값을 변경하는 메서드입니다. 뮤테이터 메서드는 주로 공백 메서드입니다.
  • 3.5.A.7 매개변수가 있는 메서드는 해당 매개변수를 통해 값을 받아 메서드의 작업을 수행하는 데 사용합니다.
  • 3.5.A.8 인수가 기본 데이터 유형일 경우, 매개변수는 해당 값의 복사본으로 초기화됩니다. 매개변수에 대한 변경은 해당 인수에는 영향을 미치지 않습니다.

출처: College Board AP Course and Exam Description

메서드는 서명, 반환 유형, 그리고 본체를 가집니다. **액세서(게터)**는 객체를 변경하지 않고 정보를 반환하며, **뮤테이터(세터)**는 필드를 변경합니다. 값을 반환하는 메서드는 모든 경로에서 올바른 type의 return이 있어야 하며, void 메서드는 아무것도 반환하지 않습니다.

public void setScore(int s) { score = s; }   // mutator
public String toString() { return name + ": " + score; }

풀이 예제/worked example. 점수에 b을 더하되 절대 100을 넘지 않도록 하고, 새로운 점수를 반환하는 뮤테이터 addBonus(int b)을 작성하십시오.

public int addBonus(int b) {
    score += b;
    if (score > 100) {
        score = 100;
    }
    return score;
}
  1. 리턴 타입은 int입니다. 왜냐하면 메서드는 새로운 점수를 되돌리기 때문입니다.
  2. 매개변수 b이 사용되었고, 필드 score이 변경되었으므로 이는 뮤테이터입니다.
  3. 점수가 90일 때, addBonus(15)은 점수를 100로 설정하고 100을 반환합니다.

일반적인 실수는 if 내부에만 return을 두는 것입니다: if (score > 100) { return 100; }은 이후에 아무것도 없으면 컴파일되지 않습니다. 왜냐하면 다른 경로는 아무것도 반환하지 않기 때문입니다. 또 다른 실수는 반환하는 대신 결과를 출력하는 것입니다: 값을 반환하라는 요청을 받은 메서드는 단순히 System.out.println할 뿐이지 않아야 합니다.

탐색하기

메소드 호출과 반환을 따라가십시오

메소드를 호출하면 매개변수가 포함된 프레임이 적재됩니다; return에 도달하면 프레임이 제거되고 값이 호출자에게 반환됩니다.

English 한국어
mutator (setter)/mjuːˈteɪtə/ 뮤테이터 (세터)
3.6

객체의 레퍼런스 전달 및 반환

Syllabus

학습 목표 3.6.A: 객체 참조를 사용하여 클래스 내에 작성된 메서지를 통해 객체의 행동을 정의하고, 해당 메서드를 호출했을 때의 결과를 판별할 수 있는 코드를 작성합니다.

  • 3.6.A.1 인자가 객체 참조일 경우, 매개변수는 해당 참조의 복사본으로 초기화되며, 객체 자체의 새로운 독립적 복사본을 생성하지는 않습니다. 매개변수가 가변 객체를 참조하는 경우, 메소드 또는 컨스트럭터는 이 참조를 사용하여 객체의 상태를 변경할 수 있습니다. 명세서에 명시된 경우가 아니라면 매개변수로 전달된 가변 객체를 수정하지 않는 것이 좋은 프로그래밍 관례입니다.
  • 3.6.A.2 반환 식이 객체 참조를 평가할 경우, 객체의 새로운 복사본에 대한 참조가 아닌 실제 객체 참조가 반환됩니다.
  • 3.6.A.3 Methods cannot access the private data and methods of a parameter that holds a reference to an object unless the parameter is the same type as the method's enclosing class.

출처: College Board AP Course and Exam Description

=는 객체가 아닌 참조를 복사함

객체를 메서드에 전달할 때, Java는 **참조(reference)**를 복사하므로 메서드는 같은(same) 객체에 작용하며, 해당 필드의 변경사항은 **호출자(callers)**에게 표시됩니다. (**원시형(primitives)은 **값에 의해 복사(copied by value)**되므로 Primitive에 대한 변경사항은 반영되지 않습니다.) 메서드는 또한 객체에 대한 **참조(reference)**를 **리턴(return)**할 수 있습니다. String은 **불변(immutable)**하기 때문에 이를 전달하는 것은 안전하지만, 변경 가능한(mutable) 객체를 전달하면 메서드가 이를 변경할 수 있습니다.

Java는 값으로 전달(pass by value): 메서드에 복사본이 전달됨; Java가 갖지 않은 진정한 레퍼런스로 전달(pass by reference)이라면 메서드가 호출자의 변수를 재할당할 수 있었음
Java는 항상 값으로 전달됩니다(왼쪽): 메서드에는 참조의 사본이 할당됩니다. Java가 지원하지 않는 진정한 참조로 전달(오른쪽)이라면 메서드가 호출자의 변수 자체를 재할당할 수 있습니다.

시험 기술: 메서드 내부에서 객체의 필드를 수정하면 원본에 영향을 미치지만, 재할당하는 것(param = new...)은 호출자에 영향을 주지 않습니다.

작업 예제. s이 점수 50를 가진 Student이라고 가정하고, tweak(s)을 호출해 봅시다:

public static void tweak(Student a) {
    a.setScore(100);          // (1) mutates the shared object
    a = new Student("Z", 0);  // (2) repoints the local copy only
    a.setScore(5);            // (3) changes only the new local object
}

라인 (1)은 객체 s이 가리키는 대상을 변경하므로 호출자는 이제 100을 봅니다. 라인 (2)는 메서드 자체의 레퍼런스 복사본이 새로운 객체를 가리키게 만들어 – 호출자의 s는 건드리지 않음 – 라인 (3)은 오직 그 새로운 객체에만 영향을 미칩니다. 호출 후, s.getScore()은 100: 변이는 유지되었으나 재할당은 유효하지 않았습니다.

English 한국어
caller 호출자
Primitives/ˈprɪmɪtɪvz/ 기본 타입
copied by value 값에 의해 복사됨
immutable/ɪˈmjuːtəbl/ 불변
mutable 가변적
static (class) variable/ˈstætɪk ˈveərɪəbl/ 정적(클래스) 변수
static method/ˈstætɪk ˈmeθəd/ 정적 메서드
3.7

클래스 변수와 클래스 메서드

Syllabus

학습 목표 3.7.A: 클래스 메소드를 통해 클래스의 거동을 정의하는 코드를 작성합니다.

  • 3.7.A.1 클래스 메소드는 매개변수를 통해 클래스의 인스턴스가 전달되지 않는 한 인스턴스 변수의 값을 읽거나 변경하거나 인스턴스 메소드를 호출할 수 없습니다.
  • 3.7.A.2 클래스 메소드는 클래스 변수의 값을 읽거나 변경할 수 있으며, 다른 클래스 메소드를 호출할 수 있습니다.

학습 목표 3.7.B: 클래스에 속하는 클래스 변수를 선언하는 코드를 작성합니다.

  • 3.7.B.1 클래스 변수는 클래스에 소속되며, 하나의 클래스에 속한 모든 객체가 클래스 변수의 단일 복사본을 공유합니다. 클래스 변수는 변수 타입 앞에 static 키워드를 사용하여 지정됩니다.
  • 3.7.B.2 public로 지정된 클래스 변수는 클래스가 아닌 객체에 속하기 때문에, 클래스 바깥에서 클래스 이름과 점(.) 연산자를 사용하여 접근해야 합니다.
  • 3.7.B.3 변수를 final로 선언하면 그 값을 변경할 수 없습니다.

출처: College Board AP Course and Exam Description

정적 vs 인스턴스 필드

정적(static/클래스) 변수는 static으로 표시되며, 클래스의 모든 객체에 의해 공유됩니다 – 총 한 개의 복사본만 존재(예: 생성된 객체 개수를 세는 카운터). 정적 메서드는 클래스에 속하며 인스턴스 필드를 직접 사용할 수 없습니다. 클래스 이름을 통해 접근합니다: Student.getCount().

풀이 예제. 새로운 Ticket마다 번호를 부여하여 1부터 세세요:

public class Ticket {
    private static int count = 0;   // one copy, shared
    private int number;             // one per object

    public Ticket() {
        count++;
        number = count;
    }
    public int getNumber() { return number; }
    public static int getCount() { return count; }
}

Ticket a = new Ticket(); Ticket b = new Ticket(); Ticket c = new Ticket(); 이후, a.getNumber()은 1이며, c.getNumber()은 3이고 Ticket.getCount()은 3입니다. 만약 count가 static가 아니라면, 각 객체는 고유한 count을 가지게 되며, 모든 티켓은 숫자 1이 되고, getCount은 static일 수 없습니다.

3.8

범위와 접근

Syllabus

학습 목표 3.8.A: 코드 내에서 변수를 사용할 수 있는 위치를 설명합니다.

  • 3.8.A.1 *로컬 변수(local variables)*는 코드 블록의 헤더나 본체에 선언된 변수입니다. 로컬 변수는 선언된 블록 내에서만 접근할 수 있습니다. constructors와 메서드는 코드 블록이므로, constructors 또는 메서드의 매개변수도 로컬 변수로 간주됩니다. 이러한 변수는 constructor 또는 메서드 내에서만 사용될 수 있으며, public 또는 private로 선언될 수 없습니다.
  • 3.8.A.2 로컬 변수 또는 매개변수와 인스턴스 변수의명이 동일한 경우, 컨스트럭터 또는 메소드 본문 내에서는 변수 이름이 인스턴스 변수 대신 로컬 변수를 가리킵니다.

출처: College Board AP Course and Exam Description

범위란 이름이 가시성 있는 영역을 의미합니다. 메서드 내에서 선언된 로컬 변수는 해당 메서드 내부에서만 존재하며, 파라미터는 해당 메서드 내에서만 유효하고, 인스턴스 변수는 객체 전체에서 가시성 있습니다. 접근 지정자는 클래스 간 가시성을 제어합니다: private(현재 클래스 전용) versus public(어디서나 사용 가능). 로컬 변수는 동일한 이름의 필드를 **음영 처리(shadow)**하여 버그의 원인이 됩니다.

해설 예제. 버그를 찾아보십시오:

public void setScore(int score) {
    score = score;
}

파라미터 score가 필드를 음영 처리하므로 양변 모두 파라미터를 의미합니다: 메서드는 파라미터를 자신에게 복사하고 필드는 절대 변경되지 않습니다. 해결책은 this.score = score;(다음 섹션 참고) 또는 다른 파라미터명인 newScore을 사용하는 것입니다.

이름 선언 위치 가시성 범위
인스턴스 변수 클래스 내, 메서드 외부 클래스의 모든 메서드
파라미터 메서드 헤더 해당 메서드만
로컬 변수 메서드 또는 블록 해당 줄부터 블록 끝까지
for (int i …)의 루프 변수 for 헤더 해당 루프만
전역 변수는 어디에서나 Visible; 로컬 변수는 블록 내부에서만 Visible
전역 변수는 어디에서나 Visible; 로컬 변수는 블록 내부에서만 Visible
English 한국어
Scope/skəʊp/ 범위
shadow/ˈʃædəʊ/ 그림자
current object 현재 객체
3.9

this 키워드

Syllabus

학습 목표 3.9.A: 자기 참조(self-referencing) 표현에 대한 코드를 작성하고, 이러한 표현의 결과를 결정합니다.

  • 3.9.A.1 Within an instance method or a constructor, the keyword this acts as a special variable that holds a reference to the current object—the object whose method or constructor is being called.
  • 3.9.A.2 this 키워드를 사용하여 현재 객체를 메소드 호출 시 인자로 전달할 수 있습니다.
  • 3.9.A.3 클래스 메소드는 this 참조를 가지지 않습니다.

출처: College Board AP Course and Exam Description

this은 현재 객체를 가리키는 참조입니다. 동일한 이름의 매개변수로부터 필드를 구분하거나, 같은 객체의 다른 메소드를 호출하는 데 사용합니다:

public Student(String name, int score) {
    this.name = name;      // this.name is the field; name is the parameter
    this.score = score;
}

시험 기술: 컨스트럭터나 세터의 매개변수가 필드와 동일한 이름을 가질 때, 반드시 this.field = param을 작성해야 합니다 – this 없이 할당하면 아무런 유효한 작업이 이루어지지 않습니다.

3.9

시험 팁

  • 메소드와 클래스를 이용한 설계: 데이터를 private 필드로 감싸고, 공개된 메소드를 통해 동작을 노출합니다.
  • 객체와 그 클래스의 차이를 알고, 객체가 **값으로 전달(pass-by-value)**됨을 이해하십시오 – 매개변수는 참조의 복사본을 받으므로 메소드는 객체의 상태를 변경할 수 있지만, 매개변수를 재할당하면 caller에 영향을 주지 않습니다(Java는 참조로 전달되는 pass-by-reference가 없습니다).
  • 배열과 ArrayList을 안전하게 순회하십시오 – 크기는 length vs .size()이며, 루프 중 제거 시 인덱스가 이동합니다.
  • 재귀 메서드의 결과를 확인하기 위해 추적하십시오: 먼저 **기본 경우(base case)**를 찾고, 각 재귀 호출이 반환값에 도달하도록 따르십시오.(재귀 코드 작성은 시험 범위를 벗어납니다.)
  • 상속 용어를 식별하십시오: 초기(superclass), 하위(subclass), 메서드 오버라이딩, 그리고 Object를 제외한 모든 Java 클래스가 Object의 직접 또는 간접 하위 클래스임을 알 것(상속 설계 및 구현은 시험 범위를 벗어납니다).
English 한국어
base case/beɪs keɪs/ 기본 경우
recursive call/rɪˈkɜːsɪv kɔːl/ 재귀 호출
inheritance/ɪnˈherɪtəns/ 상속
superclass/ˈsuːpəklæs/ 상위 클래스
subclass/ˈsʌbklæs/ 하위 클래스
method overriding/ˈmeθəd ˌəʊvəˈraɪdɪŋ/ 메서드 오버라이딩

이 주제에 대한 인터랙티브 수업

즉시 체크 기능 exercises를 통해 단계별로 진행하세요.

과거 시험지

AP 컴퓨터 과학 A 내 추가 주제

로그인 또는 계정 만들기

IGCSE, A-Level & AP