파이썬 (pythoon)

파이썬 클래스 총정리

working for you 2023. 5. 1. 11:41
반응형

파이썬을 공부하다보면 함수이후에 클래스를 배우게 됩니다. 클래스는 변수와 함수의 집합으로, 객체를 생성하는 틀 역할을 합니다. 마치 타코야끼를 만들때, 밀가루를 틀에다 부어 찍어내는 느낌이지요. 클래스가 필요한 이유는 코딩을 반복하지 않고 가독성 좋으며, 시간을 절약하기 위해 사용됩니다. 자 그럼 파이썬 클래스 및 객체에 같이 대해 알아보겠습니다.

 

 

[목차]
1. 파이썬 클래스 (class)란?
2. 파이썬 클래스 생성하기
3. 파이썬 클래스 객체생성하기
4. 클래스 변수와 인스턴스 변수
5. 파이썬 클래스 상속
6. 파이썬 클래스 다중 상속
7. 메서드(Method)와 속성(Attribute)
8. 클래스 메서드 and 정적메서드
9. 매직 메서드(Magic Method)
10. 클래스의 특수한 메서드

 

파이썬 클래스

 

1. 파이썬 클래스 (class)란?

파이썬 클래스, 객체 지향 프로그래밍(OOP)에서 가장 중요한 개념 중 하나입니다. 이 개념은 같은 구조의 여러 객체를 만들 수 있도록 하며, 코드 재사용성을 높입니다. 파이썬을 비롯한 대부분의 언어에서 이 개념을 지원하며, 초보자도 쉽게 이해할 수 있습니다.

 

클래스는 객체를 생성하기 위한 설계도와 같은 역할을 합니다. 클래스 내에서는 변수와 함수를 정의할 수 있으며, 이를 이용하여 여러 객체를 만들어 낼 수 있습니다. 이러한 객체들은 각자 고유한 특성과 함수를 가지며, 서로 다른 데이터를 가질 수 있습니다. 이를 통해 코드의 재사용성을 높이고, 유지보수를 쉽게 할 수 있습니다.

 

파이썬에서 클래스를 만들기 위해서는 class 키워드를 사용합니다. 클래스를 만든 후에는 이를 이용하여 객체를 생성할 수 있습니다. 이를 통해 여러 객체를 만들어 내며, 각 객체는 서로 다른 특성과 함수를 가질 수 있습니다. 이러한 객체들은 서로 독립적으로 존재하며, 하나의 객체가 버그를 발생시켜도 다른 객체에는 영향을 미치지 않습니다.

 

2. 파이썬 클래스 생성하기

클래스를 사용하면 객체를 생성하는 데 필요한 여러 변수와 해당 객체가 수행하는 작업을 수행하는 여러 메소드를 정의하여 객체를 더욱 구체적으로 나타낼 수 있습니다.

 

클래스정의

클래스를 정의할 때는 class 키워드를 사용합니다. 클래스 내부에는 클래스 변수와 인스턴스 변수, 그리고 클래스 메서드와 인스턴스 메서드가 있습니다. 클래스 변수는 클래스 전체에서 공유되며, 인스턴스 변수는 각 객체마다 고유한 상태를 가질 수 있습니다. 메서드는 변수와 비슷한 개념으로, 객체가 수행하는 작업을 정의합니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
class MyClass:
class_variable = 0
 
def __init__(self, instance_variable):
self.instance_variable = instance_variable
 
def class_method(cls):
cls.class_variable += 1
 
def instance_method(self):
self.instance_variable += 1
cs

위 코드는 MyClass 클래스를 정의하고 있습니다. class_variable은 클래스 변수로, __init__ 메서드에서 정의한 instance_variable은 각 객체마다 고유한 값을 가지는 인스턴스 변수입니다. class_method는 클래스 메서드, instance_method는 인스턴스 메서드 입니다.

 

클래스 사용

클래스를 사용할 때는 클래스를 인스턴스화하여 객체를 생성합니다. 객체를 생성할 때는 MyClass()와 같이 클래스 이름을 호출하면 됩니다. 이렇게 만들어진 객체는 해당 클래스의 인스턴스입니다. 인스턴스는 클래스를 통해 접근할 수 있는 변수와 메서드를 가집니다.

 

1
2
3
4
5
6
7
my_object = MyClass(10)
my_object.instance_method()
 
print(my_object.instance_variable) # Output: 11
 
MyClass.class_method()
print(MyClass.class_variable) # Output: 1
cs

