프로그래밍 방법론은 프로그램을 개발하는 다양한 접근 방식이나 철학을 뜻합니다. 프로젝트 규모, 요구 사항, 개발 팀의 특성에 따라 적합한 방법론이 달라지기 때문에 각 방법론의 특징과 장단점을 이해하는 게 중요합니다.
1. 절차적 프로그래밍(Procedural Programming)
절차(Procedure)를 중시하는 방식으로, 작업을 순서대로 실행하도록 프로그램을 구성합니다. 코드가 명령문으로 이루어져 있고, 작업 순서가 중요합니다. 변수와 함수가 함께 사용되며, 함수를 통해 프로그램의 기능을 분리하고, 코드 중복을 줄입니다.
2. 객체지향 프로그래밍 (Object-Oriented Programming, OOP)
객체(Object)라는 개념을 사용해 프로그램을 구성합니다. 객체는 데이터(속성)와 함수(메서드)를 하나의 단위로 묶은 것을 말합니다. 클래스라는 틀을 이용해 객체를 정의하고, 이를 통해 여러 개의 객체를 생성할 수 있습니다. 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism) 등의 특징을 활용해 코드를 재사용하고 확장할 수 있습니다.
3. 함수형 프로그래밍 (Functional Programming)
함수를 중심으로 프로그램을 구성합니다. 수학적인 함수 개념에 기초하고 있으며 코드가 간결하고 직관적입니다. 예를 들어 map, filter, reduce 등의 함수나 재귀를 주로 사용하여 데이터 처리를 간결하게 수행합니다.
파이썬에서 클래스를 정의하려면 class 키워드를 사용합니다. 클래스 이름은 관례적으로 대문자로 시작하는 것이 좋습니다. 클래스 내부에는 속성(멤버 변수)과 메서드(멤버 함수)를 정의할 수 있습니다.
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
객체(Object): 객체는 현실 세계에서의 실제 개체나 추상적인 개념을 모델링한 것입니다. 예를 들어, 자동차, 사람, 은행 계좌 등이 객체가 될 수 있습니다. 객체는 데이터(속성, 상태)와 메서드(동작, 함수)로 구성됩니다. 클래스에서 만들어진 실제 존재하는 데이터(프로그램 내에서 사용된 것)
클래스(Class): 클래스는 객체를 만들기 위한 템플릿 또는 설계도입니다. 클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용됩니다. 예를 들어, "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(색상, 속도)과 메서드(주행, 멈춤)를 정의할 수 있습니다.
인스턴스(Instance): 클래스를 기반으로 실제로 생성된 객체를 인스턴스라고 합니다. 클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가집니다. 객체가 어떤 클래스에서 나왔는지에 초점을 맞출 때 사용하는 용어
속성(Attributes) 또는 멤버 변수(Fields): 객체는 데이터를 저장하기 위한 속성을 가집니다. 이러한 속성은 객체의 상태나 특성을 나타내며 변수로 표현됩니다. 예를 들어, 자동차 객체의 속성은 색상, 속도, 모델 등이 될 수 있습니다.
메서드(Methods) 또는 멤버 함수(Functions): 객체는 데이터를 조작하거나 특정 작업을 수행하기 위한 메서드를 포함합니다. 이러한 메서드는 함수와 비슷하게 동작하지만, 객체의 상태에 접근하고 조작할 수 있습니다. 자동차 객체의 메서드로는 주행, 정지, 경적 울리기 등이 있을 수 있습니다.
클래스를 정의한 후에는 이를 기반으로 객체(인스턴스)를 생성할 수 있습니다.
class Dog:
pass # 내용이 없는 블록을 만들 때 사용
Dog()
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 = '알수없음'
# 클래스 변수(속성)
# Dog.name, Dog.age, Dog.family는 클래스 변수에 접근
print(Dog.name)
print(Dog.age)
print(Dog.family)
# 인스턴스 변수 생성
rucy = Dog()
# 인스턴스에 같은 이름의 인스턴스 변수가 없으면 → 클래스 변수에서 값을 찾음
# 인스턴스 변수에 같은 이름이 생기면 → 인스턴스 변수가 우선적으로 사용됨
# 출력값은 클래스 변수의 값이 보이는 것
print(rucy.name)
print(rucy.age)
print(rucy.family)
# 클래스 변수의 값을 변경하는 것이 아니라
# 인스턴스 변수라는 "같은 이름의 새로운 변수"를 인스턴스에 추가하는 것
rucy.name = '루시'
rucy.age = 15
rucy.family = '포메'
print(rucy.name)
print(rucy.age)
print(rucy.family)
파이썬에서 생성자(Constructor)는 클래스의 인스턴스가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 생성자는 객체의 초기화를 담당하며, 객체가 생성될 때 필요한 속성을 초기화하고 설정하는 역할을 합니다. 파이썬에서 생성자 메서드는 __init__라고 이름이 정해져 있습니다. 속성은 self를 사용하여 접근하고 설정합니다. 이렇게 초기화된 속성은 객체가 생성될 때마다 다른 값을 가질 수 있습니다.
class 클래스이름:
def __init__(self, 매개변수1, 매개변수2):
self.속성1 = 매개변수1
self.속성2 = 매개변수2
class Dog:
def __init__(self):
print(self, 'init 호출!')
Rucy = Dog()
인스턴스 변수는 각 인스턴스(객체)마다 별도로 생성되는 변수로, 객체를 만들 때마다 self 키워드를 통해 생성자(__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)
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('루시', 15, '포메')
print(Rucy)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
PPomi = Dog('뽀미', 7, '폼피츠')
print(PPomi)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
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('루시', 15)
PPomi = Dog('뽀미', 7)
Rucy.print_info()
PPomi.print_info()
Dog.family = '폼피츠'
Rucy.print_info()
PPomi.print_info()
Rucy.family = '포메'
Rucy.print_info()
print(Rucy.family)
print(PPomi.family)
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())
print(KBBank.current_value())
인스턴스 메서드(Instance Method)
객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드입니다. 대부분의 클래스 메서드는 인스턴스 메서드입니다. __init__ 메서드도 인스턴스 메서드입니다.
클래스 메서드(Class Method)
클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 cls를 사용합니다.
정적 메서드(Static Method)
특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있습니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다.
class Calculator:
def add(self, x, y):
return x + y
@classmethod
def subtract(cls, x, y):
return x - y
@staticmethod
def multiply(x, y):
return x * y
# 인스턴스 생성
calc = Calculator()
# 인스턴스 메서드 호출
result1 = calc.add(5, 3)
print(result1) # 출력: 8
# 클래스 메서드 호출
result2 = Calculator.subtract(10, 4)
print(result2) # 출력: 6
# 정적 메서드 호출
result3 = Calculator.multiply(6, 2)
print(result3) # 출력: 12
파이썬 스페셜(매직) 메소드 (0) | 2023.09.11 |
---|---|
파이썬 상속 (2) | 2023.09.11 |
콜백함수와 람다함수 (0) | 2023.09.07 |
변수의 범위 (1) | 2023.09.07 |
사용자 정의 함수 (2) | 2023.09.07 |