Community

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

← Go back
Mission2 연습문제 풀이
#pragmatic
2년 전
1,421

👊 연습 문제 2 (66p)

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

👊 풀이과정

  • 우선 객체 지향 언어에 대해 정리를 해본다.

  • 객체 지향 언어: IT관련 객체 지향 프로그래밍에서 사용하는 언어로서, 객체를 만들고 조작하며 객체끼리 관계를 맺음으로싸 다수의 객체가 함께 수행될 수 있게 한다. 컴퓨터를 예로 들어 본다면 컴퓨터 한대를 완성하려면 CPU, RAM, BORAD, SSD 등 여러가지 부품이 있어야 한다. 부품 하나하나가 연결이되고 조립이 되어야 컴퓨터의 기능이 제대로 작동이 된다. 여기서 컴퓨터 부품들이 객체이다. 대표적으로 자바, C++, C#, 파이썬, 루비 등이 있다.

  • 객체 지향 언어의 특징: 캡슐화, 상속, 다형성, 추상화

  • 객체 지향 언어의 장점: 재사용성, 생산성 향상, 자연적인 모델링, 유지보수의 우수성

  • 객체 지향 언어의 단점: 함수의 비일관성, 객체 간 의존성 증가, 객체 내 상태 변화 제어의 어려움

  • 다음으로 함수형 언어에 대해 정리를 해본다.

  • 함수형 프로그래밍의 정의: 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나. 함수의 응용을 강조하며 선언형 프로그랭 패러다임을 따르고 있다. 수학의 함수를 프로그래밍 언어 설계에 적극적으로 반영한 것.

  • 리액트: 리액트는 함수형 프로그래밍 철학을 받아들여 만들어진 라이브러리로 함수형 프로그래밍의 대표 특징 중 하나인 '불변성'을 강조한다. 이에 더해 함수형 컴포넌트가 소개되면서 더욱 더 함수형 프로그램이과 관련성이 높아졌다.

  • 함수형 언어의 특징: 불변성, First-class, higher-order function, Lazy evaluation

  • 함수형 언어의 장점: 객체 단위로 문제를 분해하지 않고 함수들의 집합으로 문제를 분해하는 방법론으로, 객체지향 프로그래밍이 가진 문제점을 극복할 수 있는 장점을 지닌다.

  • 직교성이란? 컴퓨터 과학에서 이 용어는 일종의 독립성이나, 결합도 줄이기를 의미한다. 하나가 바뀌어도 나머지에 어떤 영향도 주지 않으면 서로 직교한다고 할 수 있다.(55p)

  • 직교성이 높다: 코드의 독립성이 높고, 서로간의 결합도가 적다.

  • 직교성이 낮다: 코드의 독립성이 낮고, 서로간의 결합도가 많다.

  • 객체 지향 언어와 함수형 언어의 직교성: 언어의 차이로만 생각해 봤을 때 직교성은 함수형 언어가 더욱 높다고 생각이 든다. 이 말은 즉, 객체 지향 언어로 코드를 작성할 때 코드간 의존성이 높아 하나를 바꾸더라도 다른 곳에도 많은 영향을 준다. 이렇게 되면 코드를 수정할 때 많은 코드를 수정해야 할 필요가 있다.

  • 여긴 저의 지극한 주관적인 생각입니다. 다양한 언어가 있다. 이 모든 언어에는 잘못이 없다. 어떤 코드를 작성하는지에 따라 그에 적절한 언어가 있다. 즉, 직교성은 언어의 차이라기 보다는 언어를 사용하는 사람들 마다 방법이 다르다는 점에서 차이가 난다. 직교성을 최대가 높이는 것을 목표로 두고 코드를 작성하면 결합도와 의존성이 떨어지는 훌륭한 코드를 작성할 수 있다. 최대한 부끄러운 코드를 작성하라고 책에서 소개하고 있다. 내가 누군지 여기는 내가 어떤 코드인지 다른 곳에 최대한 숨기면서 작성하면 어떤 언어든 직교성을 최대화하는 멋진 코드가 될 수 있다.

👊 참고링크



👊 책에 있는 해답

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

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

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