MyClass 클래스를 이용하여 my_object 객체를 생성합니다. instance_method를 호출하여 instance_variable 값을 증가시키고 있습니다. 또, class_method를 호출하여서도 class_variable 값을 증가시킵니다.

 

상속

파이썬에서는 클래스를 상속하여 새로운 클래스를 만들 수 있습니다. 이를 활용하면 부모 클래스의 속성과 메서드를 그대로 상속받아 자식 클래스에서 사용할 수 있습니다. 예를 들어, 부모 클래스로부터 상속받은 메서드를 자식 클래스에서 오버라이드하여 새로운 동작을 추가할 수도 있습니다.

 

 

또한, 상속을 통해 객체 지향 프로그래밍의 상속 개념을 활용하여 코드를 더욱 효율적으로 작성할 수 있습니다. 상속을 이용하면 코드의 재사용성을 높일 수 있으며, 이를 통해 유지보수 비용을 줄일 수 있습니다.

 

1
2
3
class MyChildClass(MyClass):
def child_method(self):
print("Child method called")
cs

 

child_method는 자식 클래스에서 추가로 정의한 메서드입니다.

 

3. 파이썬 클래스 객체생성하기

객체를 생성하기 위해서는 클래스를 먼저 정의해야 합니다. 클래스를 정의할 때는 다음과 같은 형식을 따릅니다.

1
2
3
class 클래스명:
# 클래스 변수
# 메서드
cs

 

클래스 변수는 모든 객체에서 공유되는 변수입니다. 클래스 내에서 선언된 변수는 해당 클래스의 모든 객체에서 공유됩니다. 메서드는 클래스에서 정의된 함수입니다.

객체를 생성하기 위해서는 다음과 같은 형식을 따릅니다.

1
변수명 = 클래스명()
cs

여기서 변수명은 생성된 객체를 가리키는 변수입니다. 클래스명()은 클래스에서 정의한 __init__() 메서드를 호출하여 객체를 생성합니다.

 

 

Person 클래스를 정의하고 이를 이용하여 객체를 생성하는 예제를 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
 
person1 = Person("Alice", 20)
person2 = Person("Bob", 25)
 
print(person1.name) # Alice
print(person2.age) # 25
 
cs

Person 클래스는 name과 age 인스턴스 변수를 가지고 있습니다. __init__() 메서드는 객체를 생성할 때 호출되며, 인스턴스 변수를 초기화합니다. person1과 person2는 Person 클래스에서 생성된 두 개의 객체입니다. person1.name은 "Alice"를 출력하고, person2.age는 25를 출력합니다.

4. 클래스 변수와 인스턴스 변수

파이썬 클래스를 이용하면 객체를 생성할 때 해당 클래스의 변수와 함수를 사용할 수 있습니다. 클래스 변수와 인스턴스 변수는 클래스에서 정의된 변수의 두 가지 유형입니다.

 

 

클래스 변수

클래스 변수는 클래스 내에서 정의된 변수로, 해당 클래스의 모든 인스턴스에서 공유됩니다. 따라서, 하나의 클래스 변수를 변경하면 모든 인스턴스에서 변경된 값을 공유합니다. 클래스 변수는 클래스 내에서 정의되며, self 키워드를 사용하지 않습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Car:
wheels = 4
 
def __init__(self, make, model):
self.make = make
self.model = model
 
car1 = Car("Toyota", "Camry")
car2 = Car("Honda", "Accord")
 
print(car1.wheels) # 4
print(car2.wheels) # 4
 
Car.wheels = 6
 
print(car1.wheels) # 6
print(car2.wheels) # 6
cs

Car 클래스의 wheels 변수는 클래스 변수입니다. Car 클래스의 모든 인스턴스에서 wheels 변수의 값은 동일합니다. 따라서 car1.wheels와 car2.wheels는 모두 4입니다. 그러나 Car.wheels 변수를 6으로 변경하면, 모든 인스턴스에서 wheels 변수의 값이 변경됩니다.

 

인스턴스 변수

인스턴스 변수는 각각의 인스턴스마다 고유한 값을 가지는 변수입니다. 이 변수는 self 키워드를 사용하여 정의됩니다. 인스턴스 변수는 해당 인스턴스에서만 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Car:
def __init__(self, make, model):
self.make = make
self.model = model
self.wheels = 4
 
car1 = Car("Toyota", "Camry")
car2 = Car("Honda", "Accord")
 
print(car1.wheels) # 4
print(car2.wheels) # 4
 
car1.wheels = 6
 
print(car1.wheels) # 6
print(car2.wheels) # 4
 
cs

