2019.03.20 TIL
(TIL은 스스로 이해한 것을 바탕으로 정리한 것으로 오류가 있을 수 있습니다)
# 질문에 답하기.
- 객체란? (클래스, 객체, 인스턴스, 프로퍼티, 메소드에 대해)
class - 객체를 만들어 내기 위한 틀
class는 객체를 만들어내기 위한 약속이다.
class는 객체의 속성(property)과 동작(method)을 정의한다.
object - class라는 틀을 가지고 만들어낸 실물(ex. 자동차)
파이썬에서의 객체
- 컴퓨터가 보는 객체 : 클래스를 이용해 만들어진 변수와 함수를 가진 메모리 공간
- 우리가 보는 객체 : 현실 세계의 사물을 모델링 한 것
object란?
- 관련 있는 변수와 함수를 한곳에 모아(bundling) 놓은 곳(메모리의 영역)
- 변수 - 상태정보
- “관련 있는” 변수, 함수” “한곳에 모아” 가 중요하다.
- class를 통해 생성되므로 class의 속성을 가지고 있어야 한다.
- 속성
- instance member(변수)
- 각자의 객체가 가지는 값(값 = 상태정보)
- __init__에 보면 변수가 나와 있음
- 같은 속성을 가지고 있으나 속성 값이 다르다.
- instance method(함수)
- 객체가 할 수 있는 행동, 기능
- instance member(변수)
—> 절차지향에서는 전체 프로그램을 다 봐야하지만.
—> 객체 단위로 프로그램을 유추해볼 수 있다.
컴퓨터 프로그램은 정보가 어떤 경로(네트워크, 디스크, 센서, 사람의 손 등)로 입력되든지, 결국은 그 정보를 메모리 위에 올린 뒤에 처리한다. 음식을 어떻게 준비하든지 결국은 식탁 위에 올려서 먹는 것처럼 말이다. 메모리는 그냥 비트(숫자)를 나열한 단순하고 넓은 판이기 때문에, 메모리 위에 올려 둔 정보를 의미 있는 덩어리로 묶어두기 위한 단위가 필요하다. 파이썬에서는 객체(object)라는 단위로 메모리 위의 정보를 관리한다.
객체에는 값(value)·유형(type)·정체성(identity)이라는 세 특성이 있다. 값은 메모리에 기록된 내용이다. 가변 객체는 값이 바뀔 수 있지만 불변 객체는 값이 바뀌지 않는다. 유형은 데이터의 종류로, 유형에 따라 그 값을 어떻게 읽고 다루어야 할지가 결정된다. 정체성은 각각의 객체를 식별하기 위한 고유번호로, 객체가 메모리 속에서 위치한 주소 값이기도 하다. 값과 유형이 동일한 데이터가 데이터가 메모리 공간에 여러 개 존재할 수 있지만, 이들은 서로 별개의 객체이며 정체성이 서로 다르다.
ex)
a = 10
b = 10
a == b (객체의 값 비교)
type (a) == type(b) (두 객체의 유형 비교)
id(a) == id(b) (두 객체의 정체성 비교)
추가 개념정리
a = 10
b = a
a += 10
print(b)
위를 계산하게 되면 a라는 이름은 10이라는 값 객체를 가르키게 되고 b=a라고 할당해주었을 때 b는 a를 가르키는게 아니라(이중 할당 x) a의 값 객체를 가르킨다.
따라서 a += 10을 해주었을 때 integer은 immutable이므로 a는 새로운 값객체 20을 만들어 가르킨다. 따라서 10을 가르키고 있는 b는 변하지 않는다. 하지만 call by reference에서는 b는 a의 주소를 참조하므로 b = 20이 된다.
추가 개념정리
a = [1,2,3]
b = a
a += [4,5,6]
print(b)
일 때 b의 값 a 는 리스트를 가르키고 있고 리스트는 대표적인 mutable이므로 a가 가르키는 값 객체가 [1,2,3,4,5,6]으로 바뀌고 그에 따라 b역시 바뀜
def func(a)
a[2] = 0
a = [1,2,3]
func(a)
print(a). #[1,0,3]
개념 정리
- 객체: 메모리에 존재하는 개별 데이터를 가리키는 개념
- 객체의 값: 객체를 통해 구할 수 있는 정보 그 자체. 가변 객체는 값이 바뀔 수 있다.
- 객체의 유형: 객체가 어떤 범주에 속하고 어떻게 다뤄야 하는지를 구별하기 위한 분류. 파이썬에서는 클래스로 유형을 나타내며, type() 함수로 구할 수 있다.
- 객체의 정체성: 객체를 다른 객체와 구별하기 위한 고유번호이자, 메모리 상의 위치. id() 함수로 구할 수 있다.
- 변수: 객체에 붙인 이름. 한 객체에 여러 개의 이름을 붙일 수도 있다.
https://python.bakyeono.net/chapter-8-2.html 참고
property - object의 속성 (ex. 블랙박스, 오디오, 쿨시트 등등)
obj = {} 라는 빈 객체를 만들고 여기서 obj.a = 10 을 해주면 (in javascript) a라는 property에 10이라는 값이 들어가게 된다. 따라서 obj이라는 객체는 10이라는 속성을 가지고 있고 그 값에 접근가능한 이름이 a이고 이 a는 활용 가능한 10이라는 값을 지니게 된다.
method - object의 동작을 나타낸다. (ex, 간다, 멈춘다, 가속, 후진)
메소드는 객체가 가지고 있는 동작이다. 함수와 메소드는 기본적으로 일련의 동작을 실행한다는 점에서 동일하나, 메소드는 특정 객체가 가지고 있는 동작을 가지고 있고, 메소드를 실행하기 위해서는 객체를 통해야만 실행가능하다. 그에 비해 함수는 함수 자체가 그 동작을 정의한 객체이다.
instance - 객체가 어떤 class에 속할 때 그 객체를 그 class의 instance라고 부른다.
파이썬에서 객체라고 하면 메모리에 올려져 있는 단위라고 볼 수 있다.
year = 2019 라고 하면 2019라는 값을 가지고 있는 객체가 메모리에 올라가고 year은 변수로서 2019라는 객체를 가리키고 있는 것이다. (즉 객체에 이름을 붙여 준 것이다.).
이 year이라는 이름을 가진 객체는 2019라는 프로퍼티를 가지고 있다. 그리고 2019는 int라는 클래스의 인스턴스이다.