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 |