Car 클래스의 wheels 변수는 인스턴스 변수입니다. car1 인스턴스와 car2 인스턴스는 각자 wheels 변수를 가지며, car1.wheels는 6이고 car2.wheels는 4입니다.

 

 

클래스 변수는 해당 클래스의 모든 인스턴스에서 공유되며, 인스턴스 변수는 해당 인스턴스에서만 사용할 수 있습니다. 클래스 변수와 인스턴스 변수는 각각의 특성에 따라 적절하게 사용해야 합니다. 클래스 변수는 모든 인스턴스에서 공통적으로 사용되는 값을 저장할 때 유용하며, 인스턴스 변수는 각 인스턴스의 고유한 값을 저장할 때 유용합니다.

 

5. 파이썬 클래스 상속

클래스 상속은 기존 클래스를 이용하여 새로운 클래스를 만드는 것입니다. 이를 통해 기존 클래스의 변수와 함수를 상속받아 새로운 클래스를 만들 수 있습니다. 파이썬에서는 클래스를 상속받을 때 class DerivedClass(BaseClass):와 같은 형식으로 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
 
def say_hello(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
 
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
 
def say_hello(self):
super().say_hello()
print(f"My student ID is {self.student_id}.")
 
cs

Person 클래스는 name과 age 인스턴스 변수를 가지고 있으며, say_hello() 인스턴스 메서드를 구현합니다. Student 클래스는 Person 클래스를 상속받아 say_hello() 메서드를 오버라이딩합니다. 또한, Student 클래스는 student_id 인스턴스 변수를 가지고 있습니다.

1
2
3
4
5
6
person = Person("Alice", 20)
person.say_hello()
 
student = Student("Bob", 21, "12345")
student.say_hello()
 
cs

결과값

1
2
3
Hello, my name is Alice and I am 20 years old.
Hello, my name is Bob and I am 21 years old.
My student ID is 12345.
cs

 

6. 파이썬 클래스 다중 상속

파이썬에서는 다중 상속을 지원합니다. 다중 상속은 두 개 이상의 클래스를 상속받아 새로운 클래스를 만드는 것입니다. 이를 통해 여러 클래스의 특성을 모두 상속받아 새로운 클래스를 만들 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A:
def hello(self):
print("Hello from A")
 
class B:
def hello(self):
print("Hello from B")
 
class C(A, B):
pass
 
class D(B, A):
pass
 
c = C()
c.hello()
 
d = D()
d.hello()
 
cs

A 클래스와 B 클래스는 hello() 메서드를 가지고 있습니다. C 클래스는 A 클래스와 B 클래스를 상속받아 hello() 메서드를 오버라이딩합니다. D 클래스는 B 클래스와 A 클래스를 상속받아 hello() 메서드를 오버라이딩합니다.

1
2
3
4
5
c = C()
c.hello()
 
d = D()
d.hello()
cs

결과값

1
2
Hello from A
Hello from A
cs

 

 

파이썬에서는 클래스 상속을 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다. 클래스 상속을 이용하면 기존 클래스의 변수와 함수를 상속받아 새로운 클래스를 만들 수 있습니다. 또한, 파이썬에서는 다중 상속도 지원하므로 여러 클래스의 특성을 모두 상속받아 새로운 클래스를 만들 수 있습니다.

 

 

7. 메서드(Method)와 속성(Attribute)

메서드

클래스에는 객체가 수행하는 여러 작업을 수행하는 메서드(Method)도 포함됩니다. 메서드는 클래스 내부에서 정의되며, 객체를 통해 호출할 수 있습니다. 메서드는 함수와 유사하지만, 클래스 객체를 더 쉽게 다룰 수 있도록 설계되었습니다.

메서드는 다음과 같이 정의됩니다.

1
2
3
4
class MyClass:
def my_method(self, arg1, arg2):
return arg1 + arg2
 
cs

my_method()는 MyClass 클래스의 메서드입니다. self 매개변수는 메서드가 속한 객체를 나타냅니다. 메서드는 객체를 통해 호출되며, self 매개변수는 자동으로 전달됩니다.

 

 

예제

Person 클래스를 정의하고 이를 이용하여 객체를 생성하는 예제입니다.

1
2
3
4
5
6
7
8
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
 
def say_hello(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
 
cs

Person 클래스는 name과 age 속성을 가지고 있으며, say_hello() 메서드를 구현합니다. __init__() 메서드는 객체가 생성될 때 자동으로 호출되며, self 매개변수를 통해 객체를 나타냅니다. say_hello() 메서드는 객체를 통해 호출되며, self 매개변수를 통해 자동으로 전달됩니다.

1
2
3
person = Person("Alice", 20)
person.say_hello()
 
cs

 

결과값

1
2
Hello, my name is Alice and I am 20 years old.
 
cs

 

속성

클래스에는 객체의 상태를 나타내는 여러 변수가 정의됩니다. 이러한 변수를 멤버 변수 또는 속성(Attribute)이라고 부릅니다. 속성은 클래스 내부에서 정의되며, 객체를 통해 접근할 수 있습니다. 객체가 속성을 가지고 있다는 것은 해당 객체가 특정한 값을 가지고 있다는 것을 의미합니다.

 

속성은 다음과 같이 정의됩니다.

1
2
3
4
class MyClass:
def __init__(self, arg1, arg2):
self.attr1 = arg1
self.attr2 = arg2
cs

attr1과 attr2는 MyClass 클래스의 속성입니다. 객체를 생성하면 __init__() 메서드가 호출되어 self에 해당 객체가 할당됩니다. self.attr1 = arg1은 MyClass 클래스의 객체가 attr1 속성을 가지고 있으며, 이 속성의 값은 arg1이라는 것을 의미합니다.

 

 

8. 클래스 메서드 and 정적메서드

파이썬 클래스에는 인스턴스 메서드 외에도 클래스 메서드와 정적 메서드가 있습니다. 클래스 메서드는 클래스에서 직접 호출할 수 있는 메서드이며, 첫 번째 인자로 클래스 자신을 받는 cls 매개변수를 갖습니다. 정적 메서드는 클래스와 인스턴스 모두에서 직접 호출할 수 있는 메서드이며, 매개변수가 없습니다. 클래스 메서드와 정적 메서드는 각각 클래스 변수와 인스턴스 변수에 접근할 수 있는지의 차이가 있으므로, 필요에 따라 적절한 방식으로 사용해야 합니다.

 

클래스 메서드

클래스 메서드는 클래스에서 직접 호출할 수 있는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를 사용하여 정의합니다. 클래스 메서드는 첫 번째 인자로 클래스 자신을 받는 cls 매개변수를 갖습니다. 이 cls 매개변수를 이용하여 클래스 변수에 접근할 수 있습니다.

1
2
3
4
5
6
7
8
class MyClass:
class_variable = 0
 
@classmethod
def class_method(cls):
cls.class_variable += 1
print(f"class_variable: {cls.class_variable}")
 
cs

class_method 메서드를 클래스에서 직접 호출하였습니다. 이를 통해 클래스 메서드가 클래스 변수에 접근할 수 있음을 확인할 수 있습니다.

 

정적 메서드

정적 메서드는 클래스와 인스턴스 모두에서 직접 호출할 수 있는 메서드입니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다. 정적 메서드는 인자로 클래스나 인스턴스를 받지 않습니다. 이 매개변수가 없기 때문에 클래스 변수에 접근할 수 없으며, 일반 함수와 동일한 방식으로 사용됩니다.

1
2
3
4
5
6
7
8
9
10
class MyClass:
@staticmethod
def static_method(x):
return x**2
 
print(MyClass.static_method(3)) # 출력: 9
 
my_instance = MyClass()
print(my_instance.static_method(3)) # 출력: 9
 
cs

static_method는 정적 메서드입니다. 이 메서드는 인자로 받은 x를 제곱하여 반환합니다. static_method는 클래스와 인스턴스 모두에서 직접 호출할 수 있으며, 반환값은 동일합니다.

 

 

9. 매직 메서드(Magic Method)

매직 메서드는 파이썬에서 특별한 기능을 수행하는 메서드입니다. 이러한 메서드는 언더스코어(_)로 시작하고 끝나며, 객체의 생성, 연산자 오버로딩, 객체 출력 등 다양한 기능을 수행합니다.

 

 

매직 매서드의 개념 및 사용 방법

매직 메서드는 객체 지향 프로그래밍에서 매우 중요한 역할을 합니다. 이러한 메서드는 언더스코어(_)로 시작하고 끝나며, 객체의 생성, 연산자 오버로딩, 객체 출력 등 다양한 기능을 수행합니다.

매직 메서드를 사용하려면 클래스 내부에 해당 메서드를 정의해야 합니다. 예를 들어, 객체를 생성할 때 호출되는 매직 메서드는 `__init__()`입니다. 이 메서드는 객체가 생성될 때 자동으로 호출되며, 초기화를 수행합니다.

매직 메서드를 사용하면 연산자를 오버로딩하여 새로운 동작을 정의할 수 있습니다. 예를 들어, `__add__()` 메서드를 정의하면 덧셈 연산자를 오버로딩하여 객체 간 덧셈을 수행할 수 있습니다.

 

 

매직 매서드 예제

1) 객체 출력하기

매직 메서드를 사용하면 객체를 출력할 때 보다 자세하고 유용한 정보를 출력할 수 있습니다. __str__() 메서드를 사용하면 객체를 문자열로 변환하여 출력할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
 
def __str__(self):
return f"Person: {self.name} ({self.age})"
 
person = Person("Alice", 20)
print(person)
 
cs

결과값

1
2
Person: Alice (20)
 
cs

2) 객체 간 덧셈 연산하기

