클래스란?
개발자에게 필요한 새로운 형식을 정의하는 것을 의미
속성과 데이터를 변형하는 함수를 같은 이름 공간에 묶음
인스턴스란?
클래스를 복사해서 생성한 복사본
객체지향프로그래밍의 3가지 특성
1. 추상성 : 꼭 필요한 부분만 구현하는 것
2. 상속성 : 부모 클래스에서 공통부분을 상속받는 것
3. 다형성 : 동일한 인터페이스에 대해 구체적인 인스턴스마다 다른 동작을 할 수도 있는 것
객체 생성
생성자 호출과 초기화 함수가 자동으로 호출된다
- 객체를 생성하기 위해서 java나 C# 등의 언어가 new 키워드를 사용하는 것과는 다르게 new 키워드를 사용하지 않는다.
- 대신에 내부적으로 new() 호출과 --> init() 호출이 순차적으로 일어난다
- init은 멤버변수 초기화 작업을 위해서 필요하지만 new 생성자는 굳이 작성하지 않고 생략한다
- 생성자는 클래스를 사용하여 인스턴스 객체를 생성할 때 초기화 하는 코드로 사용된다
- 멤버 메소드는 def 라는 키워드를 사용하고 첫 번째 매개변수(인자)는 예약되어 있는 자리여서 self 키워드 사용한다
- 생성자 호출로 객체생성을 하면
1)__new__ 를 호출하여 객체 생성을 할당하고,
2)__new___ 메소드가 __init__메소드를 호출하여
객체에서 사용할 값들을 초기화하게 된다.
- 생성자는__new__함수,
멤버변수 초기화는 __init__함수가 내부적으로 사용된다
class PythonTest:
pass
p = PythonTest() # 객체 생성의 결론은 주소값을 만들었다는 것
print(id(p)) # 주소값 1236455917504
print(p) # <__main__.PythonTest object at 0x0000011FE23DA8E0>
print(p.__str__) # 객체에 저장된 위치값을 알려줌 # <__main__.PythonTest object at 0x0000011FE28407C0>
# p 출력하는 것과 p.__str__ 출력하는 것과 같은 기능
# __main__ :직접 실행된 모듈의 이름
print(type(p)) # <class '__main__.PythonTest'>
1. 객체가 생성되면 __new__ 함수가 가장 먼저 실행된다.
2. 객체 생성 후, __init__ 객체 생성자 함수가 실행된다.
class Shirt:
def __init__(self): # 2.객체 생성 후 실행, 객체 생성자 함수라고 하는데 내부적으로 아래의 __new__가 먼저 실행됨
print('2. init 호출됨')
def __new__(cls): # 1.해당 객체가 생성되면 제일 먼저 실행
print('1. new Instance Creating')
return super().__new__(cls)
객체 소멸
생성자 호출과 초기화 함수가 자동으로 호출된다
- __del__ 함수로 객체가 소멸된 것을 정의한다
- del 인스턴스객체명 → __del__ 함수 실행하여 객체 삭제
인스턴스 객체를 삭제하면 이후로 인스턴스 객체의 변수를 사용할 수 없게 된다.
class MyClass:
def __init__(self, value):
self.Value = value
print('Class is created! Value=',value)
def __del__(self):
print('Class is destroy')
my = MyClass(100)
del my
my.value # NameError: name 'my' is not defined
'''
Class is created! Value= 100
Class is destroy
'''
인스턴스 객체를 생성하여 값 변경하기
※ 파이썬은 오버로딩을 지원하지 않는다
메소드 오버로딩에서는 첫번째 것(인자값이 작은것)은 무시되어진다
class TShirt:
# 인스턴스 속성 초기화 함수
def __init__(self, long_sleeved, brand, price): # 지역 변수가 되어
self.long_sleeved = long_sleeved # 최종적으로 self.변수에 넣어주어야
self.brand = brand # 인스턴스 변수(객체에 들어가는 값)가 됨
self.price = price
def get_info(self):
return self.long_sleeved, self.brand, self.price
# 기능 추가..
def change_price(self, price):
self.price = price
def get_price(self):
return self.price
# get_info 오버로딩...
# 함수 오버로딩,, 첫번째 것은 무시된다.(인자값이 많은 것만 살린다)
def get_info(self, info):
print(info, end=' ')
return self.long_sleeved, self.brand, self.price
longT = TShirt(long_sleeved=True, brand='유니클로', price=32000)
#print(longT.get_info())
shortT = TShirt(long_sleeved=False, brand='아이다스', price=55000)
#print(shortT.get_info())
print('=====가격을 수정합니다=====')
longT.change_price(22000)
print(longT.get_price()) # 22000
print('=====get_info OverLoading=====')
print(longT.get_info('tShirt 정보를 출력')) # tShirt 정보를 출력 (True, '유니클로', 22000)
str 함수 사용하기
__str__ 함수 사용하기
class Student:
def __init__(self, name, python, django, deep):
self.name = name
self.python = python
self.django = django
self.deep = deep
def get_sum(self):
return self.python + self.django + \
self.deep
def get_avg(self):
return "{:.2f}".format(self.get_sum() / 3)
# 정보를 리턴하거나 정보를 출력하는 기능.. 별도로 작성 / __str__ 재정의 해서 사용 가능
# 조상이 가지고 있는 속성 바꾸기 => Overriding, 부모가 물려준 기능을 받아서 + 자식에게 맞게 고쳐쓴다
# 객체가 저장된 위치값 return 하는 __str__
def __str__(self):
return "{}\t{}\t{}".format(self.name, self.get_sum(), self.get_avg())
students=[
Student('강호동', 87, 90, 68),
Student('민경훈', 90, 90, 60),
Student('이수근', 98, 79, 80),
Student('서장훈', 80, 80, 90)
]
# 정보출력
print("이름\t", "총점\t", "평균")
for student in students:
print(student)
# __str__로 정보출력
print("이름\t", "총점\t", "평균")
for student in students:
print(student.__str__())
'''
이름 총점 평균
강호동 245 81.67
민경훈 240 80.00
이수근 257 85.67
서장훈 250 83.33
'''
클래스 변수와 전역변수 사용하기
- 클래스 변수는 클래스 선언 바로 아래에 변수를 선언하기만 하면 됨
- 클래스 변수는 모든 객체가 같은 값을 가짐
- 클래스변수.변수이름 으로 접근해서 사용함
# 클래스 정의한 코드
str = "Not Class Member"
class GString:
str = ""
def set(self, msg):
self.str = msg
def print(self):
print(str) # Not Class Member
print(self.str) # First Message
# 인스턴스 객체 생성
g = GString()
g.set("First Message")
g.print()
'Python > Python 기초' 카테고리의 다른 글
[Python] 상속과 다형성 (0) | 2022.03.15 |
---|---|
[Python] 클래스 | 정적 메소드, private 멤버 (0) | 2022.03.15 |
[Python] 함수 (0) | 2022.03.12 |
[Python] 집합 자료형 (0) | 2022.03.12 |
[Python] 딕셔너리 자료형 (0) | 2022.03.12 |
댓글