Python 기초 강의: #5 파이썬 클래스 - 변수와 메소드
이번 시간에는 저번 시간에 이어서 클래스에 대한 내용 중 변수와 메소드에 대해 심도있게 다루어 보도록 하겠습니다. 이번 강의는 자칫 지루해질 수 있으나 하나하나 차근차근 보시길 바랍니다. 클래스 작성 시 기초가 되는 부분이기 때문입니다. 그럼 시작하도록 하겠습니다.
1. 클래스 변수와 인스턴스 변수
클래스 변수
클래스 변수는 클래스에 의해 정의되고 클래스의 모든 인스턴스에서 공유되는 변수입니다. 클래스 변수는 특정 객체가 아닌 클래스 자체에 속하므로 모든 인스턴스가 동일한 값을 가집니다. 클래스에서 생성되는 인스턴스에서 모두 같은 값을 가져야 할 경우 사용할 수 있습니다.
클래스 변수는 다음과 같은 특징을 가집니다.
1) 공유 속성: 클래스 변수는 모든 인스턴스에서 공유됩니다. 즉, 클래스 변수의 값이 변경되면 해당 클래스의 모든 인스턴스에서 그 변경 사항이 반영됩니다.
2) 클래스 정의 내에 선언: 클래스 변수는 클래스 정의 내에서 메소드 밖에 선언됩니다.
3) 클래스 이름으로 접근: 클래스 변수는 클래스 이름을 통해 접근할 수 있습니다.
다음은 클래스 변수의 사용을 보여주는 간단한 예제입니다.
class Person:
# 클래스 내 생성
species = "Homo sapiens"
def print_species(self):
# 클래스 이름으로 접근이 가능함
print(f"My species is {Person.species}")
인스턴스 변수
인스턴스 변수는 클래스의 각 인스턴스(객체)마다 개별적으로 가지는 변수입니다. 이 변수들은 클래스의 생성자 메소드인 init 내에서 정의되며, 각 객체마다 고유한 값을 가질 수 있습니다. 객체 별로 변수의 값을 설정해 각각의 상황 및 정보를 나타내는 역할을 합니다.
인스턴스 변수는 다음과 같은 특징을 가집니다.
1) 객체별 고유 속성: 인스턴스 변수는 각 객체마다 고유한 값을 가질 수 있습니다. 이는 객체마다 다른 데이터를 저장할 수 있음을 의미합니다.
2) 생성자에서 초기화: 인스턴스 변수는 일반적으로 클래스의 생성자 메소드 init에서 초기화됩니다.
3) 객체를 통해 접근: 인스턴스 변수는 객체를 통해 접근하고 수정할 수 있습니다.
class Person:
def __init__(self, name):
# 객체별 고유 속성 및 생성자에서 초기화
self.name = name
def set_name(self, name):
# 객체(self)를 통해 접근
self.name = name
def get_name(self):
# 객체(self)를 통해 접근
return self.name
2. 클래스 메소드와 정적 메소드
클래스 메소드
클래스 메소드는 클래스 자체(cls)를 첫 번째 인자로 받는 메소드로, 클래스 변수를 읽거나 수정하는 데 사용됩니다. 이는 인스턴스 메소드와는 달리, 클래스나 클래스 변수에 접근할 수 있는 메소드를 정의할 수 있게 합니다. 클래스 메소드는 @classmethod 데코레이터를 사용하여 정의됩니다.
클래스 메소드는 다음과 같은 특징을 가집니다.
1) 클래스를 인자로 받음: 클래스 메소드는 첫 번째 인자로 클래스 자신을 받습니다. 관례적으로 이 인자는 cls라고 명명합니다.
2) 클래스 변수 접근 가능: 클래스 메소드는 클래스 변수에 접근하고 이를 수정할 수 있습니다.
3) 클래스 이름으로 호출 가능: 클래스 메소드는 클래스 이름으로 호출할 수 있으며, 인스턴스를 통해서도 호출할 수 있습니다.
class Person:
species = "Homo sapiens"
@classmethod
def get_species(cls):
# 첫 번째 인자인 클래스를 받아 클래스 내부 변수에 직접 접근이 가능함
return cls.species
인스턴스 메소드
인스턴스 메소드는 클래스의 각 인스턴스에서 호출할 수 있는 메소드입니다. 인스턴스 메소드는 객체가 가지고 있는 데이터를 조작하거나 그 객체와 관련된 동작을 수행합니다. 이러한 메소드는 클래스 정의 내에 일반적인 함수처럼 정의되며, 첫 번째 인자로 항상 인스턴스 자신을 나타내는 self를 받습니다. 실제 클래스 작성 시 가장 많이 사용되는 메소드입니다.
인스턴스 메소드는 다음과 같은 특징을 가집니다.
1) 인스턴스를 인자로 받음: 인스턴스 메소드는 첫 번째 인자로 인스턴스 자신을 나타내는 self를 받습니다. 이를 통해 인스턴스의 속성이나 다른 메소드에 접근할 수 있습니다.
2) 인스턴스를 통해 호출: 인스턴스 메소드는 클래스의 인스턴스를 통해 호출됩니다.
3) 인스턴스 변수와 상호작용: 인스턴스 메소드는 인스턴스 변수에 접근하고 이를 수정할 수 있습니다.
class Person:
def __init__(self, name, age):
# 인스턴스 변수
self.name = name
self.age = age
# 인스턴스 메소드
def talk(self):
print(f"{self.name} says Hi!")
# 인스턴스 메소드
def get_age(self):
return self.age
# 인스턴스 메소드
def set_age(self, new_age):
self.age = new_age
정적 메소드
정적 메서드는 클래스나 인스턴스와는 관계없이 독립적으로 실행될 수 있는 메서드입니다. 이는 클래스나 인스턴스의 상태를 변경하거나 접근할 필요가 없는 함수로, 클래스와 관련된 유틸리티 함수나 범용적인 기능을 제공하는 데 유용합니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의됩니다.
정적 메서드는 다음과 같은 특징을 가집니다.
1) 첫 번째 인자로 self나 cls를 받지 않음: 정적 메서드는 인스턴스(self)나 클래스(cls)를 첫 번째 인자로 받지 않습니다.
2) 클래스와 인스턴스를 통해 호출 가능: 정적 메서드는 클래스 이름을 통해서나 인스턴스를 통해 호출할 수 있습니다.
3) 인스턴스나 클래스 상태와 무관: 정적 메서드는 클래스나 인스턴스의 상태를 변경하거나 접근하지 않습니다. 외부에서 전달된 인자만을 사용하여 작업을 수행합니다.
class MathOperations:
@staticmethod
def add(x, y):
return x + y
@staticmethod
def subtract(x, y):
return x - y
# 클래스 이름을 통해 정적 메서드 호출
print(MathOperations.add(5, 3)) # 출력: 8
print(MathOperations.subtract(5, 3)) # 출력: 2
# 인스턴스를 통해 정적 메서드 호출
math_ops = MathOperations()
print(math_ops.add(10, 4)) # 출력: 14
print(math_ops.subtract(10, 4)) # 출력: 6
3. self 에 대해서 ...
self는 파이썬에서 클래스의 인스턴스 메서드를 정의할 때 사용되는 첫 번째 인자입니다. self는 현재 객체의 인스턴스를 가리키며, 이를 통해 인스턴스 변수와 메서드에 접근할 수 있습니다.
self는 다음과 같은 역할을 수행합니다.
1) 인스턴스 변수 접근: self를 통해 클래스의 인스턴스 변수에 접근하고 값을 설정할 수 있습니다.
2) 인스턴스 메서드 호출: self를 통해 동일한 클래스 내의 다른 인스턴스 메서드를 호출할 수 있습니다.
3) 객체 고유 식별: self는 각 인스턴스를 고유하게 식별하며, 이를 통해 여러 인스턴스가 각각의 상태를 유지할 수 있습니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def get_age(self):
return self.age
def set_age(self, new_age):
self.age = new_age
이번 강의에서는 파이썬 클래스에 대한 이해를 높이고, 직접 클래스를 만들어 사용해 보았습니다. 클래스는 객체 지향 프로그래밍의 기본적인 개념이며, 코드를 더욱 효율적이고 유지 관리하기 쉬운 방식으로 구성하는 데 도움이 됩니다.
오늘 배운 내용을 바탕으로 실제 프로젝트에 클래스를 적용해 보시고, 더 궁금한 점은 언제든지 질문해 주세요. 추가적으로, 오늘 배운 내용을 복습하고 실제로 활용해보시면 더욱 파이썬을 잘 이해하게 될 것입니다.여러분 모두가 파이썬을 이용해 객체 지향 프로그래밍을 활용하여 멋진 프로그램을 개발할 수 있기를 바랍니다.
오늘은 그림이 없이 딱딱한 느낌의 강의가 되고 말았습니다. 클래스 내부의 실제 구현에 대한 강의이기 때문에 개념적으로 이해하고 실제 작성과 실행을 통해 익혀나가시길 바랍니다. 강의를 끝까지 봐주셔서 감사합니다!