2022 Masters Course/CS 10 Course

2022 마스터즈 코스(백엔드) 15일차 회고(2022. 1. 21.) - "객체지향 프로그래밍 vs 함수형 프로그래밍"

ikjo 2022. 1. 21. 16:51

해당 글은 코드스쿼드 2022 마스터즈 코스 "Java 웹 백엔드" 과정을 수강하면서 학습한 내용 등에 대한 회고 글입니다. :)

 

수강 회고

마스터즈 코스 과정 3주차가 끝나가는 오늘 소모임원들간 스크럼을 진행하면서 확실히 이번주 초보다 다들 피곤한 기색이 역력해 보였다. 다들 과제 풀이, 개인적인 공부 등 바쁜 일상을 보내는 것 같았다. 나같은 경우에는 저번주에 다짐했던 건강 관리 유념 부분을 이번주에 잘 지킨 것 같았다. 이번주는 무리해서 늦게 자지 않고 정해진 시간에 자서 정해신 시간에 일어나는 등 이전 보다 규칙적인 생활 패턴을 유지할 수 있었다. 확실히 머리가 맑으닌까 주어진 시간에 딱 집중할 수 있고 좋은 것 같다.

 

모든 일이 다 그렇겠지만 프로그래밍 역시 장거리 마라톤이라고 생각한다. 따라서 프로그래밍 공부를 함에 있어서 불가항력적인 데드라인(100m 등 단거리 경주)이 주어지지 않는 이상 특정 과제 해결이나 특정 기술 마스터를 위해 자신의 건강에 무리를 주면서 까지 하루하루를 보낼 필요는 없다고 생각한다. 잠을 줄여가면서 하루에 많이 공부하는 것 보다 하루라는 시간 동안 체계적으로 공부하는 것이 더 중요하다는 생각이 들었다. 사실 이에 대한 생각은 나에게 해당되는 것이기도 해서 나부터 이를 잘 실천해야겠다는 생각이 들었다.

 

스크럼 이후 크롱의 함수형 프로그래밍 관련 이론 수업이 진행되었다. 크롱의 강의 중 가장 인상깊었던 대목은 "반드시 함수형 프로그래밍을 고집할 필요가 없다"는 것이다. 객체지향 프로그래밍은 대표적으로 캡슐화, 상속, 추상화, 다형성 특성을 갖는데, 이는 코드의 재사용성과 신뢰성을 높이고 유지보수를 용이하게 해준다. 반면에 함수형 프로그래밍은 순수 함수, 표현식, 스트림 등을 기반으로 코드의 가독성을 높이고 마찬가지로 유지보수를 용이하게 해준다. 사실 "~을 용이하게 해준다"라는 표현 보다는 특정 상황에 따라 각각의 프로그래밍의 장점이 극대화되는 것이 맞는 표현이라고 생각한다. 즉, 상황에 따라 적절하게 잘 골라서 쓰는 것이 중요하다고 생각이 들었다.

 

개발자 역시 개인 사업자가 아닌 이상 결국에는 직장인이다. 3년간 직장에서 근무했었던 내 경험에 비추어 생각해 보았을 때 회사가 개발자(사실상 모든 직장인)에게 원하는 것은 어떤 경이로운 테크닉(기술)이 아니라 더 큰 개념에서 서비스를 이용하는 고객의 만족도 제고비용 대비 이익(돈, 시간 등) 극대화라고 생각한다. 테크닉은 이에 포함되는 관계라고 생각한다. 즉, 객체지향 프로그래밍이 더 중요하냐 함수형 프로그래밍이 더 중요하냐를 따지는 것보다 어떻게 하면 적은 메모리나 트래픽을 사용할 수 있는지, 유지보수를 용이하게 할 수 있는지, 사용자에게 어떤 편익을 줄 수 있는지, 사용자에게 빠른 속도로 서비스를 제공할 수 있는지, 개인 정보가 유출되지 않도록 할 수 있는지 등 서비스 운영의 전반적인 차원에서 어떻게 프로그래밍을 해야할지를 먼저 고민해야하지 않을까 생각이 들었다. 즉, 어떤 기술(프로그래밍)을 선보이냐는 이러한 고민에 대해 Best Solution을 제공할 수 있는지로 정해져야 하지 않을까 생각이 들었다. 물론 이를 위해서는 테크닉(기술) 공부가 필수 불가결하다.

 

 

