Community

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

← Go back
Day 8. 연습문제 풀이
#pragmatic
2년 전
1,161

연습 문제 1(P.65)

파일에서 데이터를 읽는 클래스를 만들어야 한다. 한 번에 한 줄씩 읽어 들이고, 각 줄은 여러 개의 필드로 쪼개야 한다. 의사 코드로 표현한 다음 두 클래스 중 어떤 것이 더 직교적인가?

Class Split1 {

Constructor(fileName) #읽기 위해 파일을 열기

Def readNextLine() # 다음 줄로 이동

Def getField(n) # 현재 줄의 n번째 필드를 반환

}

Class Split2 {

Constructor(line) #한 줄을 쪼개기

Def getField(n) #현재 줄의 n번째 필드를 반환

}

: 파일에서 데이터를 읽는 클래스, 한 번에 한 줄씩 읽어들이는 클래스, 각 줄을 여러개의 필드로 쪼개는 클래스로 구성할 수 있을 것 같다. 다음 두 클래스의 이름은 쪼개는 것이므로, split2의 클래스가 보다 더 직교적이라고 볼 수 있을 것 같다.

책 속의 해답 : 우리 생각에는 split2 클래스가 더 직교성이 좋다. 이 클래스는 자기가 해야할 일인 줄 쪼개기에만 집중하고, 어디서 그 줄이 오는지와 같은 세부 사항은 무시한다. 그러면 코드가 개발하기 더 쉬워질 뿐만 아니라 더 유연해진다. Split2는 파일에서 읽어온 문자열을 쪼갤 수도 있고, 다른 루틴이 만든 문자열을 쪼갤 수도 있고, 환경 변수로 넘어온 문자열을 쪼갤 수도 있다.

연습 문제 2(p.66)

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

객체 지향 언어와 함수형 언어의 차이

https://99geo.tistory.com/62

"객체지향이 함수의 동작부를 캡슐화해서 코드를 이해할 수 있게 한다면, 함수형 프로그래밍은 동작부를 최소화해서 코드 이해를 돕는다."

https://mangsby.com/blog/programming/fp-vs-oop/

https://velog.io/@huurray/객체지향-프로그래밍과-함수형-프로그래밍

함수형 프로그래밍

https://velog.io/@teo/functional-programming

: 객체 지향 언어가 같은 지향성을 가진 함수, 혹은 변수들로 집합을 만들어 하나의 덩어리(모듈)로써 직교성을 만든다면, 함수형 프로그램은 처음부터 함수들의 역할을 구분지음으로써 직교성을 유지한다고 이해된다. 이와 같은 차이가 언어에 내재된 것도 분명 있겠지만 언어가 자체적으로 지원하지 않는다고 하더라도 우리는 그 언어에서 해당 방법을 구현할 수 없다는 생각은 들지 않는다. 비록 조금 더 힘이 들 수는 있겠지만(...)

결국에 책이 말하는것도, 객체 지향 프로그래밍과 함수형 프로그래밍의 차이도 우리가 프로그래밍을 하는데 있어서 보다 좋은 코드를 짜기 위한 방법론이라고 생각한다. 이와 같은 방법론은 결국 보다 많은, 다양한 환경들 속에서 적절한 방법, 언어 혹은 구조를 설계하기 위한 것이라고 이해된다. 따라서 객체 지향 언어와 함수형 언어는 그저 사람들이 언어를 사용하는 방법이 다른 것이라고 이해된다.

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

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

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

생각 정리

아직 프로그래밍을 많이 해 보지 않은 입장에서 대체로 예제를 따라가기가 힘이 듭니다. 혹여 제가 이해한 것이 잘못 된 부분이 있다면 얼마든지 알려주세요. 세이공청 하겠습니다...