IT_Python
[파이썬기초] 클래스. class. attribute(속성)/행동(method)/객체(object)/__init__(생성자)
soyounism
2021. 12. 19. 10:15
인간을 떠올려보자. 떠오르는 이미지는 특정화된 사람일것
인간자체를 떠올리기 어려워.
뭔가 실체화된 홍길동, 임꺽정 등등 구체화된 사람을 떠올릴 것
인간은 추상적인 타입이고, 실제로 존재하는 인간들이 객체->오브젝트
- 프로그래밍 관점에서
- 인간이라는 추상적인 타입: 클래스
- 데이터정보(국적, 나이) : 속성. attribute
- 타입이 행하는 행동 : 메소드
- 인간이 구체화되어 실제로 존재하는 형태. 홍길동 임꺽정 : 객체
리스트로 예를 들어보면,
파이썬으로 예를 들어보자
- 리스트 : 타입. 즉 클래스
- 속성(attribute) : 리스트 안에 items
- 행동(method) : append, extend....
- 객체(object) : 구체적으로 메모리에 잡혀있는 구체화된 리스트 자체가 객체.(떠오르는것)
=> 리스트라고하는 타입을 통해서, 실제로 만들어져서, 메모리에 올라가 있는 상태가 바로 => 객체
=> 클래스는 틀. 틀로부터 찍어낸, 생성된 인스턴스를 객체
- 파이썬에서 제공하는 클래스 키워드로 정의하고 : > list
- 정의 했으면, 클래스를 구체화한거. 즉 객체를 생성해서 > a=[1,2,3] >a라는 리스트 객체 생성
- 그 객체의 행동 즉. 메소드를 호출함으로써 프로그래밍! > a.append(3)
class란?
- 실세계의 것을 모델링하여 속성(attribute)와 동작(method)를 갖는 데이터 타입
- python에서의 string, int, list, dict.. 모두가 다 클래스로 존재
- 예를들어 학생이라는 클래스를 만든다면, 학생을 나타내는 속성(attribute. 즉 데이터)과 학생이 행하는 행동(method)을 함께 정의 할 수 있음
- 따라서, 다루고자 하는 데이터(변수) 와 데이터를 다루는 연산(함수)를 하나로 캡슐화(encapsulation)하여 클래스로 표현
- 모델링에서 중요시 하는 속성에 따라 클래스의 속성과 행동이 각각 달라짐
a = [1, 2, 3, 4]
#클래스는 이 타입을 정의하는 도구에 불과. 이건 리스트라는 클래스
# 실제로 그 타입으로부터 생성된 a라는 구체화된 객체를 가지고 프로그래밍하는 것
a.append(5)
#a라는 객체에 .append()해서 a가 할 수 있는 행동, 즉 메소드로 관리
#a라는 객체는 append라는 method를 통해서 내부적으로 5라는 데이터를 자기 속성에 더 추가시킴.
print(a)
클래스는 그냥 새로운 타입을 정의하는것
그 새로운 타입으로부터 구체화된 메모리에 상주하는 인스턴스를 만드는게 객체를 만드는것
object(객체) 란?
- 클래스로 생성되어 구체화된 객체(인스턴스)
- 파이썬의 모든 것(int, str, list..etc)은 객체(인스턴스)
- 실제로 class가 인스턴스화 되어 메모리에 상주하는 상태를 의미
- class가 빵틀이라면, object는 실제로 빵틀로 찍어낸 빵이라고 비유 가능
class 선언하기
- 객체를 생성하기 위해선 객체의 모체가 되는 class를 미리 선언해야 함
class Person:
pass #우선 정의없이
# 빈 클래스 생성
# 새로운 타입을 만들었어
#함수도 마찬가지
def test():
pass
def test2():
pass
# 객체 생성할때는 " 클래스이름() "
bob = Person()
cathy = Person()
#person이라는 클래스에 해당하는 bob, cathy 객체(오브젝트)를 생성함
a = list()
b = list()
# a,b는 list클래스의 객체.
#a .+ tab <-해당 객체에 행할 수 있는 행동 method가 나와.
print(type(bob), type(cathy))
#person타입이다. person클래스로 만들어진 객체
print(type(a), type(b)) #list라는 클래스로부터 만들어진 개체
<class '__main__.Person'> <class '__main__.Person'>
<class 'list'> <class 'list'>
__init__(self)
- 언더바 두개!
- 생성자. 클래스 인스턴스가 생성될 때 호출됨
- 클래스가 다루고자하는 "데이터. 속성"를 명시.
- self인자는 항상 첫번째에 오며 자기 자신을 가리킴
- 이름이 꼭 self일 필요는 없지만, 관례적으로 self로 사용
- 생성자에서는 해당 클래스가 다루는 데이터를 정의
- 이 데이터를 멤버 변수(member variable) 또는 속성(attribute)라고 함
ex>
class Person:
def __init__(self, n, a=10):
print(self, 'is generated')
self.name = n
self.age = a
# person이라는 클래스를 생성
class Person:
def __init__(self):
print(self, 'is generated')
p1 = Person()
p2 = Person()
#p1, p2 두개의 객체가 만들어졌어
# init메소드는 클래스의 메소드의 일부인데
# ()로 그 타입의 객체를 생성할 때 init함수가 불리는것
# 그러면서 아래 print문이 불리는것
# => 결과를 보면 각각 다른메모리에 다른 객체가 생성된걸 확인할 수 있음
# person 데이터의 속성은 이름, 나이
class Person:
def __init__(self):
print(self, 'is generated')
self.name = 'Kate'
self.age = 10
# self로 속성을 정의. 데이터. 이름/나이
# =>person이라고하는 타입. 클래스가 갖는 데이터.
# 즉 속성이 2가지가 있고 각각 name, age라는 이름의 속성을 갖는다
p1 = Person()
p2 = Person()
p1.name = 'aaron'
#속성 바꿀 수 있음. 따로 정하지 않으면 기본으로 self에 정의해뒀던 kate로 뜸
p1.age = 20
print(p1.name, p1.age)
class Person:
def __init__(self, n, a=10): #a=10기본값.
print(self, 'is generated')
self.name = n #self. 뒤에 name이 속성의 이름. n은 파라미터에 전달된 값일뿐
self.age = a
#self는 기본적으로 항상오는 파라미터. self제외한 두개의 파라미터 추가!
# 속성의 이름 name, age 와, 위의 파라미터 이름이 같을 필요는 없지만, 관례적으로 같은 이름을 쓰긴함
# -> 정적으로 name=kate 값을 쓰지않고 전달된 값을 쓸 수 있다
# print문 처럼 객체가 생설될때 그 생성되는 순간에 action을 정의할 수 있다
p1 = Person('Bob', 30)
#객체를 생성함과 동시에 속성값을 외부에서 주입하고 싶어
p2 = Person('Kate', 20)
p3 = Person('Aaron')
#값을 주지않았으니까 기본값이 출력(값주면 그값이 나오지)
print(p1.name, p1.age)
print(p2.name, p2.age)
print(p3.name, p3.age)
=> 생성자 init 메소드를 활용해서
타입(person(클래스))을 생성하면서,
타입의 객체 p1를 생성해 값을 주입하고
그 타입이 처리할 데이터(속성. name, age)를 생성 할 수 있다