| English | 의미 |
|---|---|
| static variable/ˈstætɪk ˈveərɪəbl/ | 정적 변수 |
| static method/ˈstætɪk ˈmeθəd/ | 정적 메서드 |
두 개의 객체, 하나의 생성 카운트
- Ada와 Bo는 별개의 점수를 가지지만,任一 student를 생성하면 같은 정적 변수,
Student.count이 증가합니다. 두 번의 생성 후 카운트는 2이 되며, Ada의 점수를 변경해도 Bo의 점수는 변하지 않습니다. - 각 값이 묘사하는 것을 비교해 보십시오: 점수는 한 명의 학생을 묘사하지만, 이 카운터는 클래스의 생성을 묘사합니다. Ada에 대한 복사된 참조는 새로운 객체를 생성하지 않으며 카운터를 증가시키지도 않습니다.
각 필드를 올바른 수준에 배치하세요
- 인스턴스 필드는 각 객체에서 별도의 저장 위치를 가집니다. 정적 필드는 어떤 객체도 생성되기 전에도 로드된 클래스에 대해 하나의 저장 위치를 가집니다;
private은 복사 수를 제어하는 것이 아니라 접근을 제어합니다. - 이 작은 단일 스레드 예제에서, 생성자는 생성 시마다
count을 한 번 증가시킵니다. 이는 아직存活해 있는 객체가 아니라 생성된 객체의 수를 세는 것입니다: 레퍼런스를 잃어도 자동으로 감소하지 않습니다.
class Student {
private int score;
private static int count = 0;
public Student(int initialScore) {
score = initialScore;
count++;
}
public int getScore() { return score; }
public void setScore(int newScore) { score = newScore; }
public static int getCount() { return count; }
public static int readScore(Student s) { return s.score; }
}
공유되는 정적 카운트 하나
count는 클래스가 소유하는 하나의 공유된 값입니다.
정적(클래스) 변수란...
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
static은 클래스가 소유하는 하나의 공유된 복사본을 의미합니다.
생성자가 count++를 수행하고 count가 0에서 시작한다면, 객체 3개를 생성한 후의 count 값은 무엇입니까?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
각 생성 시 공유된 카운트가 증가하므로 → 3.
정적 메서드에는 리시버가 없습니다
- 정적 메서드는 암묵적인 현재 객체가 없으므로,
this이나score과 같은 비유기체 필드를 사용할 수 없습니다.getCount()은 class에 속하는 필드인count을 읽을 수 있습니다. - 'static'이 객체와의 작업을 금지하는 것은 아닙니다.
readScore(Student s)은 명시적인 객체 레퍼런스를受け하고,s.score을 읽습니다. 이는Student내부에 위치하여 해당 private 필드에 대한 접근이 허용됩니다. 여기서s은 non-null이어야 합니다.
이 class 내에서 정적 메서드 안의 return score;은 컴파일타임 에러입니다. 표시된 정적 메서드 안의 return s.score;은 유효합니다: 이 레퍼런스는 어떤 학생의 점수를 읽을지 식별합니다.
표시된 Student 클래스 내부에서 정적 메서드는 특정 Student 객체를 명시하지 않고도 return score;를 사용할 수 있다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
오답: score는 인스턴스 필드이며, 현재 정적 메서드에는 암묵적 리시버가 존재하지 않는다. 비공통 Student s 매개변수가 있다면 Student 내부에서 return s.score;는 유효하다.
Student 내부에서 비공통 매개변수 s의 score를 읽을 수 있는 정적 메서드는 무엇인가?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
명시적 참조 s가 해당 객체를 식별하므로, Student 자체도私密한 score 필드에 접근할 수 있다.
Trace 클래스 및 객체 호출
Student a = new Student(50);과Student b = new Student(75);이후,Student.getCount()은 2,a.getScore()는 50이며,b.getScore()은 75입니다.a.setScore(60)는 Ada의 점수만 변경합니다.Student.readScore(a)은 다음 학생을 생성하지 않고 60을 반환합니다. 이 메서드는 static이지만, 명시적 매개변수는 기존 객체를 식별하며 그 상태를 읽습니다.
getScore()와 같은 인스턴스 메서드는 ...에서 호출됩니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
인스턴스 멤버는 특정 객체에서 작동합니다.
합법적 구文을 명확한 스타일로 분리하십시오
- 메서드가 class에 속함을 보여주기 위해
Student.getCount()을 선호하십시오. Java는 또한 이 정적 메서드에a.getCount()을 허용합니다; 이 구문은 카운트가 Ada에게만 국한되게 하지 않습니다. a.getScore()은 Ada를 리시버로 하는 인스턴스 호출입니다.Student.getScore()은 여기서 무효합니다: 메서드는 객체가 필요하며 static이 아니기 때문입니다; 필드와 메서드의 종류는 각자의 책임에 따라 선택하십시오.
getCount()가 Student의 정적 메서드임을 가장 잘 보여주는 호출은 무엇인가?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
Student.getCount()는 명확히 클래스명을 지칭한다. Java에서는 정적 메서드에 대해 student.getCount()도 허용하지만, 이 표기는 클래스 수준의 의미를 모호하게 만든다.
레퍼런스 복사 예측하기
- 생성된 두 학생 객체로 시작할 때,
Student alias = a;는 생성 횟수를 2로 유지합니다.alias.setScore(90)는 Ada의 기존 객체를 변경하므로,a.getScore()은 90가 되고 Bo의 점수는 75로 그대로 남습니다. new Student(...)의 실행 횟수를 세고, 각 객체의 상태를 별도로 추적하십시오. 어세서 호출이나 레퍼런스 할당은 학생을 생성하지 않으며, 정적 메서드도 명시적으로 제공된 객체를仍可 읽을 수 있습니다.
정적 필드는 class 상태를 저장하고, 인스턴스 필드는 객체 상태를 저장합니다. 정적 메서드에는 this이 없지만, 명시적인 객체 레퍼런스를 사용할 수 있습니다. class-qualified 정적 호출을 선호하고, 생성 카운트와 live-object 카운트를 구분하십시오.
두 명의 학생이 생성되었으므로 count는 2이다. 이후 Student alias = a; 및 alias.setScore(90);를 실행했다. Student.getCount()은 얼마인가?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
참조 할당이나 점수 변경은构造函数를 실행시키지 않는다. count는 여전히 2로 유지된다.
이 constructors 카운터는 학생에 대한 참조가 소실되면 자동으로 감소한다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
count를 변경하는 코드만이 이를 변화시킨다. 본 예시는 생성 횟수를 세지만 감소 코드를 제공하지 않는다.