객체지향 프로그래밍(Object-Oriented Programming)
객체 지향 프로그래밍은 실제 객체의 관점에서 소프트웨어를 모델링하는 프로그래밍입니다.
객체라는 용어는 속성이 있고 일부 기능을 수행할 수 있는 모든 것을 나타냅니다. 객체 지향 프로그래밍에서는 어떤 속성을 갖고 어떤 기능을 수행할 수 있으면 객체로 모델링 할 수 있습니다.
예를 들어 비행 시뮬레이터 게임을 개발 중이라면 비행기의 다음과 같은 속성과 기능을 확인할 수 있으므로 객체로 모델링 할 수 있습니다.
속성 : 비행기의 모델, 이름, 엔진 수
기능 : 비행기 시작, 비행기 정지, 비행기 이동
유사하게, 조종사는 비행기와 다른 속성과 기능을 가지고 있으므로 객체로 모델링 될 수 있습니다.
속성 : 조종사의 이름, 나이, 성별
기능 : 비행기 탑승, 비행기에서 내리기, 좌석 변경
클래스 정의와 객체 생성
객체를 생성하기 전에 클래스를 먼저 생성해야 합니다. 클래스는 객체에 대한 지도나 청사진으로 생각할 수 있습니다. 클래스와 객체의 관계는 계획과 집의 관계와 유사합니다. 평면도를 보면 그 집에 몇 개의 침실, 식당, 화장실 등이 있을 것인지 알 수 있습니다. 마찬가지로 클래스를 보면 객체의 속성과 기능을 알 수 있습니다. 단일 클래스를 사용하여 여러 개체를 만들 수 있습니다.
클래스를 생성하려면 class 키워드 뒤에 클래스 이름과 세미콜론을 사용해야 합니다. 다음 스크립트는 class_method()함수를 하나 갖는 NewClass라는 클래스를 생성해 보았습니다.
class NewClass:
def class_method(self):
print("Hello this is a method inside a class")
클래스의 객체를 생성하려면 클래스 이름 뒤에 한 쌍의 괄호를 작성해야 합니다. 다음 스크립트는 NewClass 클래스에 대해 nc라는 개체를 만듭니다. nc 객체를 사용하여 새 클래스의 함수(메서드)를 호출할 수 있습니다. 이렇게 하려면 아래와 같이 점 연산자 다음에 이름을 추가해야 합니다.
nc = NewClass()
nc.class_method()
Output:
Hello this is a method inside a class
클래스에 변수와 메서드 선언
객체는 속성과 메서드를 가질 수 있습니다. 속성과 함수가 있는 객체를 생성하려면 해당 속성과 메서드를 해당 클래스에 추가해야 합니다. 클래스 내부에 정의된 속성 및 메서드를 멤버 속성 및 멤버 메서드라고 합니다.
다음 스크립트는 하나의 멤버 메서드 class_method()와 두 개의 멤버 속성 color 및 id를 사용하여 클래스를 만들었습니다.
Python에서는 인스턴스 메서드의 첫 번째 속성으로 self를 전달해야 합니다. 인스턴스 메서드는 클래스 객체를 사용하여 액세스할 수 있는 메서드입니다. 마찬가지로 인스턴스 변수를 생성하려면 인스턴스 메소드 내부에 이러한 변수를 정의해야 하며 속성 이름 앞에 키워드 self를 접두사로 붙여야 합니다.
class NewClass: # class 선언
def class_method(self): # 멤버 메서드
self.color = 'red' # 멤버 변수
self.id = 24
print("Hello this is a method inside a class")
다음 스크립트는 NewClass 클래스를 nc 객체로 만들고 nc객체를 통해서 NewClass클래스 안의 메서드나 속성에 접근하는 예제입니다.
nc = NewClass()
nc.class_method()
print(nc.color)
print(nc.id)
Output:
Hello this is a method inside a class
red
24
단일 클래스에서 여러 개체를 만들 수 있습니다. 다음 스크립트에서는 동일한 NewClass 클래스를 사용하여 다른 개체 nc1과 nc2를 정의하고 해당 클래스의 멤버 메서드 및 멤버 특성에 액세스합니다. 여기서, nc1과 nc2의 color와 id속성 값은 동일합니다. 일반적으로 동일한 클래스의 다른 객체에 대한 인스턴스 멤버의 값은 다릅니다.
nc1 = NewClass()
nc2 = NewClass()
nc1.class_method()
print(nc1.color)
nc2.class_method()
print(nc2.color)
Output:
Hello this is a method inside a class
red
Hello this is a method inside a class
red
다음 스크립트는 멤버 메서드 class_method()가 color 및 id 속성에 값을 할당하는 데 사용되는 두 개의 매개 변수 값을 받는 클래스를 만들어 보았습니다.
class NewClass:
def class_method(self, my_color, my_id):
self.color = my_color
self.id = my_id
print("Hello this is a method inside a class")
nc1과 nc2객체를 만들고 NewClass클래스의 class_method()함수를 호출하고 함수의 매개변수에 각각 다른 값을 입력해 준 후 클래스의 color속성을 출력해 보면 객체로 호출할 당시의 함수의 매개변수로 입력했던 값이 출력됩니다.
nc1 = NewClass()
nc1.class_method("Green", 18)
nc2 = NewClass()
nc2.class_method("Red", 22)
print(nc1.color)
print(nc2.color)
Output:
Hello this is a method inside a class
Hello this is a method inside a class
Green
Red
class_method의 매개변수는 self, my_color, my_id 3개를 입력 받습니다. 그런데 일반 함수와 달리 메서드의 첫번째 매개변수는 self는 특별한 의미를 갖습니다.
클래스에서 인스턴스 메서드를 정의할 때는 self를 사용하였지만 실제 객체를 선언해서 이 메서드를 호출할 때는 self를 제외한 2개의 매개변수만 사용됩니다.
다음 그림처럼 nc1.class_method(“Green”, 18)을 호출하면 class_method메서드의 첫 번째 매개변수 self에는 class_method()를 호출한 객체 nc1이 자동으로 전달됩니다.
클래스 생성자
생성자는 클래스의 객체를 생성할 때 자동으로 호출되는 함수입니다. 생성자 함수의 이름은 항상 __init__()입니다.
클래스의 객체를 생성하는 것을 클래스 초기화라고도 합니다.
다음 스크립트는 color 및 id 속성을 초기화하는 데 사용되는 두 개의 매개변수 값을 허용하는 생성자 메서드를 사용하여 클래스를 만듭니다. 이 클래스에는 color 및 id 속성 값을 표시하는 display_vars() 메서드도 포함되어 있습니다.
class NewClass:
def __init__(self, my_color, my_id):
self.color = my_color
self.id = my_id
def display_vars(self):
print(self.color)
print(self.id)
사용자 정의 생성자가 있는 클래스의 개체를 만들 때 클래스 이름 뒤에 오는 괄호를 사용하여 생성자 매개변수의 값을 전달해야 합니다.
다음 스크립트는 NewClass 클래스에 대한 객체 nc1을 생성합니다. 생성자에 전달되는 값은 Yellow과 10입니다. 이 값은 각각 nc1 객체의 color 및 id 속성에 할당됩니다. 생성자를 사용하면 추가 메서드를 정의하지 않고도 멤버 속성을 초기화할 수 있음을 알 수 있습니다.
nc1 = NewClass("Yellow", 10)
nc1.display_vars()
Output:
Yellow
10
클래스 멤버 vs 인스턴스 멤버
파이썬의 객체 지향 프로그래밍에서 클래스 멤버 속성과 메서드, 인스턴스 멤버 속성과 메서드의 차이점을 이해하는 것은 매우 중요합니다.
클래스 속성 및 메서드
클래스 속성은 클래스 이름을 통해 액세스할 수 있는 속성이며, 그 값은 다른 객체 간에 공유됩니다.
클래스 속성은 생성자 외부에서 선언됩니다.
클래스 메서드는 클래스 이름을 통해 액세스할 수 있는 메서드입니다.
클래스 메서드에는 매개변수 값이 포함되어 있지 않습니다.
인스턴스 속성 및 클래스
인스턴스 속성은 인스턴스(객체)에 고유한 속성이며 클래스의 다른 객체 간에 공유되지 않습니다. 클래스의 각 개체에는 인스턴스 변수의 복사본이 있습니다.
인스턴스 속성은 인스턴스 이름을 통해서만 액세스할 수 있습니다.
인스턴스 속성은 인스턴스 메소드 내에서 선언됩니다.
다음 스크립트는 하나의 클래스 속성 num_objects와 두 개의 인스턴스 속성 color 및 id를 사용하여 NewClass라는 새 클래스를 만듭니다. 이 클래스에는 생성자, 클래스 메서드 show_object_counts() 및 인스턴스 메서드 display_vars()도 포함되어 있습니다.
NewClass 클래스의 객체가 생성될 때마다 생성자는 인스턴스 속성인 color 및 id의 값을 초기화합니다. 생성자는 클래스 속성 num_objects의 값을 1씩 증가시킵니다. 인스턴스 메서드 display_vars()는 인스턴스 속성 color 및 id의 값을 표시합니다. show_object_counts() 클래스 메서드는 객체 counts 변수의 값을 표시합니다.
class NewClass:
num_object = 0 # class variable
def __init__(self, my_color, my_id): # constructor
self.color = my_color # class member variable
self.id = my_id # class member variable
NewClass.num_object += 1
def display_vars(self): # instance method
print(self.color)
print(self.id)
def show_object_counts(): # class method
print("Number of objects:", str(NewClass.num_object))
NewClass 클래스의 첫 번째 객체를 생성하면 다음 스크립트와 같이 num_objects 값이 1로 증가합니다.
nc1 = NewClass("Yellow", 10) # creating a class object
nc1.display_vars() # calling instance method
NewClass.show_object_counts() # calling class method
Output:
Yellow
10
Number of objects: 1
NewClass 클래스의 두 번째 객체를 생성하면 클래스 변수 num_objects의 값은 모든 객체 간에 공유되므로 이전 1에서 1이 더해져 2가 됩니다.
nc2 = NewClass("Black", 12) # creating a class object
nc2.display_vars() # calling instance method
NewClass.show_object_counts() # calling class method
Output:
Black
12
Number of objects: 2
'프로그래밍 언어 > 파이썬 (Python)' 카테고리의 다른 글
[파이썬 학습] 클래스 다형성 (0) | 2022.02.12 |
---|---|
[파이썬 학습] 클래스 상속 (0) | 2022.02.11 |
[파이썬 학습] 모듈 (0) | 2022.02.09 |
[파이썬 학습] 사용자 입력과 출력 및 파일 읽고 쓰기 (0) | 2022.02.08 |
[파이썬 학습] 반복자와 생성기 (0) | 2022.02.07 |