목록R & D/Software Engineering (9)
KoreanFoodie's Study
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 특성 기반 테스트를 유닛 테스트와 함께 활용하면 테스트를 간략화하면서 견고한 테스트가 가능하다. 2. 모나드는 특정 인자를 타입으로 받아, unit/bind operator 를 통해 특정 중복을 제거하는 것에 유용하게 사용될 수 있다. 3. 이벤트 소싱을 활용하면, 데이터가 어떤 연유로 현재 상태에 이르게 되었는지 쉽게 파악이 가능하다. 특성 기반 테스트 소프트웨어 개발에서 유닛 테스트는 매우 중요하다. 결국 프로그램이라는 것이 특정 입력을 넣으면 특정 출력이 나오도록 하는 것이므로, 원하는 결과가 나오는지 배포 전에 항상 점검해야 한다. 기존에는 사실 특정 상황에 대..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 메모이제이션을 활용하면, 재귀적인 연산에서 이전 연산의 캐싱값을 이용해 불필요한 연산을 줄일 수 있다. 2. 꼬리 재귀 최적화는 컴파일러 최적화 플래그를 활성화하면 된다. 이를 통해 메모리 사용을 낮출 수 있다. 3. 순수 함수의 불변성을 이용해 병렬 연산을 쉽게 적용할 수 있다. 하지만 future 등을 사용하여 병렬 연산을 하는 것보다, sequential 한 방식의 성능이 더 나을 때도 있다. 퍼포먼스 최적화 사실 모든 경우와 상황에 알맞은 최적화 방법이란 없다. 어떤 경우는 메모리를 희생해서라도 속도를 높여야 할 수도 있고, 다른 경우는 메모리를 아끼기 위해 빠..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 함수형 연산자를 활용해 중복을 제거하고 DRY 원칙을 지킬 수 있다. 2. 파라미터 유사성이나 함수 중복 사용의 유사성은 파셜 애플리케이션 특수화나 함수형 합성으로 해결할 수 있다. 3. 고차원 함수를 통해 구조적 유사성과 숨은 루프를 제거할 수 있지만, 과도한 추상화는 다른 프로그래머들에게 진입장벽을 높일 수 있음에 유의하자. 함수형 연산자를 활용한 중복 제거 함수형 연산자를 적극 활용함으로써, 중복을 제거하고 DRY 원칙을 지킬 수 있다. DRY 원칙은 Don't Repeat Yourself 의 약자로, 코드가 지식을 보관하는 방식이라는 이해에 바탕을 둔다. 이상적..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 모든 프로그램은 순수 함수의 집합으로 표현될 수 있으며, 입력과 출력이 상호 작용하는 함수 집합으로 정의할 수 있다. 2. 입력과 출력 중심으로 사고하며, 중간 단계의 변환 과정을 차례대로 구현해 보자. 함수형으로 사고하기 모든 프로그램은 순수 함수의 집합으로 표현될 수 있으며, 입력과 출력이 상호 작용하는 함수 집합으로 정의할 수 있다. 함수를 설계할 때, 다음 스텝을 밟으면 함수를 간단하게 설계할 수 있다. 입력 데이터로부터 출발한다. 출력 데이터를 정의한다. 일련의 입력 데이터를 출력 데이터로 변환하는 각 단계인 변형 과정(순수 함수)를 정의한다. 사실 위 내용은..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 파셜 애플리케이션은 N 개의 인자를 가진 람다에서 하나의 인자를 바인딩해 N-1 개의 인자를 가지는 람다로 변환하는 연산을 의미한다. 2. 커링은 N 개의 인자를 가진 함수를 하나의 인자를 가진 함수 N 개로 분해하는 과정을 의미한다. 3. 파셜 애플리케이션과 커링을 이용하면 중복을 제거할 수 있고, 더 범용적인 코드를 생성할 수 있다. 우리는 이번 글에서 파셜 애플리케이션과 커링을 배우며, 이 두 가지가 어떻게 연관되었는지 알아볼 것이다. 파셜 애플리케이션 파셜 애플리케이션이란, N 개의 인자를 가지는 람다에서 하나의 인자를 바인딩해 N-1 개의 인자를 가지는 람다를..
함수형 프로그래밍 패러다임에 대해 알아보며 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 함수(람다)는 값이다. 고로 함수는 인자로 전달할 수 있고, 람다를 반환할 수 있으며 람다도 람다를 반환할 수 있다. 2. 순수 함수의 조합을 통한 설계는 불변성을 보장한다. 우리는 간단한 람다를 조합하여 고차원의 합성 함수를 만들어낼 수 있다. 3. 함수형 합성을 통해 중복을 효과적으로 제거할 수 있다. 또한 여러 인자를 가진 람다도 하나의 인자와 캡쳐된 값들을 가진 다수의 람다로 분해할 수 있다. 함수형 합성 우리는 고등학교 시간에 함수 합성에 대해 배웠다(혹은 중학교일수도 있다). 놀랍게도, 우리는 C++ 에서 동일한 작업을 할 수 있다. 😛 우리는 이제 람다를 ..
함수형 프로그래밍 패러다임에 대해 알아보며, 이를 C++ 를 이용한 소프트웨어 개발에 어떻게 적용하면 좋을지 알아보겠습니다. 핵심 : 1. 함수는 값이다. 함수는 인자로 전달할 수 있다. 간단한 함수를 조합해 더 크고 복잡한 함수를 만들 수 있다. 2. 순수 함수의 조합을 통한 설계는 불변성을 보장한다. 3. 람다를 순수 함수처럼 사용하자. 또한 캡쳐에 대해 명확히 알아두자. 사실 필자도 학부 과정 때 프로그래밍 언어 관련 수업을 들으며 함수형 언어를 접했지만, 그 당시에는 프로그래밍 자체에 대한 흥미가 그다지 없어서 그런지 큰 관심을 갖지 않았다. 열심히 하지도 않았고. 😅 그러다 보니 함수형 언어에 대한 지식은 머리 속 어느 구석에 앉아 먼지만을 수집하고 있었다. 그러다 다시 이 책을 읽으면서 함수형..
UML (Unified Modeling Language) UML 에는 Class, Sequence, Use Case, Component 등 다양한 종류가 있지만, 여기서는 주로 Class 와 Sequence 다이어그램을 정리한다. 클래스 다이어그램 (Class Diagram) 클래스들 사이의 관계는 다음과 같이 표현될 수 있다(참고 링크). 각 관계를 조금 더 자세히 기술하면 다음과 같다. 관계 표시 설명 연관 관계 (association) 실선이나 화살표 연관 관계는 오랜 시간 동안 같이할 객체와의 관계를 나타낸다(e.g. 자동차와 소유자의 관계) 보통 클래스의 속성(멤버 변수)에서 참조할 때 연관 관계를 가진다. 단방향 연관 관계의 경우, 화살표를 사용하여 클래스를 참조한다. 양방향 연관 관계의 경우..
객체지향의 본질 사실 대부분의 사람들이 객체지향이라는 말을 들었을 때 떠올리는 문장은 다음과 같을 것이다. 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라본다 자율적인 객체는 상태와 행위를 함께 지니며, 스스로 자기 자신을 책임진다 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다. 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다 (캡슐화라는 것은, 메시지를 전송한 객체는 수신한 객체가 어떻게 동작할지를 모르고, 수신한 객체가 요청 사항을 메시지로 받은 후 알아서 처리한다는 것을 의미한다. 따라서 메시지를 전송하는 ..