파이썬과 객체지향 프로그래밍 - 예제로 이해하는 객체지향 문법 (class와 object)

3. 예제로 이해하는 객체지향 문법 (class와 object)

사각형 만들기

3.1. class 선언하기

객체 생성 전에 미리 class를 선언해야 함

In [9]:
class Quadrangle:
    pass
In [5]:
class SingleWord:
    pass
In [6]:
dir (SingleWord)
Out[6]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']


  • class 도 변수/함수와 마찬가지로 유일한 이름을 지어줘야 함
  • class 에 attribute/method를 아직 안넣은 상태이므로, 클래스에 내용이 없기에 임의로 pass 를 넣어 클래스 선언이 끝났음을 알려줌
    • pass는 아무것도 수행하지 않는 문법, 임시 코드 작성시 주로 사용
  • 클래스명은 PEP Coding Convention에 가이드된 대로 각 단어의 첫 문자를 대문자로 하는 CapWords 방식을 사용

클래스명(object) 로 쓸 수도 있음, 파이썬 3에서는 클래스명: 과 동일

In [9]:
class Quadrangle(object):
    pass
In [10]:
dir(Quadrangle)
Out[10]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']

만들어진 클래스로 객체를 만들 수 있음

  • 객체도 변수/함수/클래스와 마찬가지로 유일한 이름을 지어줘야 함
  • 함수와 마찬가지로 인수를 넣을 수 있음
In [11]:
square = Quadrangle()
In [12]:
dave = Quadrangle()


In [13]:
dave1 = Quadrangle()
In [14]:
dir(dave)
Out[14]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']
In [8]:
# 객체 square는 Quadrangle의 인스턴스
type(square)
Out[8]:
__main__.Quadrangle
In [16]:
type(dave)
Out[16]:
__main__.Quadrangle

3.2. attribute 넣어보기

  • 만들고자 하는 속성 생각해보기
    • width, height, color
In [21]:
class Quadrangle:
    width = 0
    height = 0
    color = "black"
In [17]:
class Dave:
    data = 0
    name = 'dave'


In [18]:
dir(Dave)
Out[18]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'data',
 'name']
In [ ]:
 
In [22]:
# width, height, color attribute 확인
dir(Quadrangle)
Out[22]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'color',
 'height',
 'width']
In [23]:
square1 = Quadrangle()
square2 = Quadrangle()
In [19]:
dave_object = Dave()

객체의 attribute 접근하기

  • 객체명.attribute명
In [25]:
class Quadrangle:
    width = 0
    height = 0
    color = "black"


In [26]:
square1 = Quadrangle()
square2 = Quadrangle()
In [24]:
square1.color
Out[24]:
'black'
In [27]:
square2.color = 'red'
In [28]:
square1.color
Out[28]:
'black'
In [29]:
square2.color
Out[29]:
'red'
In [30]:
square1.height = 5
In [31]:
print (square1.height, square2.height)
5 0


초간단 연습1
* width, height, color 속성을 가진 사각형 클래스를 만들고 다음 4개의 객체 만들기 (객체 속성을 바꿔주시고, 출력도 해보세요)
- 직사각형 1개 객체 속성: width=10, height=5, color='red'
- 정사각형 1개 객체 속성: width=7, height=7, color='blue'
In [32]:
class Dave:
    width = 0
    height = 0
    color = ''

square1 = Dave()
square2 = Dave()

square1.width = 10
square1.height = 5
square1.color = 'red'

square2.width = 7
square2.height = 7
square2.color= 'blue'

print (square1.width, square1.height, square1.color)
print (square2.width, square2.height, square2.color)
10 5 red
7 7 blue

3.3 method 넣어보기

만들고자 하는 method 생각해보기1

  • 사각형 넓이 구하기
In [7]:
class Quadrangle:
    width = 0
    height = 0
    color = "black"

    def get_area(self):
        return self.width * self.height

이 부분을 이해해야 함

  • 파이썬 method는 항상 첫 번째 파라미터로 self 사용
    • 인자가 필요없을 때에도 self는 사용
  • 클래스의 attribute는 내부에서 접근시, self.attribute명 으로 접근

만들고자 하는 method 생각해보기2

  • 사각형 width, height 설정하기
In [35]:
class Quadrangle:
    width = 0
    height = 0
    color = "black"

    def get_area(self):
        return self.width * self.height
    
    def set_area(self, data1, data2):
        self.width = data1 
        self.height = data2


객체의 method 접근하기

  • 객체명.method명
In [36]:
square = Quadrangle()
square.set_area(5, 5)
In [37]:
square.width
Out[37]:
5

method 호출시, 첫 번째 인자로 객체 자신이 넣어지기 때문에, self 를 method 첫 번째 인자로 항상 넣어야 함

In [38]:
square.get_area()
Out[38]:
25
초간단 연습2
* 위에서 작성한 Quadrangle 클래스를 기반으로 직사각형 1개 객체와 정사각형 1개 객체를 만들고, 각 사각형 너비 출력하기
- 직사각형2개 속성: width=10, height=5, color='red'
- 정사각형2개 속성: width=7, height=7, color='blue'
In [41]:
class Quadrangle:
    width = 0
    height = 0
    color = "black"

    def get_area(self):
        return self.width * self.height
    
    def set_area(self, data1, data2):
        self.width = data1 
        self.height = data2

square1 = Quadrangle()
square2 = Quadrangle()

square1.set_area(10, 5)
square2.set_area(7, 7)
square1.color = 'red'
square1.color = 'blue'

print(square1.get_area())
print(square2.get_area())
50
49


한발짝 더 나가보기!(심화 문제)
* 위에서 작성한 Quadrangle 클래스를 기반으로 직사각형 1개 객체와 정사각형 1개 객체를 만들되, 너비(width), 높이(height), 색상(color)를 한번에 설정할 수 있는 메서드만들고, 다음 값으로 각 객체의 속성값을 변경한 후, 사각형 너비와 색상도 함께 출력하기
- 직사각형2개 속성: width=10, height=5, color='red'
- 정사각형2개 속성: width=7, height=7, color='blue'
In [42]:
class Quadrangle:
    width = 0
    height = 0
    color = "black"

    def get_area(self):
        return self.width * self.height
    
    def set_area(self, data1, data2, data3):
        self.width = data1 
        self.height = data2
        self.color = data3

square1 = Quadrangle()
square2 = Quadrangle()

square1.set_area(10, 5, 'red')
square2.set_area(7, 7, 'blue')

print(square1.get_area())
print(square2.get_area())
50
49