더북(TheBook)

07 | 객체의 불변성

R의 객체는 (거의 대부분의 경우에) 불변immutable이다.[4] 객체 지향 프로그래밍OOP, Object Oriented Programming에 친숙하지 않은 독자라면, 객체라는 용어는 R에서 메모리에 할당된 데이터 구조들을 뜻한다고 생각하면 된다. 예를 들어, 벡터를 하나 메모리에 만들었으면 그것이 객체고, 리스트를 하나 만들었어도 객체다.

프로그래밍에서 값이 불변이란 말은 수정하는 것이 불가능하다는 뜻이다. 따라서 a라는 리스트 객체를 수정하는 것처럼 보이는 다음 코드는 실제로는 a 객체를 변경하는 것이 아니다.

> a <- list()
> a$b <- c(1, 2, 3)

코드를 보면 리스트 a에 새로 필드 b를 만들고 거기에 c(1, 2, 3)을 할당하는 수정처럼 보인다. 그러나 실제로 일어나는 일은 a를 복사한 새로운 객체 a′을 만들고, 이 a′에 필드 b를 추가하고 해당 필드에 c(1, 2, 3)을 채워넣은 다음, 변수명 a가 a′을 가리키도록 하는 것이다.

그림 3-1을 살펴보자. 최초의 변수 a는 어떤 객체에 붙여진 이름이었다. 그러나 그 객체의 값을 바꾸면 이전 객체는 버려지며 새로이 a′=c(1, 2, 3)을 담고 있는 새로운 객체가 만들어지고, a는 이 새로운 객체의 이름이 된다.

그림 3-1 객체의 불변성
그림 3-1 객체의 불변성

이를 직접 코드로 확인해보자. 메모리를 추적하기 위해 먼저 다음 두 가지 함수를 알아둘 필요가 있다.

표 3-7 객체의 복사 추적 관련 함수

tracemem : 객체의 복사를 추적한다.

tracemem(
  x  # 추적할 R 객체
)

untracemem : 객체 복사 추적을 중단한다.

untracemem(
  x  # 추적을 중단할 R 객체
)
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.