• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

연결리스트(Linked List)-1 전반적인 코드

23.02.07 01:13 작성 23.02.07 01:15 수정 조회수 520

2

서론

class Node:
    def __init__(self, value=0, next = None):
        self.value = value
        self.next = next

first = Node(1)
second = Node(2)
third = Node(3)
first.next = second
second.next = third
first.value = 6

 

위 코드는 연결리스트-1 강의에 등장하는 코드입니다.

first = Node(1)

first.next = second

first.value = 6

위 3개의 코드 모두 "=" 이라는 할당 연산자를 통해서 데이터를 변수에 저장하고 있는데요.

 

"first가 Node(1)을 가리킨다"

"first.next에는 주소가 저장된다."

"first.value에는 6이 저장된다."

 

뭔가 여기서 저는 뇌에서 뭔가 이상한데(?)라고 느겼습니다.

 

first, first.next, first.value 라는 변수에

모두 "="이라는 동일한 할당 연산자를 사용함에도 불구하고,

"가리킨다" "값을 저장한다" "주소를 저장한다"

파이썬이 천재인가? 동일한 할당("=")연산자인데,

어쩔 때는 알아서 가리키고,

어쩔 때는 알아서 주소을 저장하고,

또 어쩔 때는 값를 저장한다


 

Linked List 이해하기1.png

 

 

질문1

위 그림을 토대로 말씀드리자면,

1."가리킨다" → D관점

2."값을 저장한다" → C관점

3."주소를 저장한다" → A관점

결국엔 다 "동일한 의미"를 다르게 표현하고 있다는 사실입니다.

 

first= Node(1)

실제로는 first에 Node(1)의 번지인 100번지(가정)가 저장되어

100번지에 저장되어 있는 Node(1)객체를 가리키는 것이고,


second=Node(2)

실제로는 second에 Node(2)의 번지인 200번지(가정)가 저장되어

200번지가 저장되어 있는 Node(2)객체를 가리키는 것이고,


first.next = second

second에 저장되어 있는 200번지

주소를 first.next에 저장해서

결국엔 first.next가

Node(2)를 가리키게 되는 것이고,

 


first.value에 600번지(가정)가 저장되어 6을 가리키고 있으나

C관점에서 "first.value에는 6이 저장"되어 있다

라고 표현하고 있는 것 같습니다.

 


제가 이해한 게 맞나요??

결국 다 동일한 의미인 거죠?

 

<질문의도>

분명히 저와 같은 생각하시는 분이 계실 것으로

생각됩니다.

저도 연결 리스트 처음 배울 때

파이썬이 천재인가

어쩔 때는 "값"을 저장하고,

어쩔 때는 "가리킨다"라고 표현하고,

어쩔 때는 "주소"를 저장한다라고 표현하고,

이 내용이 다른 분들한테 조금이라도 도움이 됐으면

좋겠습니다.

 

답변 1

답변을 작성해보세요.

0

안녕하세요 똑같이썼는데안돼님!

그림까지 그려주시면서 좋은 내용 공유해주셔서 감사합니다.

 

말씀해주신대로 파이썬은 조금 다른언어랑 다른점들이 있죠. 대표적으로 C언어나 JAVA의 경우에는 기본형 변수와 참조형 변수를 구분해서 사용을 하는데, 파이썬에서는 그냥 타입도 지정하지 않고 구분해서도 사용하지 않습니다. 그 이유가 변수는 값을 저장하는 것이 아니라 객체의 주소를 저장하기 때문이죠.

그래서 변수가 가리키고 있는 (일단 '가리키는'으로 통일을 해보겠습니다.) 객체의 특성에 따라서 같은 '=' 연산자를 썼음에도 불구하고 다른 행동양상을 보이기도 합니다.

질문자님께서 말씀해주셨듯이 저도 처음에 이해가 안갔습니다. C언어를 베이스로 포인터를 유용하게 사용했던 저로서는 파이썬은 천재인가? 라는 생각도 들었고 조금 어려웠던 기억이 나네요. 사실 이에 대한 설명은 mutable, immutable에 대한 설명도 추가해야 해서 입문자분들께 부담스럽지 않을까? 라는 생각도 들더라고요.

강의를 제작하는 입장에서는 "어느 부분에 초점을 두어 설명드려야 코딩테스트 합격을 하시는데 더 도움을 많이 드릴 수 있을까"에 대한 고민이 많았습니다. 코딩테스트를 위해 알아두면 좋을 배경지식이 정말 많은 상황에서 무엇을 우선해서 설명드려야 어렵지 않을까 생각을 했었는데, 제가 인상깊게 읽었던 "윤성우의 열혈 C언어"에서는 어물쩡 넘어가기 스킬을 쓰시더라구요. 물론 해당 내용에 대해서 간단히 언급하시고, 뒤에가서 설명한다는 표현들을 많이 쓰셨는데, 저는 그런 표현없이 어물쩡 넘어가기만 한 것 같군요!

 

아마 몇몇 분들은 아! 맞아 나도 저거 의아했는데 라고 느끼는 분들도 있을거고, 어떤 분들은 잉? 이게 뭐지 하고 가리킨다와 저장한다의 차이를 못느꼈던 분들도 있을거에요. 아마 각자의 현재 학습량에 따라 달리보이는거겠죠? 그래서 질문자님께서 굉장히 친절하게 설명해주신 내용을 참고하시거나 구글링을 해서 파이썬의 변수의 작동원리를 알아본다면 도움이 많이 될 겁니다. 한편 엥? 난 그런 미묘한 차이 못느꼈는데 하시는 분들은 일단 그냥 넘어가셔도 됩니다. 하지만 결국은 알아야 하는 내용입니다. 그래서 중요한 순서대로 코테 입문 -> 코테 심화 -> python 강의 순으로 업로드가 될 것 같습니다. 결국 입문이 가장 중요해도 심화를 몰라선 안되고, python (또는 JAVA, C/C++의 특성을 설명하는)강의도 필요하게 될 겁니다.

사실 제일 베스트는 틈틈히 간단하게라도 언급하고 갔다면 똑같이썼는데안돼님과 같이 미묘한 차이를 알아차리는 분들도 다 명쾌하게 풀리고 갈 수 있었을 텐데, 그러지 못해서 조금 죄송스러운 마음도 드네요. 다행인점은 똑같이썼는데안돼님 덕분에 이러한 많은 분들이 도움을 받을 것 같아요! 감사드립니다.

 

결론:

  1. 질문자님께서 이해하신게 맞습니다. 파이썬 변수는 참조형 뿐이다. 표현 방식을 여러 관점으로 나눠서 설명하신 것은 저도 참고해보겠습니다 :)

  2. 좋은 내용 공유해주셔서 감사합니다~

  3. 입문 -> 심화 -> python 강의 순으로 업로드 예정인데, 얼른 추가해서 명쾌함을 모두에게 선사드리도록 하겠습니다!!

  4. 이렇게 질문으로 다른분들께 도움주시는 분들 모두 다시 한번 감사드립니다.