-
[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 점프 투 파이썬' 교재와 엔코아 플레이데이터에서 배운 내용을 토대로 작성되었습니다.
'Cloud > 클라우드 아키택트 양성과정' 카테고리의 다른 글
[TIL] 20.12.22 DBMS, RDB, MariaDB 설치, 쿼리 실습 (0) 2021.01.16 [TIL] 20.12.21 모듈, 예외처리, 내장 함수 (0) 2021.01.08 [TIL] 20.12.17 Python 함수, 파일 읽기/쓰기 (0) 2021.01.03 [TIL] 20.12.16 Python 제어문(조건문, 반복문) (0) 2021.01.01 [TIL] 20.12.15 Jupyter notebook 설치, Google colab 사용, 파이썬 자료형 (0) 2020.12.28