매직 메서드를 사용하여 객체 간 덧셈 연산을 수행할 수 있습니다. __add__() 메서드를 정의하여 덧셈 연산자를 오버로딩합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
 
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
 
def __str__(self):
return f"Vector ({self.x}, {self.y})"
 
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)
 
cs

결과값

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
```
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
 
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
 
def __str__(self):
return f"Vector ({self.x}, {self.y})"
 
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)
 
```
cs

3) 객체 비교하기

매직 메서드를 사용하여 객체를 비교할 수 있습니다. __eq__() 메서드를 정의하여 두 객체가 같은지 여부를 판별합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
 
def __eq__(self, other):
return self.width == other.width and self.height == other.height
 
def __str__(self):
return f"Rectangle ({self.width}, {self.height})"
 
r1 = Rectangle(10, 20)
r2 = Rectangle(10, 20)
r3 = Rectangle(20, 30)
 
print(r1 == r2)
print(r1 == r3)
 
cs

결과값

1
2
True
False
cs

매직 메서드는 파이썬에서 객체 지향 프로그래밍을 할 때 매우 유용하게 사용됩니다. 이러한 메서드를 사용하면 객체의 생성, 연산자 오버로딩, 객체 출력 등 다양한 기능을 수행할 수 있습니다. 매직 메서드를 적절하게 사용하면 코드의 가독성을 높이고, 재사용성을 높일 수 있습니다.

 

