def 함수이름():
코드
괄호 안에 매개변수 넣을 수 있음
함수이름()
클래스는 데이터와 이를 처리하는 메서드(함수)로 구성됨
class 클래스이름:
def 메서드(self):
코드
self는 메서드에 따라 없애거나 그대로 사용
함수는 논리를 캡슐화하고 코드를 더 작고 관리하기 쉬운 부분으로 나누어 코드를 단순화하는 데 사용됩니다.
함수는 일반적으로 클래스보다 더 빠른데, 객체를 인스턴스화할 필요가 없는 더 간결한 코드로 구성되기 때문입니다. 클래스 성능은 필요한 속성만 선택하고 필요하지 않을 때 과도한 인스턴스화를 피함으로써 개선할 수 있습니다.
클래스의 주요 장점은 사용자가 관련 정보를 단일 엔터티로 그룹화할 수 있다는 것입니다. 이를 통해 정보를 보다 효율적으로 저장할 수 있고 데이터 작업이 훨씬 쉬워집니다. 클래스는 또한 코드 재사용성을 허용하여 동일한 코드를 클래스의 다른 인스턴스에서 여러 번 사용할 수 있습니다. 이를 통해 작업을 수행하는 데 필요한 코드 양을 줄이는 데 도움이 됩니다.
반면, 함수는 코드를 더 작은 청크로 나누는 이해하기 쉬운 방법을 제공합니다. 이를 통해 효율적인 디버깅과 코드 가독성 및 유지 관리가 가능합니다. 함수는 또한 두 개의 다른 함수가 같은 이름을 가질 때 발생할 수 있는 네임스페이스 충돌을 피하는 데 도움이 됩니다.
또한 함수를 사용하여 모듈식 코드를 만들 수 있으며, 이는 프로그램의 여러 부분에서 재사용할 수 있습니다. 이를 통해 작성해야 하는 코드 양을 줄이고 유지 관리 및 디버깅을 더 쉽게 할 수 있습니다. 반면 클래스는 더 복잡한 데이터 구조와 객체 간의 관계를 허용하기 때문에 대규모 프로젝트에 더 적합합니다.
클래스 안에 정의된 함수를 우리는 특별히 '메소드(method)'라고 부른다.
메소드는 세 가지가 있음. 인스턴트 메서드 / 정적 메서드 / 클래스 메서드
class Test():
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self):
print(self.name, ',', self.age) #1
def test_func(self):
self.print_info()
test1 = Test('sptcnl', 21)
test1.print_info() #2 결과값 : sptcnl , 21
test1.test_func() #3 결과값 : sptcnl , 21
객체와 독립적이지만, 로직상 클래스 내에 포함되는 메서드
self파라미터를 가지고 있지 않다. 따라서, 인스턴스 변수에 액세스가 불가능
-> 그러나, 정적 메서드 내부에서 클래스 변수(속성) 에는 클래스명.클래스속성명으로 엑세스가 가능
메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)을 만들 때 사용
즉, 인스턴스 상태를 변화시키지 않는 메서드를 만들 때 사용
@staticmethod라는 데코레이터를 붙여서 해당 메서드가 정적 메서드임을 표시
호출 방법: 클래스명.정적메서드명 또는 객체명.정적메서드명 둘 다 호출 가능하지만, 전자를 주로 사용
예시 코드
class Calc:
count = 10 # 클래스 변수(클래스 속성)
@staticmethod
def add(a):
print(a + Calc.count) # 클래스 속성에는 엑세스가 가능하다.
@staticmethod
def mul(a):
print(a * Calc.count)
Calc.add(15) # 결과값 :25
Calc.mul(15) # 결과값 : 150
인스턴스 없이 호출이 가능하다는 점에서 정적 메서드와 비슷하지만 약간의 차이점이 있다.
self파라미터 대신 cls라는 클래스를 의미하는 파라미터를 갖는다.
해당 클래스로 생성된 객체로 부터 호출 되는 것이 아니라, 클래스 자체에서 직접 호출된다.
객체의 속성/메서드에는 엑세스가 불가능하다.
-> 그러나, cls.클래스속성명으로 클래스 속성에는 접근 가능하다.
cls를 사용하면 클레스 메서드 내부에서 현재 클래스의 인스턴스를 만들 수도 있다. (cls() = 현재클래스명() 를 의미. 아래 예시 코드로 확인)
@classmethod라는 데코레이터를 붙여 해당 메서드가 클래스 메서드임을 표시한다.
호출 방법: 클래스명.클래스메서드명 또는 객체명.클래스메서드명 둘다 호출 가능하다.
예시 코드
class Person:
count = 0 # 클래스 속성
def __init__(self):
Person.count += 1
@classmethod
def print_count(cls):
print('{0}명 생성되었습니다.'.format(cls.count)) # 클래스 속성에는 엑세스가 가능하다.
@classmethod
def create(cls):
p = cls() # 메서드 내부에서 cls()로 현재 클래스의 인스턴스를 만들 수도 있다. 즉, cls() = Person()을 의미한다.
return p
ryan = Person()
apeach = Person()
Person.print_count() # 결과값 : 2명 생성되었습니다.
print(Person.create()) # 결과값 : <__main__.Person object at 0x000001BA0AE143D0> Person클래스로 부터 생성된 인스턴스임을 확인할 수 있다.
메소드 중에서 __로 시작하고 끝나는 메서드
ex) __init__
클래스를 사용하면 리스트, 튜플, 딕셔너리, 정수, 실수, 문자열 등 같이 타입을 만들 수 있음. 순서가 있는 데이터 타입은 대괄호([ ])를 사용해서 인덱싱함.
매직메서드는 직접 만든 타입에 인덱싱 기능을 제공할 때 사용함.
*인덱싱: 처음부터 0, 1, 2 순서 붙이는 것