📚
Python_Study
  • Python_Study
  • OT
    • 스터디 소개
    • 백준 설정하기
    • 질문 / 답변 / 과제 인증 방법
  • 1주차
    • 입출력과 변수, 주석
    • 제어문 1
    • 제어문 2
    • 제어문 3
    • 복습 문제
  • 2주차
    • 다양한 출력 방법
    • 문자열
    • 리스트(list)
    • 튜플(tuple)
  • 3주차
    • 다양한 함수
    • 세트(set)
    • 딕셔너리(dict)
    • 복습 문제
  • 4주차
    • 멤버 연산자
    • 아스키 코드
    • EOF
    • 복습 문제
  • 5주차
    • 진법 변환
    • 회문(팰린드롬)
    • 스택(stack)
    • 복습 문제
  • 6주차
    • 2차원 리스트
    • 정렬 심화
    • 자주 사용하는 모듈
    • 복습 문제
  • 7주차
    • 카이사르 암호
    • 순열과 조합
    • 큐(queue), 덱(deque)
    • 복습 문제
  • 8주차
    • 시계 문제
    • 얕은 복사, 깊은 복사
    • 재귀 함수 Ⅰ
    • 복습 문제
  • 9주차
    • 재귀 함수 Ⅱ
    • 그래프 알고리즘 소개
    • 플러드 필
    • 복습 문제
  • 10주차
    • 시뮬레이션Ⅰ
      • BOJ 15686 - 치킨 배달
      • BOJ 17070 - 파이프 옮기기 1
      • BOJ 21608 - 상어 초등학교
      • BOJ 11559 - Puyo Puyo
  • 11주차
    • 시뮬레이션 Ⅱ
      • BOJ 8972 - 미친 아두이노
      • BOJ 16234 - 인구 이동
      • BOJ 17135 - 캐슬 디펜스
      • BOJ 21610 - 마법사 상어와 비바라기
Powered by GitBook
On this page
  • 가변 객체, 불변 객체
  • 복사의 종류
  • 얕은 복사(shallow copy)
  • 깊은 복사(deep copy)
  • 같은 객체인지 확인하는 방법

Was this helpful?

  1. 8주차

얕은 복사, 깊은 복사

Previous시계 문제Next재귀 함수 Ⅰ

Last updated 4 years ago

Was this helpful?

알고 있으면 좋은 내용: C언어 - 포인터

가변 객체, 불변 객체

  • 가변 객체(mutable): 값을 수정할 수 있는 객체

  • 불변 객체(immutable): 값을 수정할 수 없는 객체

객체 종류

데이터 타입

가변 객체

list, dict, set, deque, defaultdict, ....

불변 객체

bool, int, float, str, tuple, unicode, namedtuple, frozenset, ...

불변 객체는 값을 수정할 수 없어서 밑 내용과는 전혀 상관이 없습니다. 하지만 가변 객체의 경우에는 복사를 할 때 얕은 복사와 깊은 복사로 나뉘기 때문에 재귀 함수 문제를 풀기 전에 꼭 알아야 하는 내용입니다.

왜 이 내용이 필요한 것인지 자세한 내용은 9주차 재귀 함수 2에서 설명하겠습니다.

복사의 종류

얕은 복사(shallow copy)

코딩에서 복사하는 방법은 두 가지로 나뉩니다. 하나는 메모리 주소 값을 복사하는 얕은 복사와 메모리 주소를 새로 할당 받아 객체가 가지고 있는 값을 복사하는 깊은 복사 방법입니다. 그중에서도 얕은 복사는 메모리 주소 값을 복사하는 방법입니다.

쉽게 설명해보자면 위와 같이 웃는 그림이 있는 사진을 얼굴이라는 변수명으로 설정했다고 가정해봅시다. 그런데 이 웃는 그림을 풍선이라고 부르는 사람이 있습니다.

그러면 얼굴이나 풍선이나 서로 같은 주소 값을 가리키고 있는 변수명입니다. 그리고 이제 풍선이라고 부르고 있는 웃는 그림을 노랗게 칠했다고 해봅시다.

얼굴이나 풍선이나 서로 같은 주소 값을 가지고 있기 때문에, 풍선이 가지고 있는 웃는 그림을 노랗게 칠하면 얼굴이 가지고 있는 웃는 그림도 노랗게 칠해질 것입니다.

이렇게 메모리 주소 값을 복사하는 방법을 얕은 복사(shallow copy)라고 부릅니다.

얕은 복사의 경우에는 단순히 변수명1 = 객체, 변수명2 = 변수명1 이라고 설정하면 됩니다.

arr1 = [1, 2, 3]
arr2 = arr1 # shallow copy

arr2.append(4)

print(arr2) # [1, 2, 3, 4]
print(arr1) # [1, 2, 3, 4]
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = dict1

dict1['b'] = 9

print(dict1['b']) # 9
print(dict2['b']) # 9

깊은 복사(deep copy)

우리가 보통 복사한다고 말할 때 쓰이는 뜻입니다. 객체를 복사할 때, 객체의 메모리 주소 값이 아니고, 새로운 주소 값을 만들고 객체가 가지고 있는 값을 그대로 새로운 메모리에 복사하여 가지고 오는 것이 깊은 복사입니다.

웃는 그림을 예시로 똑같이 들어본다면

같은 메모리 주소 값을 가지는 것이 아니기 때문에 얼굴이 가지고 있는 웃는 그림과 풍선이 가지고 있는 웃는 그림은 서로 다른 그림입니다. 여기서 풍선을 노랗게 칠해도 얼굴이 가지고 있는 그림에는 영향을 주지 않습니다.

파이썬에서 깊은 복사는 copy()라는 메소드를 사용합니다.

코드 출력물을 확인해보면 얕은 복사와는 다르다는 것을 알 수 있습니다.

arr1 = [1, 2, 3]
arr2 = arr1.copy() # deep copy

arr2.append(4)

print(arr2) # [1, 2, 3, 4]
print(arr1) # [1, 2, 3]
set1 = {1, 2, 3, 3, 3 ,3}
set2 = set1.copy()

set1.add(5)

print(set1) # {1, 2, 3, 5}
print(set2) # {1, 2, 3}

같은 객체인지 확인하는 방법

파이썬에서는 id()함수를 이용하여 객체의 고유 값을 확인할 수 있습니다. 여기서 얕은 복사는 메모리 주소 값을 복사하는 것이니 같은 값을 가지고 있을 것이고, 깊은 복사면 다른 메모리에 값을 복사하여 가지고 오는 것이므로 서로 다른 값을 가지고 있다는 것을 확인할 수 있습니다.

arr1 = [1, 2, 3]
arr2 = arr1 # shallow copy
arr3 = arr1.copy() # deep copy

print(id(arr1))
print(id(arr2))
print(id(arr3))

참고로 is, not is라는 연산자도 있습니다. 서로 같은 객체인지 확인하는 방법입니다.

arr1 = [1, 2, 3]
arr2 = arr1
arr3 = arr1.copy()

print(arr1 is arr2) # True
print(arr3 is arr1) # False