Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
Pragmatic TIL - 6 (연습 문제 풀이) (2022-03-28)
#pragmatic
2년 전
661

연습 문제 2

문제

객체 지향 언어와 함수형 언어의 직교성은 어떻게 다를까? 이런 차이가 언어 자체에 내재된 것일까 아니면 사람들이 언어를 사용하는 방법이 다른 것일까?

풀이

객체 지향 언어에서는 개발에 쓰이는 컴포넌트를 대폭 수정할 경우 컴포넌트에서 서로 연관되어 있는 연결점 때문에 몇 개의 모듈이 영향을 받을 수 있으며 개발자 역량에 따라 혹은 개발하는 프로그램의 스케일에 따라 수정하는 컴포넌트 단 하나의 모듈만 영향을 받을 수 있다.

함수형 언어에서는 수정할 때 처음부터 단 하나의 수정할 모듈만 영향을 받도록 설계를 해야 하기 때문에 언어적인 시스템을 이용하여 객체 지향 언어에 비해 에러가 더 적게 나거나 테스트가 더 용이한 점이 있다.

따라서 두 언어 간의 직교성 차이는 객체 지향에서도 직교성을 높이는 방안들이 충분히 있지만 급하거나 놓치는 부분이 있을 때 나중에 리팩터링을 하여 직교성을 높여야 한다면 함수형 언어에서는 언어 시스템을 이용하여 직교성을 높이는 여러 방안들을 체크 받음으로써 처음부터 직교성을 높게 만들 수 있다는 장점이 있다.

이러한 차이는 태초에는 언어 자체에 내재된 것이지만 결국 꾸준히 각 언어를 사용한 결과 사람들이 코드를 작성하는 방식을 익히고 익숙해지는 데 언어의 스타일을 따라가게 되는 것 같다.

문제의 답

먼저 한 가지 전제가 있다. 여러분은 어떤 언어로든 직교적이고 좋은 코드를 쓸 수 있다. 하지만 동시에 언어들은 제각기 결합도를 높이고 직교성을 떨어트리는 기능으로 여러분을 유혹하기도 한다.

객체 지향 언어에는 불투명한 결합을 만들 가능성을 잔뜩 높이는 기능이 많다. 다중 상속이나 예외, 연산자 오버로딩, 상속을 이용한 부모 메서드 오버 라이딩 같은 것들 말이다. 클래스가 코드와 데이터를 묶기 때문에 생기는 결합도 있다. 이런 결합은 보통 좋은 것이지만(이렇게 좋은 결합을 응집성이라고 부른다), 클래스가 관심사에 잘 집중하지 않으면 인터페이스가 엉망으로 망가질 수 있다.

함수형 언어는 여러분이 작고 독립된 함수를 많이 만든 다음, 이를 여러 가지로 조합하여 문제를 해결하도록 유도한다. 이론적으로는 좋아보이고 실제로도 그런 경우가 많다. 하지만 여기서도 모종의 결합이 생길 수 있다. 이런 함수는 일반적으로 데이터를 변환하는데, 한 함수의 결과가 다른 함수의 입력이 되는 식이다. 이때 주의하지 않으면 함수가 생성하는 데이터 포맷을 바꾸는 바람에 그 이후로 이어지는 변환 어딘가를 망가트릴 수 있다. 좋은 타입 체계를 갖춘 언어를 사용하면 이런 문제를 어느 정도 예방할 수 있다.

책의 답을 읽고 느낀 점

나의 답에서는 객체 지향의 단점을 부각하고 함수형 언어의 장점 만을 부각 하였는데 두 언어 모두 장단점이 존재하기에 책의 글쓴이는 언어의 차이점이 있지만 종국에는 사람이 코드를 어떻게 작성하느냐에 따라 직교성을 효율을 결정할 수 있다고 생각한 것 같다.

내가 이렇게 답을 적은 이유는 현재 객체 지향 언어 + 함수형 언어도 가능한 자바 스크립트를 사용하고 있고, 함수형 언어만을 지원하는 언어는 아직 사용해보지 않았기 때문에 지래짐작으로 적었던 것 같다.

방금 찾아보니 함수형 언어로는 크로저 , 하스켈 , 펄 그리고 함수형 언어에 가까운 파이썬이 있다고 합니다. 파이썬은 사용해 보았는 데 자주 깊이 있게 만들어 본 경험이 없어서 기회가 된다면 파이썬을 이용해 Django를 사용해 보고 싶은 마음이 있습니다. ( flask는 만들어 보았음)

평소 함수형 프로그래밍에 대한 장점을 많이 들었었는데 앞으로 이러한 장점을 많이 들었으니 실천해야 할 때라고 생각합니다.