6단원 쪽지시험 정답: Python 클래스 (Class)¶
문제 1. self.값 += n 의 함정¶
① 0
② 8
③ 10
④ 18
해설
self.total += n은 self.total = self.total + n으로 동작합니다.
s1.add(5) → s1에 인스턴스 변수 total=5 생성 (Score.total은 여전히 0)
s1.add(3) → s1.total = 5 + 3 = 8
s2.add(10) → s2에 인스턴스 변수 total=10 생성
| 항목 | 식 | 결과 | 이유 |
|---|---|---|---|
| ① | Score.total |
0 |
클래스 변수는 변경되지 않음 |
| ② | s1.total |
8 |
s1의 인스턴스 변수 (5+3) |
| ③ | s2.total |
10 |
s2의 인스턴스 변수 |
| ④ | s1.total + s2.total |
18 |
8 + 10 |
핵심: self.total += n은 클래스 변수를 수정하는 것이 아니라, 각 인스턴스에 새로운 인스턴스 변수를 만듭니다.
문제 2. 공유 가변 클래스 변수¶
① 3
② 3
③ True
해설
class Basket:
items = [] # 모든 인스턴스가 동일한 리스트 객체를 공유
self.items.append(item)은 리스트 자체를 교체하지 않고 기존 리스트를 수정합니다.
따라서 a.items와 b.items는 동일한 리스트 객체입니다.
| 항목 | 결과 | 이유 |
|---|---|---|
| ① | 3 |
a.add 2번 + b.add 1번 = 공유 리스트에 3개 |
| ② | 3 |
같은 리스트이므로 b도 3개 |
| ③ | True |
is는 동일 객체 여부 — 같은 리스트 |
올바른 수정: __init__에서 self.items = []로 인스턴스마다 별도 생성
문제 3. 이름 맹글링 + 상속¶
① 바둑이 (진돗개)
② 바둑이
③ True
④ False
해설
self.__name → _Animal__name 으로 저장
Dog가 Animal을 상속했어도, __name은 Animal 클래스 기준으로 _Animal__name에 저장됩니다.
get_name()은 Animal 클래스 내부 메서드이므로 self.__name으로 정상 접근 가능합니다.
| 항목 | 식 | 결과 | 이유 |
|---|---|---|---|
| ① | d.info() |
바둑이 (진돗개) |
get_name()이 _Animal__name 반환 |
| ② | d.get_name() |
바둑이 |
부모 메서드 상속 |
| ③ | hasattr(d, "_Animal__name") |
True |
실제 저장 이름 |
| ④ | hasattr(d, "__name") |
False |
__name으로는 접근 불가 |
문제 4. str + 상속 오버라이딩¶
① Shape(red)
② Circle(blue, r=4)
③ 48
④ True
⑤ False
해설
| 항목 | 식 | 결과 | 이유 |
|---|---|---|---|
| ① | print(s) |
Shape(red) |
Shape.__str__ 호출 |
| ② | print(c) |
Circle(blue, r=4) |
Circle.__str__이 오버라이딩 |
| ③ | c.area() |
48 |
3 * 4 * 4 = 48 |
| ④ | isinstance(c, Shape) |
True |
Circle은 Shape의 자식 클래스 |
| ⑤ | type(c) == Shape |
False |
type(c)는 Circle — isinstance와 다름 |
핵심 차이:
- isinstance(c, Shape) → 상속 관계 포함 → True
- type(c) == Shape → 정확한 타입만 비교 → False
문제 5. 클래스 변수 카운터 + classmethod¶
① 2
② 3
③ Robot:R2D2
④ 3
⑤ 3
해설
def __init__(self, name):
Robot.count += 1 # 클래스 이름으로 직접 클래스 변수 수정 → 정상 동작
| 항목 | 식 | 결과 | 이유 |
|---|---|---|---|
| ① | Robot.how_many() (r1,r2 후) |
2 |
객체 2개 생성 |
| ② | Robot.how_many() (r3 후) |
3 |
객체 3개 생성 |
| ③ | print(r1) |
Robot:R2D2 |
__str__ 호출 |
| ④ | r1.count |
3 |
인스턴스를 통해 클래스 변수 읽기 가능 |
| ⑤ | Robot.count |
3 |
클래스 변수 직접 접근 |
Robot.count += 1은 문제 1과 달리 클래스 이름으로 직접 접근하므로 클래스 변수를 올바르게 수정합니다.