본문 바로가기
파이썬/파이썬 기초 문법

객체지향과 클래스

by 쵠몽 2024. 10. 14.

1. 객체지향 프로그래밍

절차지향 프로그래밍 방식은 '입력-처리-출력'의 순차적인 절차를 따르며 코드를 위에서부터 아래로 실행하는 방식이다. 이는 데이터와 데이터를 처리하는 함수가 따로 존재하여 프로그램의 규모가 커지고 복잡해질 때 유지 보수가 힘들다. 하지만 객체지향 프로그래밍은 프로그램을 '객체'라는 기본 단위로 나누고 이러한 객체들 간의 상호 작용을 서술하는 방식으로써 코드의 확장 및 재사용성이 용이하다.

 

2. 클래스

객체를 만들 때 설계도와 같은 역할을 한다. 객체를 만들 때 사용하는 하나의 틀로써 이 안에 속성(멤버)을 변수, 동작을 메서드(멤버 함수)로 정의한다.

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

 

 

3. 객체 생성

class Dog:
    pass

Rucy = Dog()
print(Rucy)
print(type(Rucy))

PPomi = Dog()
print(PPomi)
print(type(PPomi))
class Dog:
    name = ''
    age = 0
    family = ''

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

Rucy = Dog()
Rucy.eat()

PPomi = Dog()
PPomi.eat()

 

 

4. 생성자

  • __init__ 생성자 메서드: 객체가 생성되면 자동으로 호출되는 메서드
class 클래스이름:
    def __init__(self, 매개변수1, 매개변수2):
        self.속성1 = 매개변수1
        self.속성2 = 매개변수2
class Dog:
    # 클래스 변수
    def __init__(self):
        # 인스턴스 변수
        self.name = ''
        self.age = 0
        self.family = '포메'

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

PPomi = Dog()
print(PPomi)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
class Dog:
    def __init__(self, name, age, family='족보없음'):
        self.name = name
        self.age = age
        self.family = family

# Rucy = Dog() -> TypeError: Dog.__init__() missing 2 required positional arguments: 'name' and 'age'

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

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

Choco = Dog('초코', '15')
print(Choco)
print(Choco.name)
print(Choco.age)
print(Choco.family)

 

 

5. 메서드

클래스 내부에 정의되어 특정 객체에 연결된 함수이다. 해당 클래스의 모든 객체에서 공유된다.

class Counter:
    def __init__(self):
        self.num = 0
    def increment(self):
        self.num += 1
    def current_value(self):
        return self.num
    def decrement(self):
        self.num -= 1
    def reset(self):
        self.num = 0
KBBank = Counter()
print(KBBank.num)
print(KBBank.current_value())

KBBank.increment()
KBBank.increment()
KBBank.increment()
print(KBBank.current_value())

KBBank.decrement()
print(KBBank.current_value())

KBBank.reset()
print(KBBank.current_value())
HanaBank = Counter()
print(HanaBank.current_value())

HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
print(HanaBank.current_value())
class Math:
    def add(self, x, y):
        return x + y
    def sub(self, x, y):
        return x - y
    def mul(self, x, y):
        return x * y
    def div(self, x, y):
        return x / y
        
math = Math()
result = math.add(10, 3)
print(result)
result = math.sub(10, 3)
print(result)
result = math.mul(10, 3)
print(result)
result = math.div(10, 3)
print(result)

 

 

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

class Dog:
    family = "포메" # 클래스 변수

    def __init__(self, name, age):
        # 인스턴스 변수
        self.name = name
        self.age = age

    def print_info(self):
        print(f'종: {Dog.family}')  # 클래스 변수
        print(f'이름: {self.name}') # 인스턴스 변수
        print(f'나이: {self.age}')  # 인스턴스 변수

Rucy = Dog('루시', 14)
PPomi = Dog('뽀미', 7)

Rucy.print_info()
PPomi.print_info()
PPomi.family = '폼피츠'   # 클래스 변수 family에 접근한 게 아닌 새로운 family 속성이 생기는 것
PPomi.print_info()        # 종: 폼피츠 가 아닌 여전히 포메

print(PPomi.family)
print(Rucy.family)

 

 

7. 메서드 타입

  • 인스턴스 메서드: 클래스의 인스턴스에서 호출되는 메서드로 객체의 상태를 조작하거나 특정 작업을 수행하는 메서드이다. __init__와 같은 대부분의 클래스 메서드가 여기에 속한다.
  • 클래스 메서드: 클래스 자체에서 호출되는 메서드로 클래스 레벨에서 동작된다. 모든 인스턴스가 공유하는 메서드로 cls를 첫 번째 매개변수로 가지며 @classmethod라는 데코레이터를 사용하여 정의한다.
  • 정적 메서드: 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 관련 없이 독립적으로 동작하고 호출될 수 있는 메서드이다. @staticmethod라는 데코레이터를 사용하여 정의한다.
# 인스턴스 메서드 예제
class Math:
    def add(self, x, y):
        return x + y
    def sub(self, x, y):
        return x - y
    def mul(self, x, y):
        return x * y
    def div(self, x, y):
        return x / y

math = Math()
result = math.add(10, 3)
print(result)
result = math.sub(10, 3)
print(result)
result = math.mul(10, 3)
print(result)
result = math.div(10, 3)
print(result)
# 클래스 메서드 예제
class Math:
    title = '클래스 메서드'
    @classmethod
    def add(cls, x, y):
        return x + y
    @classmethod
    def sub(cls, x, y):
        return x - y
    @classmethod
    def methodTest(cls, name):
        return cls.title + name
        
print(Math.add(10, 3))
print(Math.sub(10, 3))
print(Math.methodTest('김사과'))
# 정적 메서드 예제
class Math:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def add(self):
        return self.x + self.y
    @staticmethod
    def div(x, y):
        return x / y
        
math = Math(10, 3)
print(math.add())
print(math.div(10, 3)) # 사용하지 않음

print(Math.div(10, 3))

 

 

8. random 모듈

import random

random.random() # 0 <= x < 1 실수

random.random() * 10

int(random.random() * 10)

random.random() * 45 # 0 <= x < 45

int((random.random() * 45) + 1) # 1~45 정수

 

'파이썬 > 파이썬 기초 문법' 카테고리의 다른 글

파이썬 상속  (2) 2024.10.19
클로저와 데코레이터  (1) 2024.10.14
파이썬 콜백 함수와 람다 함수  (1) 2024.10.07
파이썬 변수의 범위  (2) 2024.09.30
파이썬 사용자 정의 함수와 None  (0) 2024.09.30