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__(selfna=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)를 생성 할 수 있다