본문 바로가기
Python/Python 기초

[Python] 클래스 정의와 인스턴스 생성

by snow_white 2022. 3. 15.

클래스란?

개발자에게 필요한 새로운 형식을 정의하는 것을 의미

속성과 데이터를 변형하는 함수를 같은 이름 공간에 묶음

 

인스턴스란?

클래스를 복사해서 생성한 복사본

 

객체지향프로그래밍의 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

댓글