Python을 처음 접하면 'Python은 모든것을 객체(object)화 시켜 사용한다'라는 말을 들을 수 있다. 윗 문구에 대한 개념을 이해하는 것이 매우 중요하지만 대부분 글로 되어 있어 이해하기 매우 어렵다. 이를 좀더 쉽게 그림으로 그려 가며 설명해 본다.
1. 객체화란 어떤 과정일까?
위 그림은 단일 오브젝트에 관한 그림이다. 그럼 리스트 형 객체는 어떻게 될까?
그럼 다음의 경우 어떻게 될까?
b의 3번째 인자 즉 b[2] 값은 a 이지만 바라보는 값은 a 가 아니라 a 가 바라보는 값을 바라보기 때문이다. 이 말은 b 가 정의 되는 순간 b[2] = a 가 아니라 b[2] = 'hi' 가 된다는 것이다. 따라서 a의 값이 이 후 변한다 해도 b[2]의 값은 변하지 않게 된다.
그럼 이번엔 a가 리스트 형인 경우 어떻게 될까?
위에서 말했듯이 왕따 객체는 자동 소멸 된다고 했다. a가 새로 정의 되면서 a 가 전에 바라보던 값이 사라져야 할거 같지만 위와 같이 b[1] 번이 a[0]1 을 바라봄으로서 결과적으로 'hi'는 사라지지 않는 것이다. 그리고 a가 새로 정의 되면서 a[0]2 객체가 생성되어 'hello'를 바라보게 된다.
[code-6]의 실행 결과는 다음 그림과 같다.
이것이 pyhton에서 말하는 '객체화 시킨다'라는 것과 이를 사용하는 방법이다.
만약 다른 언어를 이용해 코딩을 해본적이 없는 사람이라면, python만 알고 있는 사람이라면 위 구조를 모르더라도 경험적으로 위 문제를 조심해 코딩을 해 나갈 것이다. 하지만 이미 몇몇 언어를 알고 있는 사람이라면 python의 특징을 모른채 문법만 알고 쓸 경우가 많을 것이라 생각한다.(파이썬에 이미 통달했다면 모르겠지만 ㅡ_ㅡ) 그래서 위에서 보여준 오류들을 인식 못하고 실컷 코딩을 해 놨더니 이상한 결과가 나오게 된다. 그리고 무엇이 잘 못 되었는지 인식하기도 힘들다.
필자는 지금 python을 이제 공부하기 시작했고 그 전에 아는 언어라고는 MEL(언어라고 할수 있나 ㅡ_ㅡ;;)밖에 없었다. 그러다 보니 python 코딩이 자연스레 MEL 스러워지고 위와 같은 잘못된 결과에 이해를 하지 못했다.
이렇게 python의 특징을 잘 이해해야 python만의 강점을 살릴 수 있다. python은 가장 python 다울때 그 위력을 발휘할 것이다. 혹시 필자처럼 python을로 위장한 다른 코드를 작성하고 있지 않은지 진지하게 생각해 보기 바란다.
1. 객체화란 어떤 과정일까?
[code-1]위와 같은 명령을 실행하면 python은 a 와 'hi'라는 두개의 객체(object)를 생성한다. 그리고 객체 a 는 객체 'hi' 를 바라본다. 따라서 a 를 호출하면 'hi'라는 결과 값을 보여주게 된다.
>> a = 'hi'
[code]-2
>> a
'hi'
>> a = 'hello'
>> a
'hello'
위를 그림으로 표현 하면 다음과 같다.
과거 객체a 가 바라보던 'hi' 의 경우 자신이 바라보거나 자신을 바라보는 객체가 아무것도 없음으로(왕따 객체) 자동 소멸된다.
위 그림은 단일 오브젝트에 관한 그림이다. 그럼 리스트 형 객체는 어떻게 될까?
[code-3]위 결과는 누구나 쉽게 납득 할 수 있는 결과이다.
>>a = 'hi'
>>b = [1, 2, a]
>>b
[1, 2, 'hi']
그럼 다음의 경우 어떻게 될까?
[code-4]결과 값이 이상하지 않은가? [1, 2, 'hello']가 나와야 할거 같지만 그렇지 않다. 그 이유는
>> a = 'hi'
>> b = [1, 2, a]
>> a = 'hello'
>> b
[1, 2, 'hi']
b의 3번째 인자 즉 b[2] 값은 a 이지만 바라보는 값은 a 가 아니라 a 가 바라보는 값을 바라보기 때문이다. 이 말은 b 가 정의 되는 순간 b[2] = a 가 아니라 b[2] = 'hi' 가 된다는 것이다. 따라서 a의 값이 이 후 변한다 해도 b[2]의 값은 변하지 않게 된다.
그럼 이번엔 a가 리스트 형인 경우 어떻게 될까?
[code-5]
>> a = ['hi']
>> b = [1, a]
>> b
[1, ['hi'] ]
>> a = ['hello']
>> b
[1, ['hi']]
[code-6]
>> a = ['hi']
>> b = [1, a]
>> b
[1, ['hi']]
>> a[0] = 'hello'
>> b
[1, ['hello']]
두 코드의 차이점은 a 변수 자체를 변환 하느냐, a 변수의 인자를 변환하는냐 이다. 위 설명에 따르면 두 결과의 차이점이 없어야 할거 같지만 결과값이 다르다. 이것은 위의 말한 b[1] = 'hi'rk 아니다. 정확히 말하자면 b[1] 은 a[0] '객체' 를 바라보고 있는 것이다.
우선 [code-5] 코드의 실행을 그림으로 보자.
위에서 말했듯이 왕따 객체는 자동 소멸 된다고 했다. a가 새로 정의 되면서 a 가 전에 바라보던 값이 사라져야 할거 같지만 위와 같이 b[1] 번이 a[0]1 을 바라봄으로서 결과적으로 'hi'는 사라지지 않는 것이다. 그리고 a가 새로 정의 되면서 a[0]2 객체가 생성되어 'hello'를 바라보게 된다.
[code-6]의 실행 결과는 다음 그림과 같다.
a를 다시 정의 한것이 아니라 a[0]을 다시 정의 했음으로 a[0]2 를 생성하는 것이 아니라
a[0]1 이 바라보는 객체를 다시 생성한 것이다. 그리고 'hi' 객체는 왕따 객체가 되므로 자동 삭제된다.
이것이 pyhton에서 말하는 '객체화 시킨다'라는 것과 이를 사용하는 방법이다.
만약 다른 언어를 이용해 코딩을 해본적이 없는 사람이라면, python만 알고 있는 사람이라면 위 구조를 모르더라도 경험적으로 위 문제를 조심해 코딩을 해 나갈 것이다. 하지만 이미 몇몇 언어를 알고 있는 사람이라면 python의 특징을 모른채 문법만 알고 쓸 경우가 많을 것이라 생각한다.(파이썬에 이미 통달했다면 모르겠지만 ㅡ_ㅡ) 그래서 위에서 보여준 오류들을 인식 못하고 실컷 코딩을 해 놨더니 이상한 결과가 나오게 된다. 그리고 무엇이 잘 못 되었는지 인식하기도 힘들다.
필자는 지금 python을 이제 공부하기 시작했고 그 전에 아는 언어라고는 MEL(언어라고 할수 있나 ㅡ_ㅡ;;)밖에 없었다. 그러다 보니 python 코딩이 자연스레 MEL 스러워지고 위와 같은 잘못된 결과에 이해를 하지 못했다.
이렇게 python의 특징을 잘 이해해야 python만의 강점을 살릴 수 있다. python은 가장 python 다울때 그 위력을 발휘할 것이다. 혹시 필자처럼 python을로 위장한 다른 코드를 작성하고 있지 않은지 진지하게 생각해 보기 바란다.