1. 절차지향 프로그래밍
절차지향프로그래밍은 프로그램을 작성할 때 일련의 절차 또는 단계에 따라 코드를 구성하는 방식입니다. 이러한 단계나 절차들은 주로 함수나 서브루틴으로 나누어져 있으며, 각각의 함수는 특정한 작업을 수행합니다. 주로 '입력 - 처리 - 출력'의 순차적인 절차를 따르며, 코드를 위에서부터 아래로 실행하면서 데이터를 처리하는 방식으로 동작합니다. C 언어와 같은 프로그래밍 언어는 주로 절차지향적인 스타일을 따릅니다.
2. 함수형 프로그래밍
함수형프로그래밍은 함수(function)를 기반으로 하여 프로그램을 작성하는 패러다임입니다. 함수를 연결하여 프로그래밍을 하여 함수 체이닝(Method Chaining)이라고 합니다. 함수는 다른 함수에 전달되거나 반환될 수 있으며, 함수들 간의 조합을 통해 복잡한 작업을 수행합니다. 상태를 변경하지 않고 데이터를 처리하고, 부작용(side effect)을 최소화하려는 노력이 있습니다. 함수형 언어로는 Haskell, Lisp, Clojure 등이 있으며, 몇몇 다른 언어들도 함수형 프로그래밍을 지원합니다. 함수형 프로그래밍은 병렬처리와 상태 관리에 용이하며, 함수들을 조합하여 간결하고 안정적인 코드를 작성하는데 도움이 됩니다.
3. 객체지향 프로그래밍
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어를 설계하고 구현하는 데 사용되는 중요한 프로그래밍 패러다임 중 하나입니다. 즉, 여러 프로그램 방법론 중 하나입니다. 이 패러다임은 프로그램을 "객체"라고 불리는 독립적인 개체로 나누고, 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 개발 방법론입니다. 절차지향적 프로그래밍은 서로 유기적으로 뭉쳐있어 여러명이 작업하거나 코드가 많아지면 어렵다는 단점이 있습니다. 이럴때 객체지향 프로그래밍이 적합합니다. 객체지향 프로그래밍은 설계를 해놓고 부분부분으로 객체를 만들기에 다 개별로 구성되어 있어 유지보수가 쉽습니다.
- 클래스(Class)
클래스는 객체를 만들기 위한 템플릿 또는 설계도입니다. 클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용됩니다. 예를 들어, "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(색상, 속도)과 메서드(주행, 멈춤)를 정의할 수 있습니다.- 객체(Object)
객체는 현실 세계에서의 실제 개체나 추상적인 개념을 모델링한 것입니다. 예를 들어, 자동차, 사람, 은행 계좌 등이 객체가 될 수 있습니다. 객체는 데이터(속성, 상태, 변수)와 메서드(동작, 함수)로 구성됩니다.- 인스턴스(Instance)
클래스를 기반으로 실제로 생성된 객체를 인스턴스라고 합니다. 클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가집니다.객체와 인스턴스는 혼용되기 쉬운 단어이지만 인스턴스는 객체의 실체화임을 기억하면 헷갈리지 않습니다.
3.1. 클래스 만들기
파이썬에서 클래스를 정의하려면 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
3.2. 객체(인스턴스) 생성하는 방법
클래스를 정의한 후에는 이를 기반으로 객체(인스턴스)를 생성할 수 있습니다. 이때, 클래스의 생성자 init 메서드를 사용하여 객체를 초기화합니다.
3.3.객체 속성 초기화
객체를 생성한 후에는 객체의 속성을 초기화할 수 있습니다. 이를 위해 . 연산자를 사용하여 객체의 속성에 접근하고 값을 할당합니다.
3.4. 객체 메서드 호출
객체의 메서드를 호출하려면 객체와 메서드를 . 연산자를 사용하여 호출합니다.
3.5. 생성자
파이썬에서 생성자(Constructor)는 클래스의 인스턴스가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 생성자는 객체의 초기화를 담당하며, 객체가 생성될 때 필요한 속성을 초기화하고 설정하는 역할을 합니다. 파이썬에서 생성자 메서드는 __init__ 라고 이름이 정해져 있습니다. class를 만들때 자동으로 만들어지는데 지정해주지 않으면 알아서 빈 생성자를 만들어집니다. class에 생성자를 설정해주면 객체를 만들때 생성자를 읽어 필요한 속성을 초기화 하고 만들어 줍니다. 생성자 또한 메서드이기 때문에 self를 꼭 넣어야하고 매개변수는 생략가능합니다. 생성자에 매개변수를 넣으면 객체를 만들때 class(매개변수)로 만들어야 합니다.
class 클래스이름: def __init__(self, 매개변수1, 매개변수2): self.속성1 = 매개변수1 self.속성2 = 매개변수2
예를 들어, 게임목숨처럼 초반 목숨수, 점수 등 기본값이 존재하는 경우 세팅해야 합니다. 객체가 로드될때 초기화시키고싶은 값이 있다면 생성자를 활용하면 됩니다. 이전 Dog 클래스의 name='', age=0과 같은 변수들은 생성자로 __init__ 안에 넣어놓으면 됩니다.
- 생성자 메서드의 정의 : 생성자 메서드는 클래스 내부에 def init(self, 매개변수1, 매개변수2, ...):와 같이 정의됩니다. init 메서드의 첫 번째 매개변수로 self를 사용합니다. self는 생성된 인스턴스 자신을 가리키며, 인스턴스의 속성을 초기화하는 데 사용됩니다. 나머지 매개변수는 인스턴스를 초기화하는 데 필요한 데이터를 전달받습니다.
- 인스턴스의 생성 : 생성자를 호출하여 클래스의 인스턴스를 생성합니다. 생성자 메서드는 클래스의 이름을 호출하여 객체를 생성합니다.
3.6. 메서드
3.6.1. 메서드 정의
메서드(Method)는 객체지향 프로그래밍(OOP)에서 사용되는 함수와 비슷한 개념이지만, 클래스 내부에 정의되어 특정 객체에 연결된 함수입니다. 메서드는 해당 클래스의 모든 객체에서 공유되며, 객체의 동작을 정의하거나 특정 작업을 수행하는 데 사용됩니다.
3.6.2. 메서드 타입
- 인스턴스 메서드(Instance Method): 흔히 사용하는 메서드로객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드입니다. 대부분의 클래스 메서드는 인스턴스 메서드입니다. 위의 예제에서 보여진 init 메서드도 인스턴스 메서드입니다.
- 클래스 메서드(Class Method): 클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 self가 아닌 cls를 사용합니다. 애초에 프로그래밍을 시작할때 메모리에 이미 올라가있는 메서드로 별도의 설정없이 언제든지 사용가능합니다. 클래스명.메서드()로 사용합니다. 클래스와 연관성이 있고 클래스의 속성들을 활용하는 메서드입니다. 인스턴스 메서드와 달리 객체를 생성하지 않아도 내부의 변수(속성,필드)사용 가능합니다.
- 정적 메서드(Static Method): 특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있습니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다. 클래스 내부에 설계는 되어있지만 클래스 메서드와 달리 클래스의 속성과 관련이 없이 따로 노는 메서드입니다.
4. 클로저(Closure)
클로저(Closure)는 프로그래밍 언어에서 중요한 개념 중 하나로, 함수와 그 함수가 참조하는 외부 변수(또는 자유 변수) 사이의 관계를 나타냅니다. 즉, 클로저는 함수 내부에 중첩된 함수로, 내부 함수가 외부 함수의 변수에 접근할 수 있는 함수입니다. 이것은 함수 내에서 데이터를 보호하고 숨기는 데 도움이 됩니다. 함수와 그 함수가 참조하는 상태(변수)를 함께 저장하고 유지할 수 있습니다. 작업한 함수를 return 시키는 개념입니다. 클로저는 절차지향적 프로그래밍에서의 일반 중첩함수나 객체지향 프로그래밍에서의 메서드보다 부하가 적다는 장점이 있습니다.
-> # mul(2)인 mul2 함수는 mul의 내부의 wrapper(n)값을 입력하는 것을 알 수 있습니다.
5. 데코레이터(Decorator)
데코레이터 (Decorator)는 파이썬에서 함수나 메서드의 동작을 수정하거나 확장하기 위한 강력한 도구입니다. 주로 코드 중복을 줄이고 재사용성과 가독성을 높이기 위해 사용됩니다. 데코레이터는 함수나 메서드를 래핑하거나 감싸서 추가 기능을 제공하고 @ 기호를 사용하여 함수나 메서드 위에 적용됩니다. 데코레이터는 클로저를 모르면 사용할 수 없기에 클로저 이해를 반드시 해야합니다.