Object-Oriented Programming(OOP) and Functional Programming(FP)
Object-Oriented Programming(OOP)
객체 지향적 프로그래밍은 프로그래밍 패러다임 중 하나로써 프로그래밍 하고자 하는 무언가(때때로 실세계의 사물)를 표현하기 위해서 객체를 사용하는 프로그래밍 방법이다. 이 객체들은 자료구조가 될 수 있다. 그 객체는 속성으로서 그들에 관한 데이터를 가지고 있다. 이 객체의 속성은 메서드나 함수를 통해서 조작이 가능한데, 그 메서드 또한 객체로부터 얻어진다. 객체는 상태(속성)와 행동(기능, 메서드)을 가진다.
OOP의 중심은 캡슐화다. 클래스 안의 변수를 바깥에서 직접 접근하지 못하게 숨기고, 객체가 제공하는 메서드를 통해서만 상태를 바꾸게 한다. 그래서 의도하지 않은 사용을 막을 수 있고, 요구사항에 나오는 대상을 그대로 객체로 옮기기 쉽다 (Medium).
1
2
3
4
5
6
7
8
9
10
class Account {
private long balance; // 상태는 숨긴다
void deposit(long amount) { // 행동을 통해서만 상태를 바꾼다
if (amount <= 0) throw new IllegalArgumentException();
balance += amount;
}
long balance() { return balance; }
}
Functional Programming(FP)
함수적 프로그래밍은 상태의 변경과 가변 데이터를 피하기 위한 시도에서 시작된 프로그래밍의 한 형식이다. 함수적 프로그래밍에서 해당 함수에 대한 출력값은 정확히 같은 입력값에 대하여 항상 같아야 한다.
이것은 함수적 프로그래밍에서 함수의 출력이 순수하게 함수의 인자값에 의존하기 때문이다. 갑자기 뒤에서 마술같은 변경이 일어나서는 안 된다는 의미이다. 이것은 코드에 있어서 side effects를 제거해준다.
같은 입금 동작을 함수형으로 쓰면 기존 값을 바꾸지 않고 새 값을 반환한다. 이런 함수가 순수함수이고, 함수를 값처럼 넘기고 조합하는 고차함수가 FP의 기본 도구가 된다.
1
2
3
4
5
6
record Account(long balance) {
Account deposit(long amount) {
if (amount <= 0) throw new IllegalArgumentException();
return new Account(balance + amount); // 새 객체를 반환한다
}
}
무엇이 다른가
두 패러다임은 상태를 어디에 두느냐에서 갈린다. OOP는 상태를 객체 안에 두고 메서드로 보호한다. FP는 상태 변경 자체를 피하고, 데이터를 변환하는 함수를 이어 붙인다.
참고한 글은 어느 쪽이 낫다기보다 변경이 어느 방향으로 일어나는지에 따라 고르라고 정리한다. 연산의 집합이 고정되어 있고 주로 새로운 대상이 추가된다면, 기존 메서드를 구현하는 새 클래스를 더하는 OOP가 잘 맞는다. 반대로 대상의 집합이 고정되어 있고 주로 새로운 연산이 추가된다면, 기존 데이터 타입을 다루는 새 함수를 더하는 FP가 잘 맞는다.
| 관점 | OOP | FP |
|---|---|---|
| 상태 | 객체 안에 두고 캡슐화 | 가변 상태를 피하고 새 값을 만든다 |
| 기본 단위 | 상태와 행동을 가진 객체 | 입력을 출력으로 바꾸는 함수 |
| 확장이 쉬운 방향 | 새로운 대상(클래스) 추가 | 새로운 연산(함수) 추가 |
주의할 점
- 상속 단계가 깊어지면 객체를 유지보수하기 어려워진다. 하위 클래스가 상위 클래스의 내부에 의존하게 되면 캡슐화도 약해진다.
- FP에 익숙해지려면 현실의 대상을 데이터와 그 변환으로 바라보는 다른 사고방식이 필요하다. 불변 데이터를 고집하면 새 객체를 계속 만드는 비용도 생긴다.
- 실제 언어는 두 방식을 섞는다. Java도 클래스 기반 언어이면서 람다식과 스트림을 제공하므로, 경계는 상태를 보호하는 객체로, 내부 계산은 순수한 함수로 나누는 식의 조합이 흔하다.
참고한 자료외부 출처 2 · 블로그 글 2
외부 출처
- Functional Programming VS Object Oriented Programming (OOP) Which is better….?
- 조영호, 객체지향의 사실과 오해, 위키북스
이 블로그의 관련 글
댓글
아직 댓글이 없습니다