반응형

객체지향 프로그래밍(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 클래스를 사용하여 다른 개체 nc1nc2를 정의하고 해당 클래스의 멤버 메서드 및 멤버 특성에 액세스합니다. 여기서, nc1nc2 colorid속성 값은 동일합니다. 일반적으로 동일한 클래스의 다른 객체에 대한 인스턴스 멤버의 값은 다릅니다.

 

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(selfmy_colormy_id):

    self.color = my_color

    self.id = my_id

    print("Hello this is a method inside a class")

 

nc1nc2객체를 만들고 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__(selfmy_colormy_id):

    self.color = my_color

    self.id = my_id

 

  def display_vars(self):

    print(self.color)

    print(self.id)

 

사용자 정의 생성자가 있는 클래스의 개체를 만들 때 클래스 이름 뒤에 오는 괄호를 사용하여 생성자 매개변수의 값을 전달해야 합니다.

다음 스크립트는 NewClass 클래스에 대한 객체 nc1을 생성합니다. 생성자에 전달되는 값은 Yellow10입니다. 이 값은 각각 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__(selfmy_colormy_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

반응형

+ Recent posts