학습 회고

  • 함수형 프로그래밍 관련 미션 과제 풀이 및 그룹 리뷰
    • Java 웹 백엔드 클래스 내 소모임원들과 zoom 회의실에서 학습

 

어제 소모임원들과 함수형 프로그래밍 관련 미션을 해결하면서 소모임원들께서 공유해주신 좋은 참고자료들을 확인해 볼 수 있었는데, 대표적으로 후님께서 공유해주신 유튜브 드림코딩의 "함수형 프로그래밍이 대세다?! (함수형 vs 객체지향)" 영상이 함수형 프로그래밍의 특징을 이해하는데 많은 도움이 되었다. 이 영상의 내용을 참고하여 함수형 프로그래밍의 특징을 정리해보자면 다음과 같다.

  • 순수 함수를 이용 한다. 순수 함수는 외부의 값을 참조하거나 외부의 값을 변경하지 않고 동일한 값을 넣었을 때 항상 동일한 값을 출력하는 특징이 있다.
  • 무상태, 불변성을 유지한다. 함수에 전달된 매개변수 데이터를 변경해서는 안되며 새로운 값 또는 객체를 생성해서 반환값으로 전달할 수 있어야 한다. 이 덕에 멀티 쓰레드 환경에서 안정적으로 동작할 수 있게 된다.
  • if, switch, for문 등을 사용하지 않고 Expression을 사용해야 한다.
  • 일급 함수와 고차 함수의 속성을 가져야 한다. 일급 함수는 함수를 변수에 할당하거나 함수를 인자에 두거나 리턴하는 등의 속성을 뜻하고, 고차 함수는 함수 자체를 인자로 전달하거나 함수에서 또 다른 함수를 리턴하는 등의 속성을 뜻한다.

 

 

또한 이번 과제를 진행하면서 개인적으로는 클로저에 대한 개념은 생활코딩 강의가 많은 참고가 되었다. 간단하게 요약하자면 다음과 같다. 프로그래밍을 하다보면 함수 안에 또 다른 함수가 있는 경우가 많은데, 이때 바깥에 있는 함수를 외부 함수, 내부에 있는 함수를 내부 함수라고 한다. 기본적으로 내부함수는 외부함수의 지역변수에 접근할 수 있다. 하지만 외부 함수의 실행이 끝나서(return) 소멸된 이후에도 내부 함수가 외부 함수의 변수에 접근할 수 있는데 이러한 매커니즘을 클로저라고 한다.

 

이외에도 다른 소모임원들께서도 많은 좋은 자료들을 공유해주시고 많은 질문에 답해주신 덕에 이번 과제를 잘 마무리할 수 있었다고 생각한다. 매주 금요일에 남기는 다소 식상한(?) 인사임에도 불구하고 이번 한 주 역시 소그룹 활성화를 위해 노력해주시고, 피곤하신 와중에도 소모임원들의 질문들에도 친절히 답해주셨던 백엔드 클래스 1조 소모임원들 sally, 테리, 피오, Jerry, Miller, 루이, Yan, 후, 벅픽, Ader 모두에게 진심으로 감사의 인사를 드리고 싶다.

 

좋았던 점

  • 그룹 리뷰 시간을 통해 소그룹원들과 어떤 기술적인 고민 사항들에 대해 자유롭게 대화를 나눌 수 있어서 좋았습니다. 마치 대학 시절 동기들과 전력전자공학, 제어공학 등 전공 지식에 대해 논의했었던 때로 돌아간듯한 기분이기도 했습니다.

 

 

아쉬웠던 점

  • "객체지향의 사실과 오해"라는 책을 읽으면서 다소 집중하지 못하고 멍(?) 때리는 시간이 많았습니다.