개발자 미니민의 개발스터디

[파이썬] 클래스

by mini_min
[파이썬] 클래스

✔️ 클래스는 객체 정의를 위한 틀이며 객체를 생성하는 틀이다.

: 데이터와 메서드의 집합으로 새로운 타입의 객체를 만드는데 사용된다.

클래스를 틀로 사용해서 인스턴스가 만들어질 때, 메모리에 할당되어 객체가 실체화된다.

 

📓 객체

: 객체는 그 객체의 상태를 나타내는 변수와 행동을 구현하는 메서드의 소프트웨어적인 모듈이다.

개발시간에는 객체는 레퍼런스 변수로 정의, 실행 시간에는 클래스의 인스턴스를 의미한다. 

 

인스턴스란?
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라 한다. 즉 메모리를 할당 받은 객체를 의미한다.

 

클래스 작성?
클래스 이름은 일반적으로 대문자로 시작한다. 

메서드 작성은 함수와 동일! 반드시 들여쓰기를 해야한다.

메서드의 첫번째 매개변수는 반드시 self 를 지정해야한다.

 

클래스 객체?

클래스를 사용하기 위해서는 클래스로부터 객체를 생성하며, 클래스로 만든 객체를 인스턴스라고도 한다.

객체는 객체마다 고유한 성격을 가진다.

 

인스턴스 객체 생성?

__new__ 를 호출하여 객체를 생성하여 할당한다.

__new__ 메서드가 __init__ 메서드를 호출하여 객체에서 사용할 멤버를 초기화한다.

 

self ?

: 모든 메서드에는 self 가 있어야한다. 필드를 접근할 때도 self 를 써야한다.

# 클래스 작성 : 모든 메소드에는 self 가 있어야한다. 
# 필드 접근할 때도 self 써야한다.
class Rectangle:
    def set(self, width, height):
        self.width = width
        self.height = height
        
    def area(self):
        result = self.width * self.height
        return result
    
    def perimeter(self):
        return (self.width + self.height) * 2
    
# 객체 생성
rect = Rectangle() # 생성자
print(type(rect))
print(isinstance(rect, Rectangle))
print("-" * 10)

# 클래스 속성 접근 
rect.set(10, 5)
a = rect.area()
b = rect.perimeter()
print(f"가로길이:{rect.width}, 세로:{rect.height}")
print(f"넓이:{a}, 둘레:{b}")

 

초기자? __init__

초기자는 생성자는 아니지만, 생성자 역할을 한다.

클래스로 새로운 객체를 생성할 때 마다 실행되는 특별한 메서드이다.

초기자는 클래스로 객체를 만들 때, 인스턴스 변수를 초기화하거나 객체의 초기 상태를 만들기 위해 문장들을 실행한다.

✨ 클래스에 초기자가 있는 경우 초기자에 있는 인자는 꼭 넘겨야한다.

class Test:
    #초기자 : 생성자는 아니지만 생성자 역할을 함
    def __init__(self, a,b):
        self.a = a
        self.b = b
        
    def add(self):
        return self.a + self.b
    
    def write(self):
        s = self.add() #add는 인스턴스 메소드이기 때문에 self 붙여야함
        print(f"a:{self.a}, b:{self.b}, 합: {s}")
        
# obj = Test() # 에러 . 초기자가 있는 경우 초기자에 있는 인자를
# 반드시 넘겨줘야한다. 
obj = Test(10, 5)
print(obj.a, obj.b)
obj.write()

 

: __ 를 붙이면 private 으로 외부 접근 불가하다.

class Test:
    def __init__(self):
        self.a = 10
        self.b = 20
        self.__c = 30 #private : 외부접근 불가. __ 를 붙이면 private
        
    def __sub(self): # private
        print(f"__c: {self.__c}")
        
    def write(self):
        self.__sub()
        print(f"a:{self.a}, b:{self.b}, __c: {self.__c}")
        
        
obj = Test()

print(obj.a, obj.b)
# print(obj.__c) # 에러
# obj.__sub() # 에러
obj.write()
class Test:
    def __init__(self):
        self.__name = "홍길동"
        self.__age = 20
        
    def setName(self, name):
        self.__name = name
    def getName(self):
        return self.__name

    def setAge(self, age):
        self.__age = age
    def getAge(self):
        return self.__age

    def write(self):
        print(f"{self.__name}, {self.__age}")
        
        
obj = Test()
obj.setName("다자바바")
obj.write()

 

: 클래스 변수

class Test:
    c = 100 #클래스 변수 
    
    def __init__(self):
        self.a = 10
        self.b = 20
        
    def fun(self):
        Test.c += 1000
        
    def write(self): 
        self.fun() # 1000추가 메소드 실행 
        print(f"a:{self.a}, b:{self.b}, c: {Test.c}")
        
        
obj = Test()
print(Test.c) # 100

obj.write()
print(Test.c) # 1100

 

: @staticmethod # static 메서드 를 붙이면 static 메서드로 인스턴스 변수는 접근이 불가하다.

객체의 인스턴스 필드를 self 를 통해 액세스는 할 수 있지만 말이다....

클래스 변수는 접근이 가능하다.

class Test:
    b = 100 #클래스 변수 
    
    def __init__(self):
        self.a = 10
    
    @staticmethod # static 메서드
    def fun(): # 인스턴스 변수는 접근이 불가하다. 
        Test.b += 1000 # 클래스 변수는 접근 가능 
        
    @classmethod 
    def sub(cls): # class 메서드
        print(type(cls))
        print(Test.b)
        
    def write(self): 
        # Test.fun()
        print(f"a:{self.a}, b:{Test.b}")
        
        
obj = Test()
obj.write() # a:10, b:100

Test.fun()
obj.write() # a:10, b:1100

Test.fun()
Test.sub() # <class 'type'> , 2100 (fun 2번 실행 때문에)

 

: 클래스 메서드 는 정적 메서드와 비슷하지만, 객체 인스턴스를 의미하는 self 대신 cls 클래스를 의미하는 파라미터를 전달받는다. 정적 메서드는 이러한 cls 파라미터를 전달받지 않는다. 

클래스 메서드는 이렇게 전달받은 cls 파라미터를 통해 클래스 변수 등을 엑세스 할 수 있다. 

class Test:
    count = 0 #클래스 변수 
    
    def __init__(self):
        self.a = 10
        Test.count += 1
    
    @classmethod 
    def sub(cls): # 1. class 메서드 / 인스턴스변수접근불가
        print(cls.count) # 2. 클래스 변수 접근가능
    
    @classmethod
    def fun(cls): 
        p = cls() # 3. 객체 생성
        print(p.a)
        
        
obj = Test()

Test.sub()
Test.fun()

 

: 속성 추가하기 

class Test:

    def __init__(self):
        self.a = 10
        self.b = 20
                

    def write(self): 
        print(f"a:{self.a}, b:{self.b}")
        
obj = Test()
print(obj.a, obj.b)

#속성추가
obj.c = 33
print(obj.c)

#속성삭제
del obj.b
# print(obj.b) # 에러

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기