파이썬/기본

[파이썬] 객체지향과 클래스

caramel-bottle 2023. 9. 14.

객체지향 프로그래밍

객체지향 프로그래밍은 소프트웨어를 설계하고 구현하는 데 사용되는 중요한 프로그래밍 패러다임 중 하나이다. 이 패러다임은 프로그램을 "객체"라고 불리는 독립적인 개체로 나누고, 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 개발 방법론이다.


클래스

class 클래스이름:
    # 클래스 속성(멤버 변수) 정의
    속성1 = 초기값1
    속성2 = 초기값2

    # 생성자 메서드 (생략 가능)
    def __init__(self, 매개변수1, 매개변수2, ...):
        # 인스턴스 속성 초기화
        self.속성1 = 매개변수1
        self.속성2 = 매개변수2

    # 메서드(멤버 함수) 정의
    def 메서드1(self, 매개변수1, 매개변수2, ...):
        # 메서드 동작 정의
        pass

    def 메서드2(self, 매개변수1, 매개변수2, ...):
        # 메서드 동작 정의
        pass

객체 생성

클래스를 정의한 후 실제 데이터와 동작을 갖는 인스턴트를 생성하는 것을 객체 생성이라고 한다.

생성된 객체는 클래스의 속성과 메서드를 가진다.

하나의 클래스를 사용하여 여러 객체를 생성할 수 있다.

class Dog:
    pass
    
    
Rucy = Dog()
print(Rucy)
print(type(Rucy))
print(id(Rucy))

PPomi = Dog()
print(PPomi)
print(type(PPomi))
print(id(PPomi))

객체는 위와 같은 형식으로 생성한다. 생성된 객체를 바로 출력하면 객체에 대한 정보가 출력된다.

두 객체의 주소는 서로 다른 것을 볼 수 있다.


객체 속성 초기화

class Dog:
    name = ''
    age = 0
    family = ''

    def eat(self):
        print('사료를 먹습니다.')

Rucy = Dog()
Rucy.name = '루시'
Rucy.age = 14
Rucy.family = '포메'

PPomi = Dog()
PPomi.name = '뽀미'
PPomi.age = 8
PPomi.family = '폼피츠'

 

생성된 객체는 속성을 초기화하거나 변경할 수 있다. 다음과 같이 속성에 접근한다.


객체 메서드 호출

class Dog:
    name = ''
    age = 0
    family = ''

    def eat(self):
        print('사료를 먹습니다.')

Rucy.eat()
PPomi.eat()

클래스에 선언되어있는 메서드를 객체로 접근하는 방법은 이러하다.

메서드는 기본값으로 self를 매개변수로 가진다.

 

* self

self 키워드는 현재 객체를 가리킨다. 객체 내부 속성, 현재 객체의 속성에 접근한다는 의미이다.

객체 내의 메서드에서 객체 내의 다른 메서드, 다른 속성에 접근할 때에도 사용된다.


생성자

생성자는 클래스의 인스턴스가 생성될 때 자동으로 호출되는 메서드이다. 객체가 생성될 때 필요한 속성을 초기화하거나 설정하는 데에 사용된다. __init__ 을 사용한다.

 

class 클래스이름:
    def __init__(self, 매개변수1, 매개변수2):
        self.속성1 = 매개변수1
        self.속성2 = 매개변수2

__init__()

class Dog:
    def __init__(self):
        print(self, 'init 호출')

Rucy = Dog()
PPomi = Dog()

Rucy = Dog()
Rucy = Dog()

__init__ (생성자)특수 메서드는 객체가 생성됨과 동시에 실행된다. 출력 결과를 보면 객체가 생성됨에 따라 객체 정보와 문자열을 출력한다.

객체 정보의 출력결과를 보면 생성한 객체를 같은 이름의 변수에 할당해도 서로 다른 객체임을 알 수 있다.

객체는 생성됨과 동시에 메모리 주소에 자리하게 된다는 의미이다.


생성자 매개변수가 없는 경우

class Dog:
    def __init__(self):
        self.name = ''
        self.age = 0

Rucy = Dog()
print(Rucy)
print(Rucy.name)
print(Rucy.age)

