[파이썬] 클래스
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) # 에러
'Python' 카테고리의 다른 글
[파이썬] 클래스 다중상속, 추상 메서드 (1) | 2022.12.25 |
---|---|
[파이썬] 클래스 2 (0) | 2022.12.25 |
[파이썬] 함수 (0) | 2022.12.18 |
[파이썬] 별찍기, selection sort, bubble sort (0) | 2022.12.18 |
[파이썬] 연산자 문법, for, if 제어문 (0) | 2022.12.14 |
블로그의 정보
개발자 미니민의 개발로그
mini_min