OOP vs. AOP vs. FP

break 없는 while loop·2025년 1월 2일
post-thumbnail

1. OOP (Object-Oriented Programming) - 객체지향 프로그래밍

개념

  • 객체(Object)를 중심으로 설계하고 구현하는 프로그래밍 패러다임
  • 데이터와 데이터를 처리하는 메서드를 객체로 캡슐화
  • 상속, 다형성, 캡슐화, 추상화 등의 특징을 가짐

특징

  1. 캡슐화 (Encapsulation):
  • 데이터를 외부로부터 숨기고 메서드를 통해 접근
  • 객체의 내부 상태를 보호
  • 예시: public, private 같은 접근 제한자
  1. 상속 (Inheritance):
  • 기존 클래스를 기반으로 새로운 클래스를 생성
  • 코드 재사용과 계층적 관계 표현
  • implements, extends 등을 활용한 상속
  1. 다형성 (Polymorphism):
  • 같은 이름의 메서드가 다양한 방식으로 동작
  • 예: 메서드 오버로딩, 오버라이딩
  1. 추상화 (Abstraction):
  • 복잡한 로직을 감추고 필요한 인터페이스만 제공
  • interface, abstract class

장점

  • 코드 재사용성 증가
  • 유지보수 용이성
  • 대규모 프로젝트에서 구조화된 설계 가능

단점

  • 설계 단계에서 시간 소모
  • 작은 프로젝트에서는 오히려 복잡성이 증가할 수 있음

예제 (Python)

class Animal:
	def speak(self):
    	pass

class Dog(Animal):
	def speak(self):
    	return "Bark"
        
class Cat(Animal):
	def speak(self):
    	return "Meow"
        
animals = [Dog(), Cat()]
for animal in animals:
	print(animal.speak()) # 다형성 예제

2. AOP (Aspect-Oriented Programming) - 관점지향 프로그래밍

개념

  • 코드의 관심사(Concern)를 분리하여 모듈화하는 프로그래밍 패러다임
  • 주로 로깅, 인증, 트랜잭션 관리 등 핵심 로직과는 별개의 공통적인 기능을 애스펙트(Aspect)로 분리

특징
1. Cross-Cutting Concerns (횡단 관심사):

  • 여러 모듈에 걸쳐 반복되는 코드(예: 로깅, 보안)를 독립적으로 관리
  1. Advice:
  • 특정 시점에 실행되는 코드(예: 메서드 호출 전후, 예외 발생 시)
  1. Join Point:
  • Advice가 적용되는 지점(예: 메서드 실행, 필드 접근)
  1. Pointcut:
  • Advice가 실행될 Join Point를 정의하는 표현식

장점

  • 코드 중복 감소
  • 핵심 비즈니스 로직과 부가적인 로직 분리
  • 유지보수성 향상

단점

  • 학습 곡선 존재
  • 디버깅이 어려울 수 있음

예제 (Spring AOP)

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethodExecution(JoinPoint joinPoint) {
        System.out.println("Method executed: " + joinPoint.getSignature());
    }
}
  • @Before: 메서드 실행 전에 로깅 실행
  • Pointcut: 특정 패키지(com.example.service.*)의 메서드에 적용

3. FP (Functional Programming) - 함수형 프로그래밍

개념

  • 데이터를 변경하지 않고 순수 함수(Pure Function)를 조합하여 문제를 해결하는 프로그래밍 패러다임
  • 함수가 일급 객체(First-Class Citizen)로 취급

    일급 객체란 프로그래밍 언어에서 다른 값처럼 자유롭게 다룰 수 있는 객체를 말합니다.
    즉, 변수에 할당하거나 함수의 인자로 전달하거나, 함수의 반환값으로 사용할 수 있는 객체를 의미합니다.
    일급 객체는 주로 함수형 프로그래밍에서 중요하게 다뤄집니다.

특징
1. 순수 함수 (Pure Function):

  • 동일한 입력에 대해 항상 동일한 출력
  • 부작용(Side Effect)이 없음
  1. 불변성 (Immutability):
  • 데이터는 변경되지 않고 복사본을 생성하여 처리
  1. 고차 함수 (Higher-Order Function):
  • 함수를 인자로 받거나 함수를 반환하는 함수
  1. 지연 평가 (Lazy Evaluation):
  • 필요한 시점에 계산 수행

장점

  • 병렬 처리에 유리
  • 코드 테스트 및 디버깅 용이
  • 상태 변화를 줄여 예측 가능한 코드 작성

단점

  • 초기 학습 난이도
  • 명령형 프로그래밍에 익숙한 개발자에게는 낯설 수 있음

예제 (JavaScript)

const numbers = [1, 2, 3, 4, 5];

// 순수 함수
const double = x => x * 2;

// 고차 함수
const doubledNumbers = numbers.map(double);

console.log(doubledNumbers); // [2, 4, 6, 8, 10]
특징OOPAOPFP
중심 개념객체와 클래스관심사(Concern) 분리순수 함수와 함수 조합
적용 대상상태와 행위를 캡슐화로깅, 인증 등 횡단 관심사 처리데이터 불변성 및 함수 조합
핵심 도구클래스, 객체, 상속, 캡슐화Aspect, Advice, Pointcut순수 함수, 고차 함수, 불변 데이터
주요 특징캡슐화, 상속, 다형성비즈니스 로직과 부가 로직 분리함수 조합, 지연 평가, 불변성 유지
장점코드 재사용성, 유지보수성코드 중복 감소, 관심사 분리병렬 처리 용이, 상태 변화 최소화
단점설계 복잡성, 작은 프로젝트에 과도할 수 있음학습 곡선, 디버깅 어려움초기 학습 난이도, 명령형 사고와의 차이
사용 사례게임 개발, GUI 응용 프로그램트랜잭션 관리, 로깅, 인증데이터 처리, AI, 병렬 작업
profile
프로그래밍 지식 아카이브용

0개의 댓글