일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ROS Package 만들기
- argparse
- Object Orient
- Python list 내 for
- ROS Package 명
- ROS Node 만들기
- python
- ROS Package 이름
- Object 상속
- python for
- Python for list
- Python for range
- ROS Package 생성
- Class(Object)
- 객체지향
- argparse 사용법
- Today
- Total
일단해봐
[Python] Class 기본 사용법 본문
본 포스트의 목적은 Python의 Class를 개념적으로 이해하고 사용시 실질적으로 고려해야하는 사항에 대해 이야기한다.
CS에서 설명하듯 거창한 전문용어는 쓰지 않는 것으로! (엄밀히 말하면 쓰고싶어도 모른다!)
[Python] Class 와 Object(Instance)
Class & Object(Instance)
class란 무엇인가? 일종의 설계도라고 말할 수 있다. 어떠한 대상의 대표적인 특징을 모아놓은 설계도 같은 존재이다.
가장 직관적인 예는 붕어빵이다. Class를 '붕어빵 틀'이라고 한다면 객체(혹은 인스턴스)는 '붕어빵' 이다.
*객체 Vs 인스턴스
엄밀히 말하면 객체와 인스턴스는 다르다. 하지만 편의상 나는 같다고 생각하고 이야기 하겠다.
붕어빵은 붕어빵 틀로 만들고, 붕어빵은 붕어빵 틀이 있으면 얼마든지 만들어 낼수 있다. *즉 인스턴스(Instance)는 클래스(Class)로 만들고 클래스가 있으면 인스턴스는 얼마든지 만들어 낼 수 있다. *
Python Class 만드는 법
'Car' 라는 클래스를 만들어 보자.
class car: # 클래스 이름이 car 이다.
pass # 아무 작업을 하지 않고 지나가자.
이렇게 하면 일단 클래스가 만들어 진거다. 별거 없다.
Python Instance 만들기
car 클래스를 이용해 car1, car2, car3 의 인스턴스를 만들어보자.
class car: # 클래스 이름이 car 이다.
pass # 아무 작업을 하지 않고 지나가자.
car1 = car()
car2 = car()
car3 = car()
이렇게 하면 클래스 car의 인스턴스인 car1, car2, car3 가 만들어 졌다. 별거 없다.
참고로 각 인스턴스는 클래스로 부터 만들어 졌지만 각각 독립적이다.
Python Instance 변수 만들기
이제 각 인스턴스의 변수를 만들어 보자.
class car: # 클래스 이름이 car 이다.
pass # 아무 작업을 하지 않고 지나가자.
car1 = car() #car1 인스턴스 생성
car2 = car() #car2 인스턴스 생성
car3 = car() #car3 인스턴스 생성
#car1 인스턴스 변수 생성
car1.maker = 'BENZ'
car1.model = 'E300'
#car2 인스턴스 변수 생성
car2.maker = 'BMW'
car2.model = '5Series'
#car3 인스턴스 변수 생성
car3.maekr = 'TESLA'
car3.model = 'Model S'
이렇게 각 인스턴스의 인스턴스 변수를 생성하고 값을 할당 했다.
참고로 Class의 변수는 클래스 변수 와 인스턴스 변수가 있는데 인스턴스 변수는 각 인스턴스에 종속된 변수 이다.
인스턴스에 종속된 변수라는 의미는 이전글 객체의 구성 중 속성(Attribute)과 같은 의미이다. 즉, 인스턴스 변수가 객체의 속성(Attribute)에 해당한다.
자세한 내용은 뒤에서 클래스 변수와 비교를 하여 설명하겠다.
Python Instance 함수 만들기
클래스에 아래와 같이 자동차의 Maker를 출력하는 printMaker()
함수를 만들어보자.
class car: # 클래스 이름이 car 이다.
def printMaker(car): # printMaker 함수 정의
print(car.maker)
car1 = car() # car1 인스턴스 생성
car2 = car() # car2 인스턴스 생성
car3 = car() # car3 인스턴스 생성
# car1 인스턴스 변수 생성
car1.maker = 'BENZ'
car1.model = 'E300'
# car2 인스턴스 변수 생성
car2.maker = 'BMW'
car2.model = '5Series'
# car3 인스턴스 변수 생성
car3.maekr = 'TESLA'
car3.model = 'Model S'
# printMaker 함수 호출
car.printMaker(car1)
일반 함수를 정의 하듯이 만들면 된다. 별거 없다. 그리고 함수를 호출해 보자.
BENZ
car1의 Maker이름이 정상적으로 출력된다.
그런데 이렇게 호출하면 의미가 없다. 앞에서 인스턴스 변수가 객체 구성 중 속성(Attribute)에 해당하다고 했으니 인스턴스 함수는 아마도 객체의 행동(Action)에 해당 할 텐데 `car.printMaker(car1)` 과 같이 호출하면 인스턴스에 종속 되었다고 할 수 있나?
사실 일반적으로 인스턴스 함수는 아래과 같이 호출 한다.
# printMaker 함수 호출
##car.printMaker(car1)
car1.printMaker(car1) # Error
아! 이제 좀 와 닿는다. car1의 종속된 `printMaker()` 함수를 호출하는 구나!
그런데 이 코드를 실행해 보면 아래와 같이 Error가 난다.
에러의 내용을 보면 함수의 Argument가 1개 필요한데 2개 넣어서 에러가 발생했다고 한다. 이상하다 위의 코드를 보면 분명히 `car1.printMaker(car1)` 으로 1개의 Argument(car1)를 넘겨 줬는데?
Python Instance 함수 규칙 (Self)
위와 같이 말도 안되는 에러의 원인은 Python의 인스턴스 함수의 내부 규칙 때문에 발생한다. Python은 인스턴스 함수 호출 시 첫번째 Argument를 인스턴스 자기 자신을 넘겨주도록 약속되어 있다.
위의 Code로 예를 들면 `car1.printMaker(car1)` 로 Argument 1개를 함수에 넘겨 줬지만 Python 인스턴스 함수 내부 규칙에 의해 printMaker() 함수는 printMaker(car1, car1) 이렇게 2개의 Argument를 받았다는 말이다.
따라서 위와 같이 분명 Argument 1개를 함수에 넘겨줬지만 2개를 넘겨줬다는 에러가 발생한 것이다. 따라서 인스턴스 함수를 올바르게 호출하려면 아래와 같이 Code를 수정해야 한다.
# printMaker 함수 호출
##car.printMaker(car1)
#car1.printMaker(car1) # Error
car1.printMaker() # Ok
이전글: 2021.04.18 - [분류 전체보기] - [Python] 객체 지향(Object Oriented)이 뭐지?
'Python' 카테고리의 다른 글
[Python] 클래스(Class) 선언 시 Object 상속 하는 경우? [Class(Object) ?] (0) | 2021.04.19 |
---|---|
[Python] 객체 지향(Object Oriented)이 뭐지? (0) | 2021.04.18 |
[PyCharm] PyCharm 모듈 실행 모드(-m mod) 설정하기 (0) | 2021.04.18 |
[Pycharm] Pycharm 실행 시 argument 넣기 (0) | 2021.04.17 |
[Python] argparse 사용법, 예제 (0) | 2021.04.16 |