ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 20.12.18 클래스, 객체
    Cloud/클라우드 아키택트 양성과정 2021. 1. 7. 22:16

    [20.12.18] 클래스, 객체

     

    어지간해선 이해하기 힘든 클래스, 객체에 대해 학습했다. 이미 배웠던 적이 있고 파이썬 아니더라도 1학년 때 전공으로 자바에서 질리도록 들었기 때문에 이제 객체라면 어느 정도 능숙하다.

     

    * 클래스(Class)

    - 특별한 '틀'을 갖고 있다고 생각하면 좋다. 특정 종류의 묶음이라고 생각해도 좋다.

    - 클래스라는 틀을 활용해서 만든 결과물을 '객체(Object)'라고 한다.

    - 클래스를 사용하면 대동소이한 객체를 생성하여 관리하기 편하다.

     

    * 클래스의 구조

    1) 클래스 선언

    class A():
    	pass

    > A라는 이름의 클래스를 선언했다. pass는 아무런 동작도 하지 않는다는 의미다.

     

    2) 생성자(Constructor)

    > 객체를 생성할 때 자동으로 호출되는 메소드(클래스 내에 선언된 함수, 후술 참조)이다.

    > 객체에 초기값을 설정해줄수도 있다.

    class A():
    	def __init__(self):
        	pass

    > '__init__'이라는 이름으로 선언한다. 앞 뒤로 언더바(_)가 두 개씩 있다.

    > 매개변수 self는 A라를 클래스를 통해 생성된 객체 자신을 매개변수로 보낸다고 생각하면 된다.

    class A():
    	def __init__(self):	# 밑에서 obj_a라는 객체가 생성되고 그 객체를 self로 받는다.
        	pass
            
    obj_a = A()	# obj_a라는 이름의 객체 생성, 

     

    3) 객체변수

    > 클래스를 통해서 생성된 객체가 갖게 되는 변수이다.

    > 클래스 선언 시에 변수를 미리 선언해둘 수 있다.

    # (1)
    class People():
        name = ''
        age = 0
        
        def __init__(self, name, age):
        	self.name = name
            self.age = age
    
    # (2)
    class People():
        
        def __init__(self, name, age):
        	self.name = name
            self.age = age

    > 위 예시에서 (1)번, (2)번은 똑같은 클래스다.

    > (1)번은 객체변수를 미리 선언해두었고 (2)번은 선언해주지 않았다.

    > (2)번에서 객체변수를 미리 선언하지 않았더라도 객체 생성 당시에 무조건 호출되는 생성자(__init__)에서 매개변수를 받고 이를 객체변수로 할당해준다. (self.name = name)

    > 앞서 말했듯 self는 객체 자체를 의미하며 'self.name'은 self(객체)의 객체변수(name)을 의미한다.

    def __ init__(self, name, age):

        self.name = name

        self.age = age

    > 위처럼 매개변수로 전달받은 name과 self.name은 다른 변수다. (같은 색이 같은 변수임)

    > 그렇다고 위 두 예시 (1), (2)번의 클래스를 활용해서 객체를 생성하는 방식이 완전히 같진 않다.

    # (1)
    class People():
        name = ''
        age = 0
        
        def __init__(self, name, age):
        	self.name = name
            self.age = age
    
    hong = People()	# 생성 가능
    # 객체 변수로 name='', age=0을 기본적으로 갖게된다.
    hong2 = People('홍길동', 20)	# 생성 가능
    # 객체 변수로 name='홍길동', age=20을 할당받는다.
    
    # (2)
    class People():
        
        def __init__(self, name, age):
        	self.name = name
            self.age = age
    hong3 = People() # 생성 불가능
    # 생성자에서 매개변수를 객체변수로 할당해주고 있기 때문에
    # 매개변수가 비어있다면 객체가 생성되지 않는다.
    hong4 = People('홍길동', 20)	# 생성 가능
    # 매개변수로 '홍길동', 20을 주었으므로
    # name='홍길동', age=20을 할당받는다.
    
    # (3)
    class People():
        
        def __init__(self, name='', age=0):
        	self.name = name
            self.age = age

    > 이처럼 객체 생성 시에 매개변수를 전달해주는지 전달해주지 않는지를 고려해야 한다.

    > (3)번 예시처럼 매개변수의 초기값을 설정해줄 수 있는데, 이 경우에는 객체 생성 시 매개변수를 전달해주지 않아도 오류가 발생하지 않는다.

    > 초기값이 설정된 매개변수는 뒤에서(오른쪽)부터 선언해줘야 한다. 중간에 초기값을 설정할 수 없다.

    ex) def __init__(self, name='', age=0) People() // 가능

    ex) def __init__(self, name='', age) People(20) // 불가능

    class test():
        def __init__(self):
        	pass
            
    t = test()
    t.count = 1
    print(t.count)

    > 위처럼 클래스를 구성한 뒤 객체를 선언하고 나서 '객체.변수'를 이용해서 할당하게 되면 객체변수가 생성된다. 이는 클래스에는 독립적이며, 만약 저 상태로 새로운 객체(예를 들면 t2)를 생성하면 t2에는 'count'라는 객체변수는 없다.

     

    4) 메소드(Method)

    > 클래스 내부에 정의된 함수를 말한다.

    > self 인자의 사용 유무에 따라 각각 클래스에, 객체에 종속되는 메소드가 될 수 있다.

    class People():
    	def __init__(self,name,age):
        	self.name = name
            self.age = age
            
    	def print_info(self):
        	print(f'이름 : {self.name}, 나이 : {self.age}')
            
    	def class_info():
        	print('이 클래스는 People 클래스 입니다.')
            
    hong = People('홍길동', 20)
    hong.print_info()	
    People.class_info()
    hong.class_info()	# 오류 발생

    > 여기서 print_info()는 self 인자가 있으므로 객체에 종속되며 class_info()는 self 인자가 없으므로 클래스에 종속된다. 메소드는 기본적으로 객체명.method()로 호출하지만, 여기서 class_info()는 클래스에 종속되므로 클래스명.method()의 형식으로 호출한다.

     

     

    * 실습문제

    1) 다음의 조건을 만족하는 calculator 클래스를 만드시오.

    a. 객체변수는 __init__으로 구현하며, 결과를 저장할 변수 result (초기값 0.0), 이름을 저장할 name을 선언하기.

    b. 총 4개의 메소드 선언하기.

    > add : 매개변수 1개, 객체의 result에 매개변수를 더함.

    > sub : 매개변수 1개, 객체의 result에 매개변수를 뺌.

    > multiply : 매개변수 1개, 객체의 result에 매개변수를 곱함.

    > divide : 매개변수 1개, 객체의 result에 매개변수를 나눔.

    c. 계산기 이름을 '똑똑한 계산기'로 생성하고 5를 더하고 10을 곱하고 2를 빼고 3으로 나눈 후 결과를 출력하기.

    # 풀이
    class calculator():
        def __init__(self, name, result=0.0):
        	self.name = name
            self.result = result
            
        def add(self, num):
        	self.result += num
    
        def sub(self, num):
        	self.result -= num
    	
        def multiply(self, num):
        	self.result *= num
    	
        def divide(self, num):
        	self.result /= num
            
    c1 = calculator('똑똑한 계산기')
    c1.add(5)
    c1.multiply(10)
    c1.sub(2)
    c1.divide(3)
    print(c1.result)

    2) 다음의 조건을 만족하는 MemberCard 클래스를 만드시오.

    a. 객체변수는 __init__으로 구현하며, (name, point, tel) 3개의 변수를 갖게 선언하기.

    b. 선언한 클래스의 객체를 2개 생성하기.

    > 1. name : 홍길동, point : 10, tel : 111-111

    > 2. name : 이영희, point : 20, tel : 111-222

    c. 생성한 객체의 모든 정보 출력하기.

    # 풀이
    class MemberCard():
        def __init__(self, name, point, tel):
        	self.name = name
            self.point = point
            self.tel = tel
            
        def print_info(self):
        	print(f'이름 : {self.name}, 포인트 : {self.point}, 전화번호 : {self.tel}')
            
    hong = MemberCard('홍길동', 10, '111-111')
    lee = MemberCard('이영희', 20, '111-222')
    hong.print_info()
    lee.print_info()

    3) 다음의 조건을 만족하는 RobotCleaner 클래스를 만드시오.

    a. 객체변수는 __init__으로 구현하며, (id, energy) 2개의 변수를 갖게 선언하기.

    b. 총 2개의 메소드를 선언하기.

    > recharge(self, e) -> 청소기의 에너지를 e만큼 더함.

    > clean(self) -> 에너지가 0보다 크면 '청소' 출력 후 에너지 10만큼 감소, 에너지가 마이너스가 되면 0으로 바꿈, 에너지가 0일 경우 '청소 불가' 출력.

    c. 클래스 객체 2개 생성하기.

    > 1. id : 코드제로, energy : 10

    > 2. id : 에브리봇, energy : 20

    d. 코드제로 객체의 clean 메소드 2번 실행, 에브리봇 객체의 clean 메소드 2번 실행, 코드제로 객체의 recharge 메소드에 매개변수 20을 주고 호출한 후 clean 메소드 1번 실행.

    # 풀이
    class RobotCleaner():
        def __init__(self, id, energy):
        	self.id = id
            self.energy = energy
            
        def recharge(self, e):
        	self.energy += e
            
        def clean(self):
        	if self.energy > 0:
                print('청소')
                self.energy -= 10
                if self.energy < 0:
                	self.energy = 0
            else:
                print('청소 불가')
    
    r1 = RobotCleaner('코드제로', 10)
    r2 = RobotCleaner('에브리봇', 20)
    
    r1.clean()
    r1.clean()
    r2.clean()
    r2.clean()
    r1.recharge(20)
    r1.clean()
    r1.clean()

     

    ※ 이 게시물은 'Do it 점프 투 파이썬' 교재와 엔코아 플레이데이터에서 배운 내용을 토대로 작성되었습니다.

    댓글

Designed by Tistory.