2023. 2. 9. 17:31ㆍ코딩/파이썬
다른 언어를 사용하다 객체지향언어를 처음 접하면 변수와 객체의 개념이 헷갈릴 수가 있다.
변수, 객체, 클래스의 개념을 잘 이해해야 파이썬을 제대로 쓸 수 있다.
객체란 ?
파이썬의 모든 것은 객체로 이루어진다. Python Glossary에서는 객체를 다음과 같이 정의하고 있다.
상태(속성 or 값)와 행동(메서드)을 갖고있는 데이터
숫자, 문자와 같은 값에도 파이썬은 다양한 속성을 부여하고있으며 이러한 객체는 클래스를 기반으로 만들어진다.
클래스는 간단히 말해 객체를 찍어내는 틀이다. 알기 쉽게 쿠키를 예를 들어 설명해보자면 클래스는 쿠키를 찍는 모양틀이고 이 틀로 만들어진 쿠키들이 객체가 되는 것이다.
이렇게 연관된 속성과 행위를 하나로 묶은 데이터를 '객체'라고 한다.
파이썬 콘솔에 숫자와 문자의 타입을 출력하면 다음과 같이 나온다. 여기서 정수는 int 클래스의 객체이고, 문자는 str 클래스의 객체임을 알 수 있다. 객체들이 어떤 메서드를 가지고 있는지 알고싶다면 dir함수를 사용하면 된다.
다음은 dir(int)를 입력했을 때 볼 수 있는 정수의 메서드들이다.
'__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real',
'to_bytes'
변수란?
변수가 무엇인지 설명하기 앞서 위 사진을 보자. val3과 val4는 분명 다른 변수인데 is 연산자로 비교를 하니 두 변수가 같은 것이라고 나온다. 이는 파이썬이 변수를 쓰는 방식때문이다.
C에서 변수는 데이터를 담는 공간이지만, 파이썬에서 변수는 객체에 단지 이름을 붙여주는 역할일 뿐이다.
C에서 int a와 int b에 5를 저장하면 a와 b가 할당이 되고, 그 공간에 5가 저장된다. 메모리상에 '5'가 두개 존재하는 것이다.
파이썬에서는 val3과 val4에 'prOv3rt'라는 값이 각각 저장되는게 아니라 val3과 val4가 'prOv3rt'라는 동일한 객체를 가리킨다.
두 변수가 같다고 나오는 것은 이때문이다.(is는 단순한 값이 아닌 객체를 비교하는 연산자이다)
그렇다고 값이 같을 때 변수들이 항상 같은 객체를 가리키는 것은 아니다. 숫자의 경우 자주 사용할 것 같은 범위는 변수들이 같은 객체를 가리키지만 그 범위를 넘어가면 id가 달라질 수 있다.
이 경우 C언어처럼 변수에 객체가 복사되는건가??
def compare(a):
fir = a
sec = 100
i = 1
while i < 10000:
print(f"결과 : {fir is sec}, {fir,sec}")
fir += 1
sec += 1
i += 1
compare(100)
호기심에 실험해 본 결과, 256까지 같다고 나온다.
뭐지 이 애매한 숫자는...
'코딩 > 파이썬' 카테고리의 다른 글
파이썬 데이터프레임(Dataframe) (0) | 2023.02.09 |
---|---|
딕셔너리(Dictionary) (0) | 2023.02.09 |
리스트(List) (0) | 2023.02.09 |
모듈(Module) (0) | 2023.02.09 |
사용차 입출력 (0) | 2023.02.09 |