콘텐츠로 이동

6단원 쪽지시험 정답: Python 클래스 (Class)


문제 1. self.값 += n 의 함정

① 0
② 8
③ 10
④ 18

해설

self.total += nself.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.itemsb.items는 동일한 리스트 객체입니다.

항목 결과 이유
3 a.add 2번 + b.add 1번 = 공유 리스트에 3개
3 같은 리스트이므로 b도 3개
True is는 동일 객체 여부 — 같은 리스트

올바른 수정: __init__에서 self.items = []로 인스턴스마다 별도 생성


문제 3. 이름 맹글링 + 상속

① 바둑이 (진돗개)
② 바둑이
③ True
④ False

해설

self.__name    _Animal__name 으로 저장

DogAnimal을 상속했어도, __nameAnimal 클래스 기준으로 _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 CircleShape의 자식 클래스
type(c) == Shape False type(c)Circleisinstance와 다름

핵심 차이: - 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과 달리 클래스 이름으로 직접 접근하므로 클래스 변수를 올바르게 수정합니다.