Python에서는 하나의 객체가 또 다른 객체를 자신의 속성(attribute)으로 가질 수 있습니다. 이렇게 중첩된 객체 안의 객체는 점(.) 연산자를 이용한 속성 접근과 리스트 인덱싱을 조합하여 간단하게 접근할 수 있습니다.
아래 예제를 통해 객체 내부에 포함된 객체의 메서드와 데이터에 순차적으로 접근하는 방법을 살펴보겠습니다.
예제 코드
class P:
def __init__(self):
self.w = Q()
class Q:
def __init__(self):
self.list = [3, 4, 5]
def function(self):
self.list[2] = 7
y = P()
f = [y]
print(f[0].w.function())
print(f[0].w.list)실행 결과
None [3, 4, 7]
코드 설명
1. 중첩 객체 구조 만들기
클래스 P의 생성자(__init__) 안에서 클래스 Q의 인스턴스를 생성하여 self.w에 저장합니다. 즉, P 객체 하나당 내부에 Q 객체가 하나씩 포함되는 구조입니다.
2. 객체를 리스트에 담기
y = P()로 객체를 생성한 뒤, f = [y]를 통해 이 객체를 리스트에 넣습니다. 따라서 f[0]은 곧 객체 y를 의미합니다.
3. 점 연산자로 중첩 객체 접근하기
f[0].w.function()은 다음과 같이 단계적으로 해석됩니다.
f[0]: 리스트의 첫 번째 요소, 즉P객체yf[0].w:P객체 내부의Q객체f[0].w.function():Q객체의 메서드 호출 → 리스트의 세 번째 요소를7로 변경
4. None이 출력되는 이유
function() 메서드는 리스트 값을 변경만 할 뿐 아무런 값도 return하지 않습니다. Python에서 return 문이 없는 함수는 자동으로 None을 반환하므로, 첫 번째 print 결과가 None으로 표시됩니다.
5. 최종 값 확인
f[0].w.list를 출력하면 메서드 호출로 인해 세 번째 요소가 5에서 7로 바뀐 [3, 4, 7]이 출력됩니다.
정리
객체 안의 객체에 접근할 때는 점(.) 연산자를 체인처럼 연결하면 됩니다. 리스트나 딕셔너리 같은 컨테이너에 객체가 담겨 있다면, 먼저 인덱싱으로 객체를 꺼낸 후 점 연산자로 내부 속성과 메서드에 접근하는 방식을 기억하면 됩니다.