오늘은 프로그래밍의 대해 공부를 해봤습니다.
목차
1. 객체지향 프로그래밍
2. 함수형 프로그래밍
이렇게 2가지 입니다.
1. 객체지향프로그래밍
1.1 객체지향 프로그래밍 (Object-Oriented Programming, OOP) 이란
객체지향프로그래밍(Object-Oriented Programming, OOP)은 프로그램 설계 방법론의 일종이며 명령형 프로그래밍에 속합니다.
프로그램을 단순히 데이터와 처리 방법으로 나눈 것이 아니라 프로그램을 수많은 객체로 나누어 이들을 상호 작용으로 서술하는 방식입니다.
예를 들어 자동차, 건물, 사람 등 우리 주변에 있는 무언가를 객체로 보는 것이고 이 객체가 가지고 있는 속성과 동작을 코드로 표현하는 겁니다.
1.2 객체(Object)란
객체는 객체지향프로그래밍의 가장 기본적인 단위이며 시작점 입니다. 모든 현상과 발생하는 사건은 객체간의 상호작용을 통해 발생합니다. 즉 객체는 모든 실재하는 대상이라고 정리를 할 수 있습니다.
객체지향프로그래밍에서는 객체를 추상화 시켜 속성과 기능으로 분류한 후에 이것을 다시 변수와 함수로 정의를 합니다.
1.3 클래스(Class)란
클래스는 간단하게 말하면 객체를 만들기 위한 설계도 입니다. 그리고 클래스는 집단에 속하는 속성과 행위를 변수와 메서드에 정의를 한 것입니다.
class Car: # 클래스(설계도)
def __init__(self, color, speed):
self.color = color # 속성
self.speed = speed # 속성
def drive(self): # 메서드(동작)
print(f"{self.color} 자동차가 {self.speed}km/h로 달립니다.")
# 객체(실체) 생성
my_car = Car("핑크색", 100)
my_car.drive()
# 출력: 핑크색 자동차가 100km/h로 달립니다.
1.4 추상화(Abstration)란
추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것입니다. 불필요한 부분은 숨기고, 꼭 필요한 부분만 보여줍니다.
추상 클래스나 인터페이스를 사용합니다. 합축 하면 공통의 속성이나 기능을 묶어 이름을 붙이는 것입니다.
1.5 캡슐화(Encapsulation)란
캡슐화는 속성과 기능을 하나로 묶고 객체 외부에서 직접 접근하지 못하게 보호를 합니다. private 키워드를 사용합니다.
캡슐화를 하는 목적은 2가지가 있습니다.
1. 코드를 재수정 없이 재활용하는 것
2. 접근 제어자를 통한 정보 은닉
이렇게 두가지가 있습니다.
class Animal:
def __init__(self, name):
self._name = name # _로 시작: 내부에서만 사용(캡슐화)
def speak(self): # 추상화: 이름만 정의
pass
class Dog(Animal):
def speak(self): # 추상화된 메서드를 실제로 구현(구체화)
print(f"{self._name}가 멍멍 짖어요.")
dog = Dog("깜순이")
dog.speak()
# 출력: 깜순이가 멍멍 짖어요.
1.6 상속(Inheritance)이란
상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 하는 것입니다.
다중상속은 불가능합니다. 왜냐하면 클래스의 상속 관계에서 혼란을 불러올 수 있기 때문입니다.
1.7 다형성(Polymorphism)이란
다형성은 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석이 될 수 있는 것입니다.
즉 오버라이딩, 오버로딩이 가능하다는 것입니다.
여기서 오버라이딩이란 부모클래스의 메서드와 같은 이름, 매개변수를 재정의하는 것이고
오버로딩은 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것입니다.
class Animal:
def speak(self):
print("동물이 소리를 냅니다.")
class Cat(Animal): # Animal을 상속
def speak(self): # 메서드 오버라이딩(다형성)
print("야옹~")
class Dog(Animal):
def speak(self):
print("멍멍!")
animals = [Cat(), Dog()]
for animal in animals:
animal.speak() # 각각 다르게 동작
# 출력:
# 야옹~
# 멍멍!
1.8 왜 사용할까?
객체지향프로그래밍을 사용하는 이유는 크게 3가지가 있습니다.
1. 유지보수가 쉽다.
2. 코드 재사용성이 높다.
3. 확장성이 좋다.
이렇게 3가지가 있습니다.
2. 함수형프로그래밍
2.1 함수형프로그래밍(Functional Programming)이란
함수형프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나입니다. 함수의 응용을 강조합니다.
2.2 불변데이터(Immutable Date)란
불변데이터는 선언후 초기화를 제외하고 값을 대입하는 경우가 없는 것이고 한번 정해진 값은 변하지 않습니다.
즉 기존의 값을 바꾸지 않고 새로운 값을 만들어서 반환을 합니다.
a = (1, 2, 3) # 튜플은 불변
# a[0] = 10 # 오류 발생: 튜플은 수정 불가
b = [1, 2, 3] # 리스트는 가변
b[0] = 10
print(b) # [10, 2, 3]
2.3 참조의 투명성(referencial transparency)이란
프로그램의 다른 변경 없이 특정한 표현식을 값으로 대체를 할 수 있는 것입니다.
참조 상 투명한 함수는 표현식 평가를 하게 되면동일한 인자에 대해 동일한 값을 반환해야 합니다.
이러한 함수를 순수 함수라고 합니다.
def add(x, y):
return x + y
# 아래 두 표현은 완전히 동일함 (참조의 투명성)
result1 = add(2, 3) # 항상 5 반환
result2 = add(2, 3) # 항상 5 반환
# add(2, 3)를 언제 어디서든 5로 대체해도 결과가 변하지 않음
total = add(2, 3) + add(2, 3)
# 위 코드는 아래와 완전히 같다
total = 5 + 5
2.4 순수함수(pure function)란
순수함수란 같은 입력에 항상 같은 결과를 반환하고, 함수 내부에서 외부 상태를 변경하지 않는 함수입니다.
즉 함수의 실행이 프로그램의 다른 부분에 영향을 주지 않습니다.
def add(x, y):
return x + y
print(add(2, 3)) # 항상 5 (입력값이 같으면 결과도 같음)
2.5 고차함수(Higher-order Function)란
고차함수란 함수를 인자로 받거나 함수를 반환하는 함수를 말합니다. 즉 함수를 다루는 함수입니다.
이것은 함수를 데이터처럼 다룰 수가 있습니다.
def square(x):
return x * x
numbers = [1, 2, 3, 4]
squared = list(map(square, numbers)) # map은 함수를 인자로 받는 고차 함수
print(squared) # [1, 4, 9, 16]
2.6 함수조합(Composition)이란
함수조합은 여러 개의 작은 함수를 조합해서 더 복잡한 기능을 만드는 것입니다.
또 여러 함수를 연결해서 한번에 사용이 가능합니다.
def double(x):
return x * 2
def increment(x):
return x + 1
def compose(f, g):
return lambda x: f(g(x))
new_func = compose(double, increment)
print(new_func(3)) # (3 + 1) * 2 = 8
2.7 재귀함수(Recursion)란
재귀함수는 동일한 함수를 호출하여 함수 내 로직을 반복하는 형태입니다. 이 기능을 사용하면 for, while기능을 대체할 수 있습니다. 함수형프로그래밍에서는 이러한 반복문 또한 재귀 함수로 정의하여 재사용성을 높일 수가 있습니다.
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
2.8 왜 사용할까?
함수형프로그래밍을 사용하는 이유는 크게 3가지가 있습니다.
1. 버그가 줄어듭니다.
2. 코드가 간결하며 읽기 쉽습니다.
3. 병령처리에 유리합니다.
이렇게 3가지가 존재합니다.