10. 클래스의 특수한 메서드

파이썬에서는 클래스에 특별한 메서드들을 정의할 수 있습니다.

 

1) __init__ 메서드

__init__ 메서드는 클래스의 인스턴스가 생성될 때 호출되는 특수한 메서드입니다. 이 메서드를 이용하여 인스턴스의 속성을 초기화할 수 있습니다. __init__ 메서드는 클래스 내부에서 다음과 같이 정의됩니다.

1
2
3
4
5
6
class MyClass:
def __init__(self, arg1, arg2, ...):
self.arg1 = arg1
self.arg2 = arg2
...
 
cs

self는 인스턴스 자체를 나타내며, arg1, arg2 등은 인스턴스를 초기화하는 데 필요한 인수입니다.

 

 

2) __str__ 메서드

__str__ 메서드는 클래스의 인스턴스를 문자열로 표현할 때 호출되는 특수한 메서드입니다. 이 메서드를 이용하여 인스턴스를 원하는 형식으로 출력할 수 있습니다. __str__ 메서드는 클래스 내부에서 다음과 같이 정의됩니다.

1
2
3
4
class MyClass:
def __str__(self):
return "문자열"
 
cs

return으로 반환되는 문자열이 인스턴스를 표현하는 문자열입니다.

 

 

3) __eq__ 메서드

__eq__ 메서드는 클래스의 인스턴스를 비교할 때 호출되는 특수한 메서드입니다. 이 메서드를 이용하여 인스턴스가 같은지 다른지를 판단할 수 있습니다. __eq__ 메서드는 클래스 내부에서 다음과 같이 정의됩니다.

1
2
3
4
class MyClass:
def __eq__(self, other):
return self.attr == other.attr
 
cs

self.attr과 other.attr은 인스턴스의 속성입니다. __eq__ 메서드에서는 이 속성들을 비교하여 논리값을 반환합니다.

 

 

파이썬에서는 클래스에 특수한 메서드를 정의하여 객체를 보다 쉽게 다룰 수 있습니다. __init__ 메서드는 인스턴스를 초기화하는 데 사용되며, __str__ 메서드는 인스턴스를 문자열로 표현하는 데 사용됩니다. 또한, __eq__ 메서드는 인스턴스를 비교하는 데 사용됩니다. 이러한 특수한 메서드들을 이용하여 객체를 더욱 유연하게 다룰 수 있습니다.

반응형