[Python] 클래스와 객체
클래스(Class)란 무엇인가?
클래스는 사실상 객체 지향 프로그래밍(OOP, Object-Oriented Programming)의 핵심입니다. 객체는 실세계 개념 또는 사물을 소프트웨어 내에서 모델링한 것을 말하며, 이러한 객체를 만드는 틀 또는 설계도가 바로 클래스라고 할 수 있습니다. 클래스 내부에는 데이터(속성)와 그 데이터에 관련된 행동(메서드)을 정의할 수 있습니다. 즉, 클래스는 비슷한 속성(변수)과 기능(함수)을 공유하는 객체들의 블루프린트입니다.
클래스의 정의 방법
Python에서 클래스를 정의하는 것은 매우 간단합니다. class
키워드를 사용하여 시작하여, 그 다음 클래스의 이름을 정의합니다. Python에서는 클래스 이름의 첫 글자를 대문자로 하는 것이 관례입니다(PascalCase). 클래스 내부에서는 속성(변수)과 메서드(함수)를 정의할 수 있으며, 그 접근은 .
연산자를 통해서 이루어집니다.
클래스 내부에 속성과 메서드를 정의하는 방법
속성은 클래스 내부에서 변수로 정의됩니다. 메서드는 클래스 내부에서 함수로 정의되며, 첫 번째 인자는 반드시 self
여야 합니다. self
는 인스턴스 자신을 가리키는 레퍼런스로, 클래스 내부의 다른 속성 또는 메서드에 접근할 때 사용됩니다.
class MyClass:
# 클래스 변수 정의
class_variable = "클래스 변수 값"
# 초기화 메서드
def __init__(self, value):
# 인스턴스 변수
self.instance_variable = value
# 메서드 정의
def my_method(self):
print("클래스 내의 메서드 호출")
print("인스턴스 변수:", self.instance_variable)
클래스의 예시
클래스를 정의한 후, 이를 기반으로 객체(인스턴스)를 생성할 수 있습니다. 객체는 클래스의 인스턴스화를 통해 만들어집니다.
간단한 클래스 정의와 인스턴스화 예시
class Dog:
# 모든 개체에 공통 속성
species = "Canis familiaris"
# 초기화 메서드
def __init__(self, name, age):
self.name = name
self.age = age
# 개의 소개 메서드
def describe(self):
return f"{self.name}는 {self.age}살 입니다."
클래스 인스턴스 만들기:
my_dog = Dog("Buddy", 5)
print(my_dog.describe()) # "Buddy는 5살 입니다." 출력
속성과 메서드 사용 예시
인스턴스 또는 클래스 변수에 접근하거나 클래스 내부의 메서드를 호출할 수 있습니다.
# 인스턴스 속성 접근
print(my_dog.name) # "Buddy" 출력
# 클래스 변수 접근
print(Dog.species) # "Canis familiaris" 출력
# 인스턴스 메소드 호출
print(my_dog.describe()) # "Buddy는 5살 입니다." 출력
위 예제와 같이, 클래스를 정의하고 인스턴스화하여 객체의 속성과 메서드에 접근하는 방식은 Python에서 객체 지향 프로그래밍을 실현하는 가장 기본적이고 핵심적인 방법입니다.
객체의 생성과 사용
Python에서 클래스를 사용해 객체를 생성하고 다루는 것은 객체지향 프로그래밍의 핵심입니다. 이 절에서는 Python에서 클래스를 기반으로 객체를 어떻게 생성하고, 객체의 속성과 메서드에 접근하는 방법을 살펴보겠습니다.
클래스를 사용해 객체를 생성하는 방법
Python에서 클래스 기반의 객체를 생성하는 것은 매우 간단합니다. 클래스를 정의한 후, 클래스 이름을 호출하고 괄호를 추가함으로써 객체를 생성할 수 있습니다. 이 때, 괄호 안에는 초기화 메서드인 __init__
에 정의된 매개변수를 전달할 수 있습니다. 다음 예시를 보겠습니다.
class Dog:
def __init__(self, name, age): # 초기화 메서드
self.name = name # 인스턴스 변수 name
self.age = age # 인스턴스 변수 age
# 객체 생성
my_dog = Dog(name="Buddy", age=4)
위 예시에서 Dog
라는 클래스를 정의하고, 이 클래스를 사용해 my_dog
라는 객체를 생성했습니다. 매개변수 name
과 age
를 __init__
메서드에 전달함으로써 my_dog
객체의 name
과 age
속성을 초기화했습니다.
객체의 속성에 접근하는 방법
객체의 속성에 접근하는 것은 매우 간단합니다. 객체명 뒤에 점을 찍고 속성 이름을 적어주면 됩니다. 위에서 생성한 my_dog
객체의 name
과 age
속성에 접근하는 방법은 다음과 같습니다.
# 객체의 속성에 접근
print(my_dog.name) # 출력: Buddy
print(my_dog.age) # 출력: 4
객체의 메서드를 호출하는 방법
객체의 메서드를 호출하는 방식도 속성에 접근하는 방식과 유사합니다. 객체명 뒤에 점을 찍고 메서드 이름을 적은 후, 괄호를 붙여 메서드를 호출합니다. 괄호 안에는 필요에 따라 매개변수를 넣을 수 있습니다. 다음 예시에서 Dog
클래스에 sit
라는 메서드를 추가하고, 이 메서드를 호출해 보겠습니다.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self): # sit 메서드 추가
print(f"{self.name} is now sitting.")
# 객체 생성
my_dog = Dog(name="Buddy", age=4)
# 메서드 호출
my_dog.sit() # 출력: Buddy is now sitting.
이제 Python에서 클래스를 기반으로 객체를 어떻게 생성하고, 이들 객체의 속성과 메서드에 어떻게 접근하는지에 대해 이해했습니다. 이러한 방식을 통해 코드를 더 잘 구조화하고 재사용할 수 있도록 객체지향 프로그래밍 패러다임을 활용할 수 있습니다.
클래스 변수와 인스턴스 변수
클래스 변수와 인스턴스 변수는 파이썬 객체지향 프로그래밍에서 매우 중요한 개념입니다. 이 둘의 주요 차이는 범위와 공유 여부에 있습니다.
클래스 변수
클래스 변수는 클래스 정의 내부에서 생성되며, 클래스의 모든 인스턴스 간에 공유됩니다. 이 변수들은 클래스 레벨에서 설정되므로, 해당 클래스의 모든 객체가 같은 값을 공유합니다. 클래스 변수는 클래스 이름을 사용하여 접근할 수 있으며, 인스턴스를 통해서도 접근할 수 있습니다. 그러나 이 변수를 인스턴스를 통해 수정하면 인스턴스 변수가 생성되고, 클래스 변수의 값은 변경되지 않습니다.
- 클래스 변수의 정의와 사용 방법
클래스 변수는 클래스 정의 블록 최상단에서 정의됩니다.
class MyClass:
class_variable = "이것은 클래스 변수입니다."
def __init__(self, value):
self.instance_variable = value
- 클래스 변수의 특징
클래스 변수의 주된 특징은 모든 인스턴스에 의해 공유된다는 것입니다. 따라서 한 인스턴스에서 클래스 변수를 수정하면, 다른 모든 인스턴스에 영향을 미칩니다.
class MyClass:
class_variable = 0
# 인스턴스 생성
obj1 = MyClass()
obj2 = MyClass()
# 클래스 변수 접근 및 수정
MyClass.class_variable = 2
print(obj1.class_variable) # 출력: 2
print(obj2.class_variable) # 출력: 2
인스턴스 변수
인스턴스 변수는 클래스 내부의 메서드에 의해 정의되며, 클래스의 각 인스턴스 내에서만 접근할 수 있습니다. 이 변수들은 객체 각각에 속해 있으므로, 하나의 인스턴스의 인스턴스 변수 값을 변경해도 다른 인스턴스에는 영향을 미치지 않습니다.
- 인스턴스 변수의 정의와 사용 방법
인스턴스 변수는 보통 __init__
메서드 안에서 정의되며, self
키워드를 사용하여 인스턴스에 값을 할당합니다.
class MyClass:
def __init__(self, value):
self.instance_variable = value
# 인스턴스 생성 및 인스턴스 변수 접근
obj = MyClass("이것은 인스턴스 변수입니다.")
print(obj.instance_variable) # 출력: 이것은 인스턴스 변수입니다.
- 인스턴스 변수의 특징
인스턴스 변수의 가장 큰 특징은 각 인스턴스에 고유하다는 것입니다. 이는 각 객체가 자신만의 값을 유지할 수 있음을 의미합니다.
class MyClass:
def __init__(self, value):
self.instance_variable = value
obj1 = MyClass(1)
obj2 = MyClass(2)
# 각각의 인스턴스 변수는 독립적입니다.
print(obj1.instance_variable) # 출력: 1
print(obj2.instance_variable) # 출력: 2
이렇게 클래스 변수와 인스턴스 변수는 사용 목적과 범위에 따라 선택하여 사용할 수 있습니다. 클래스 전체에서 공유해야 하는 값은 클래스 변수로, 각 인스턴스가 독립적으로 가져야 하는 값은 인스턴스 변수로 정의하는 것이 좋습니다.
메서드
메서드는 클래스 내부에 정의된 함수입니다. 클래스의 객체(인스턴스)를 통해 호출되며, 객체의 속성(데이터) 또는 다른 메서드들과 상호작용합니다. 여기서는 특히 인스턴스 메서드에 집중하여 설명합니다.
인스턴스 메서드의 정의와 사용 방법
인스턴스 메서드는 클래스 내부에 정의되며, 첫 번째 매개변수로 자기 자신을 의미하는 self
를 명시적으로 받습니다. 이 메서드는 인스턴스를 통해 호출될 때 해당 인스턴스가 self
매개변수를 통해 메서드에 전달됩니다.
class MyClass:
def instance_method(self, arg1, arg2):
# 메서드 내에서는 self를 통해 클래스의 다른 메서드나 속성에 접근할 수 있습니다.
self.data = arg1 + arg2 # 인스턴스 변수에 접근
return self.data
위 예시에서 instance_method
는 인스턴스 메서드로 정의됩니다. 이 메서드를 사용하려면 먼저 MyClass
의 인스턴스를 생성한 후, 그 인스턴스를 통해 메서드를 호출합니다.
obj = MyClass() # MyClass의 인스턴스 생성
result = obj.instance_method(5, 3) # 인스턴스 메서드 호출
print(result) # 8 출력
인스턴스 메서드에서의 'self' 키워드
self
키워드는 클래스 내의 메서드가 호출될 때 인스턴스 자신을 참조하는 데 사용됩니다. 메서드 내에서 self
를 사용하면, 그 메서드가 호출된 인스턴스의 속성(attribute)이나 다른 메서드에 접근할 수 있습니다.
- 클래스 내부에서
self.attribute_name
형태로 인스턴스 변수에 접근하거나 수정할 수 있습니다. self.other_method()
형태로 동일 인스턴스의 다른 메서드를 호출할 수도 있습니다.
class Person:
def __init__(self, name):
self.name = name # 인스턴스 변수 초기화
def say_hello(self):
# say_hello 메서드에서 self.name을 통해 인스턴스 변수에 접근
print(f"Hello, my name is {self.name}!")
# 인스턴스 생성 및 메서드 호출 예시
p = Person("John")
p.say_hello() # "Hello, my name is John!" 출력
위 예제에서는 인스턴스 변수 name
과 두 개의 메서드 __init__
(생성자), say_hello
를 정의했습니다. say_hello
메서드에서 self.name
을 통해 해당 인스턴스의 name
속성에 접근하고 있습니다. 이런 방식으로 self
는 인스턴스의 현재 상태에 접근하고 조작하는 데 핵심적인 역할을 합니다.
요약하자면, 인스턴스 메서드는 클래스 내부에서 정의되고, 메서드의 첫 번째 매개변수로 인스턴스 자신을 나타내는 self
를 사용합니다. 이를 통해 인스턴스 변수 및 다른 메서드에 접근할 수 있으며, 클래스의 인스턴스를 사용하여 호출됩니다.