PPomi = Dog()
print(PPomi)
print(PPomi.name)
print(PPomi.age)

__init__() 생성자는 객체를 생성할 때 호출된다. 생성자 매개변수를 정의하지 않는다면 객체를 생성할 때 인자를 필요로 하지 않는다.

 

위 코드는 빈 값을 넣어 name과 age 필드를 초기화하고 후에 .연산자를 통해 변수에 접근하여 출력한다.


생성자 매개변수 기본값이 있는 경우

class Dog:
    def __init__(self, name, age, nickname='닉네임없음'):
        self.name = name
        self.age = age
        self.nickname = nickname

Rucy = Dog('루시', 14)
print(Rucy.name)
print(Rucy.age)
print(Rucy.nickname)

PPomi = Dog('뽀미', 8)
print(PPomi.name)
print(PPomi.age)
print(Rucy.nickname)

객체 생성과 동시에 생성자가 호출되어 필드를 초기화한다. 이때 생성자가 매개변수를 필요로 하기 때문에 객체 생성시 인자를 넣어주어야 한다. 매개변수 nickname의 경우 기본값을 정의해주었기 때문에 인자로 넣지 않아도 된다.


메서드

메서드는 함수와 비슷한 개념이지만, 클래스 내부에 정의되어 특정 객체에 연결된 함수이다. 메서드는 해당 클래스의 모든 객체에서 공유되며, 객체의 동작을 정의하거나 특정 작업을 수행하는 데 사용된다.

메서드

class Counter:
    def __init__(self):
        self.num = 0

    def increment(self):
        self.num += 1

    def decrement(self):
        self.num -= 1

    def current_value(self):
        return self.num

    def reset(self):
        self.num = 0

MKbank = Counter() # 객체 생성, self.num = 0
print(MKbank.num)

MKbank.increment() # 메서드 호출
print(MKbank.num)

MKbank.decrement() # 메서드 호출
print(MKbank.num)

print(MKbank.current_value()) # 반환값이 있는 메서드 호출

MKbank.increment()
MKbank.increment()
MKbank.increment()
MKbank.increment()
MKbank.increment()
print(f'현재 대기인원: {MKbank.current_value()}')

Habank = Counter()
print(f'현재 대기인원: {Habank.current_value()}')

Habank.increment()
Habank.increment()
Habank.increment()
print(f'현재 대기인원: {Habank.current_value()}')

Habank.reset()
print(f'현재 대기인원: {Habank.current_value()}')

위 예시처럼 객체를 생성한 후 객체로 클래스 메서드에 접근하여 호출할 수 있고, 메서드로부터 값을 반환받을 수 있다.

전에도 언급했듯 메서드 내에서 self 키워드를 통해 클래스 내의 다른 메소드에 접근할 수도 있다.

 

* 메서드 VS 함수

메서드와 함수의 가장 큰 차이점은 객체에 속하여 객체와 관련된 동작을 수행하는지, 클래스와 객체에 관련없이 독립적으로 사용하는지이다.

메서드는 클래스 내에 정의되고 생성된 객체를 통해 호출되어 동작한다.

또한 객체의 상태를 조작하는 데 사용된다.

 

함수는 클래스와 관계없이 선언되어 독립적으로 사용할 수 있고,

일반적인 유틸리티 또는 작업을 수행하기 위해 사용된다.

여러 곳에서 재사용될 수 있다.


메서드 타입

인스턴스 메서드(Instance Method)

대부분의 클래스 메서드가 인스턴스 메서드이다. 객체의 상태를 조작하거나, 특정 작업을 수행한다.

 

클래스 메서드(Class Method)

클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드이다.

@classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 cls를 사용한다.

 

정적 메서드(Static Method)

특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스나 인스턴스와 독립적으로 호출될 수 있다.
@staticmethod 데코레이터를 사용하여 정의한다.


 

'파이썬 > 기본' 카테고리의 다른 글

[파이썬] glob  (0) 2023.10.09
[파이썬] OS모듈  (0) 2023.09.15
[파이썬] 재귀 호출  (0) 2023.09.14
[파이썬] 콜백함수 & 람다함수  (0) 2023.09.14
[파이썬] 변수의 범위  (0) 2023.09.12

댓글