반응형

2737

C++ : 람다식 : 장점, 단점, 배스트 프랙티스, 예제, 구현

람다식의 장점 간단한 함수를 빠르게 만들어 구현할 수 있습니다. 람다식의 단점 디버깅하기 힘들어질 수 있습니다. 함수 재사용성이 낮아집니다. 사람들은 보통 함수를 새로 만들기 전에 클래스에 있는 기존 함수를 찾아봅니다. 람다 함수는 눈에 잘 띄지 않아서 못찾을 가능성이 높습니다. 그럼 코드 중복이 발생하게 되는 것입니다. 베스트 프랙티스 기본적으로 이름 있는 함수를 씁니다. 자잘한 함수는 람다로 써도 괜찮습니다. 허나 재사용할 수 있는 함수를 찾기는 어렵습니다. 정렬 함수 처럼 stl 컨테이너에 매개변수로 전달할 함수들도 좋은 후보입니다. qsort()에 함수 포인터 넘겨주기보다는 람다가 확실히 더 좋습니다. #include #include #include "LambdaExpressionsExample...

SW/C++ 2020.04.29

마이크로서비스 : 내부/외부 아키텍처 : 의미, 개념, 정의, 개요

소프트웨어 아키텍처의 의미 소프트웨어 아키텍처는 소프트웨어를 구성하는 요소와 그 구성요소 간의 관계를 정의하는 것입니다. 아키텍처링은 시스템 구축을 위한 여러 가지 비기능 요건, 예를 들면 문제 영역이 되는 성능, 가용성, 보안, 유지보수성, 확장성 등을 만족하도록 여러 가지 해법을 정의하는 과정입니다. 특히 마이크로서비스 아키텍처는 클라우드라는 가상의 인프라를 활용하여 구조화하는 것이기 때문에 클라우드의 특징을 고려하여 설계되어야 합니다. 클라우드 인프라 및 마이크로서비스 기반 시스템의 장점은 변화무쌍한 비즈니스 환경에 대응할 수 있는 대체성과 확장성이 있기 때문에 아키텍처도 변화에 대응할 수 있는 유연성과 확장성을 반드시 갖춰야 합니다. MSA 내부/외부 아키텍처 다음은 일반적인 마이크로서비스 아키텍..

C++ : 람다식 : 개념, 예제, 구성, 방법, 활용법

람다식이란 이름이 없는 함수개체, 내포되는 함수를 의미합니다. []() -> { // body } 람다 식을 품는 법위 안에 있는 변수를 람다 식에 넘겨줄 떄 사용합니다. 캡처의 종류 [] : 비어 있으므로, 캡처하지 않습니다. = : 값에 의한 캡처, 모든 외부 변수를 캡처합니다. 람다 식 안에서 수정할 수는 없습니다. & : 참조에 의한 캡처입니다. 모든 외부 변수를 캡처합니다. : 특정 변수를 값으로 캡처합니다. 람다 식 안에서 수정할 수 없습니다. & : 특정 변수를 참조로 캡처합니다. int main (){ float score1 = 80.f; float score2 = 20.f; auto max = [=](){ return score1 > score2 ? score1 : score2; } st..

SW/C++ 2020.04.28

소프트웨어 아키텍처 : 품질 속성 설계 전략 원리 : 개념, 개요, 정의

품질속성 설계전략의 원리 아키텍처 패턴은 자주 발생하는 아키텍처 설계 문제에 대한 준비된 해결 방법이므로 대개의 경우 특정한 품질을 확보하는 문제에 대한 해결 방법을 제시하지 않습니다. 패턴을 통하여 품질 개선 효과가 얻어질 수도 있으나 그것이 만족스럽지 않을 수 있습니다. 또한 마땅히 적용할 패턴이 없는 상황에서 어떤 품질을 확보해야 하는 문제가 대두될 수도 있습니다. 품질속성 설계전략은 특정한 품질속성 응답을 제어하는 데 효과가 있는 설계 전략입니다. 품질 속성의 분류 성능, 상호 운영성, 변경 용이성, 가용성, 보안성, 시험 용이성 및 사용 용이성의 7개 품질속성에 대한 설계전략 도출지침이 있습니다. 이들 중 성능을 예로 하여 품질속성 설계전략이 무엇인지를 알아봅니다. 성능 설계 전략 성능은 시간에..

C++ : constexpr : 개념, 예제, 사용법, 필요성, 장점

constexpr 컴파일 시에 값 평가를 강제하기 위해서 템플릿 메타프로그래밍을 남용하였습니다. 이러지 않아도 컴파일러가 자발적으로 그렇게 해주는 경우도 있긴하였습니다. constexpr가 프로그래머의 의도를 보여주는 더 좋은 방법이라 할 수 있습니다.컴파일 도중에 값을 평가하는 것을 컴파일러에게 알려줍니다. 컴파일러가 컴파일 도중에 변수들을 결정지어 줍니다. 함수는 최대한 노력을 합니다. constexpr int Factorial ( int n){ return n = 1 ? 1 : n * Factorial(n -1); } int main () { int value = 3; int result1 = Factorial(value); constexpr int result2 = Factorial(value);..

SW/C++ 2020.04.27

소프트웨어 아키텍처 : 아키텍처 패턴 원리 : 개념, 정의, 개요

아키텍처 패턴 원리 테일러는 아키텍처 패턴을 반복적으로 발생하는 설계 문제에 적용될 수 있는 아키텍처 설계 결정으로 정의하였습니다. 그리고, 아키텍처 패턴의 급증으로 문제가 발생하는 여러 가지 다른 소프트웨어 개발 상황에 다뤄질 수 있도록 일반화되어 있다는 점을 강조하였습니다. 아키텍처 패턴의 표현 아키텍처 패턴을 기술하기 위하여는 패턴이 사용되는 문맥, 패턴이 해결해야 하는 문제와 그 해결 방법 외에도 패턴의 이름과 패턴의 사용에 따른 파급효과를 기술하여야 합니다. 아키텍처 패턴의 예 소프트웨어 시스템 개발에 자주 쓰이는 아키텍처 패턴의 예로 Three Tiers 아키텍처 패턴이 있습니다. 이 패턴에서 컴포넌트는 Front Tier 컴포넌트, Middle Tier 컴포넌트 Backend Tier 컴포넌..

C++ : 이동대입연산자 : 개념, 예제, 활용방법

이동 대입 연산자 & ::operator=(&&) 이동 생성자와 같은 개념입니다. 다른 개체 멤버 변수들의 소유권을 가져옵니다. 이것도 메모리 재할당을 하지 않습니다. 또 얕은 복사입니다. STL 컨테이너용 이동 문법 C++11 이후로, STL 컨테이너에 이동생성자와 이동 대입이 생겼습니다. 그래서 따로 구현할 필요가 없어졌습니다. rvalue 최적화 새로운 프로그래밍 유행어 중 하나입니다. 이동생성자와 이동 대입 연산자는 유효한 내용입니다. 그러나 포인터 대신 개체 자체를 반환하는 함수에서 rvalue를 반환하는 것은 실제로는 매우 느리다고 합니다. 반환 값 최적화라고 하는 컴파일러 최적화를 깨뜨립니다. 가장 좋은 방법은 기본적으로 그냥 개체를 반환해야 합니다. 더 빠라진다고 입증된 경우에만 함수가 r..

SW/C++ 2020.04.26

아키텍처 : 설계의 일반 원리 : 개념, 개요, 정의

설계의 일반 원리 아래 그림은 문제해결에 사용되는 일반적인 접근 방법의 종류를 보여줍니다. 먼저 주어진 문제를 이미 해결책이 알려져 있는 문제로 변형하는 방법입니다. 이런 방법은 그 해결책을 원래의 문제에 대한 직접적인 해결책으로 쉽게 변형할 수 있으면 원래의 문제를 해결하기 위한 좋은 방법이 됩니다. 그림의 위 부분은 이 경우를 보여줍니다. 이미 존재하는 해결책을 이용할 수 없는 경우 원래의 문제를 더 쉬운 문제들로 나누어 해결할 수 있다면, 그 하위 문제들에 대한 해결책들을 합성하여 원래의 문제에 대한 해결책을 만들 수 있습니다. 위 그림의 중간 부분은 이 경우를 보여줍니다. 만일 문제 해결에 기존의 해결책을 활용할 수 있으면 기존의 해결책을 사용할 수 없는 부분에 대해서만 새로이 해결책을 만들고, ..

C++ : lvalue, rvalue, move, 이동생성자 : 개념, 장점, 필요성

lvalue 단일 식을 넘어 지속되는 개체를 의미합니다. 주소가 있으며, 이름이 있는 변수입니다. const 변수, 배열 변수, 비트 필드, 공용 구조체, 클래스 멤버, 좌측 값 참조로 반환하는 함수 호출, 문자열 리터럴 등을 의미합니다. 대부분 지금까지 익숙한 것들을 lvalue라고 생각하면 됩니다. rvalue lvalue가 아닌 개체라고도 할 수 있습니다. 사용되는 단일 식을 넘어 지속되지 않는 일시적인 값을 의미합니다. 주소가 없는 개체, 리터럴(문자열 리터럴 제외), 참조로 반환하지 않는 함수 호출, i++, i-- 등 기본으로 지원되는 산술식, 논리식, 비교식 등이 있습니다. 추가적으로 람다, 열거형들이 그 예라 할 수 있습니다. C++에서 어떻게 복사를 막을 수 있을까요? rvalue 참조와..

SW/C++ 2020.04.25

소프트웨어 아키텍처 설계 원리 : 아키텍처 설계 절차 원리

아키텍트 설계 절차 원리 아키텍처 설계의 출발점은 소프트웨어 시스템의 요구사항들입니다. 소프트웨어 개발의 폭포수 모델은 요구사항 분석이 끝나고 설계가 시작되는 것으로 소프트웨어 개발 프로세스를 설명하지만, 이는 논리적인 순서이고, 실제로는 요구사항 분석과 아키텍처 설계는 서로 얽혀서 상당 부분 동시적으로 진행되는 활동입니다. 초기 단계의 요구사항으로부터 초기 아키텍처가 만들어지면 이는 더 많은 구체적인 요구사항을 파악하는 데 이용됩니다. 이는 다시 아키텍처를 더 구체화하는 데 이용되고, 이 과정이 반복되면 요구사항 명세와 아키텍처가 만들어집니다. 요구사항 분석과 아키텍처 설계가 동시에 이루어지는 이유는 요구사항의 변경 및 추가가 수시로 일어납니다. 상용 소프트웨어 컴포넌트나 오픈소스 코드를 개발에 사용할..

C++ : 템플릿 : 특수화, 장점과 단점, 베스트 프랙티스

템플릿 특수화 특정한 템플릿 매개변수를 받로록 템플릿 코드를 커스터마이즈를 할 수 있습니다. std::vector에 좋은 예제가 있습니다. 제너릭한 벡터와 다르게 bool 형은 다르게 구현이 되어 있습니다. 제네릭 템플릿이 어느 형에나 적용되어 있습니다. 단 특정형에 특수화된 템플릿이 있다면, 그 특수화된 템플릿이 적용됩니다. 그러나 자주 사용되지는 않습니다. 하지만 std::vector에서는 bool형에 대한 특수화는 가치가 있습니다. 그 이유는 메모리를 더욱 효율적으로 활용하도록 구성할 수 있기 떄문입니다. 전체 템플릿 특수화 template VAL Power(const VAL value, EXP exponent) {} template float Power(float value, float exp) ..

SW/C++ 2020.04.24

소프트웨어 아키텍처 관점과 뷰 : 정의, 개념, 종류, 개요

관점과 뷰 소프트웨어 시스템은 자체는 무엇인지 특징 짓기 어렵습니다. 그러나 특정한 시각을 갖고 그 시각이 집중하여 보려 하면 복잡한 소프트웨어 시스템도 그 방향에서의 모습을 보입니다. 이렇게 소프트웨어 시스템을 포착하기 위한 시각을 관점이라고 하고 그 관점에서 본 시스템의 모습을 뷰라고 합니다. 소프트웨어 시스템 그 자체는 볼 수 없지만 슬라이드의 사진에서와 같이 적절한 관점들과 그 관점들에서 본 뷰들로 소프트웨어 시스템의 아키텍처를 가시화시킬 수 있습니다. 관점 시스템이 관심을 갖는 이해당사자에 따라 관점이 달라지고 이들 숫자만큼 다양하다고 원칙적으로 이 질문에 답할 수 있습니다. 그러나 실제로는 많은 가능한 관점 중에서도 소프트웨어 개발을 위해 특히 중요하여 일반적으로 많이 이용되는 관점들이 있습니..

소프트웨어 아키텍처 스타일 : 개념, 종류, 정의, 개요

아키텍처 스타일 소프트웨어 아키텍처의 경우에도 마찬가지로 여러 스타일이 존재하며 이들이 갖는 소프트웨어 개발 용이성 및 시스템이 주는 특징이 서로 다르기 때문에 아키텍처 스타일의 선택은 소프트웨어 개발에서 매우 중요하며 이어지는 아키텍처 설계 및 개발에 큰 영향을 미치게 됩니다. 만일 분산 환경에서 많은 사용자를 위한 소프트웨어 시스템에 대하여, 컴포넌트들이 물리적으로 분리되어야 합니다. 둘째, 서비스 제공자들이 서비스 요청자들이 누구인지 알 수 없어야 합니다. 셋째, 서비스 요청자들이 서로 분리되고 보호되어 해당 서비스 제공자에게만 의존해야 합니다. 넷째, 복수의 서비스 제공자들이 동적으로 추가될 수 있어야 합니다. 이 설계 결정들을 채택할 경우 어떤 컴포넌트들이 시스템에 있어서 어떻게 작용하게 되는지..

소프트웨어 아키텍처 : 컴포넌트, 커넥터, 인터페이스 : 개념, 정의, 개요

컴포넌트, 커넥터, 인터페이스 많은 문제 해결을 위하여 분할 정복이라는 문제 해결 방식을 사용합니다. 예를 들어 여러 명이 같이 쇼핑을 할 때 빨리 쇼핑을 마치를 위해 일을 나누어 각자가 많은 물건을 고르고 계산대에서 한꺼번에 지불하는 방법을 취할 수 있습니다. 소프트웨어 시스템의 개발에 있어서는 분할 정복은 우리가 적용하게 되는 가장 기본적이고 근본적인 접근 방법입니다. 따라서 시스템이 먼저 어떤 컴포넌트들로 구성되고 그들을 어떻게 연결하여 최종적으로 원하는 시스템이 되게 할 수 있는지 구상합니다. 이 활동을 시스템 아키텍처 설계라고 보는데 이와 같이 아키텍처 설계가 만들어지면 시스템의 프로그램은 아키텍처 설계를 따라 만들게 됩니다. 결국 우리가 크고 복잡한 문제를 해결하는 데 쓰지 않을 수 없는 문제..

Java : Spring : 의존성 주입(Dependency Injection) : 개념, 예제, 구현

의존성 주입(Dependency Injection) 의존성 주입은 spring에서 아주 중요한 개념이자 장점입니다. Bean 객체를 생성할 떄 Bean 객체가 관리할 값이나 객체를 주입하는 것을 의미합니다. Bean 객체 생성 후 Bean 객체가 가질 기본 값을 자바 코드로 설정하는 것이 아닌 Bean을 정의하는 xml 코드에서 정의하는 개념입니다. 생성자를 통한 주입 Bean을 정의할 떄 constructor-arg 태그를 이용해 주입하게 되면 생성자를 통해 주입할 수 있습니다. value : 기본 자료형 값과 문자열 값을 설정합니다. ref : 객체를 설정합니다. type : 저장할 값의 타입을 설정합니다. index : 지정된 값을 주입할 생성자의 매개변수 인덱스 번호입니다. beans.xml Da..

SW/Java 2020.04.20

C++ : 템플릿 프로그래밍 : 기본 개념, 예제, 활용방법, 주의사항

템플릿 프로그래밍 java와 C#에서의 제너렉 메서드 / 클래스와 유사합니다. STL 컨테이너 또한 템플릿으로 구성되어 있습니다. 덕분에 코드를 자료형마다 중복으로 장석하지 않아도 됩니다. 함수 템플릿 template T Add(T a, T b) { // ... } template T Add(T a, T b) { // } 함수 템플릿을 호출할 때 템플릿 매개변수를 생략할 수 있습니다. typename vs class 차이가 무엇일까요? 사실상 큰 차이는 없다고 합니다. 그냥 typename을 사용해도 무방합니다. 템플릿은 어떻게 동작할까요? 템플릿을 인스턴스화할 때마다 컴파일러가 내부적으로 코드를 생성합니다. 템플릿에 넣는 자료형 가짓수에 비례해서 exe 파일 크기가 증가합니다. 예시 class MyIn..

SW/C++ 2020.04.20

아키텍처 설계 문제 분석 원리와 방법 : 개념, 개요, 정의

아키텍처 설계 문제 분석의 원리 아키텍처 설계 문제 분석은 요구사항들 속에서 아키텍처 설계를 요구하는 문제를 식별하고, 정리하고, 그 해결책의 후보를 도출하는 활동입니다. 이를 위해서는 첫 번째로 선정된 아키텍처 드라이버들로부터 어떤 설계 문제가 들어있는지를 파악하여 정리하고, 둘째로 이 문제들에 대한 가능한 해법들을 도출하고, 셋째로 이 해법들을 평가하여 그 효과를 정리하여야 합니다. 세 번째 단계의 작업이 평가를 위해서는 직관을 사용할 수도 있고, 매우 중요한 결정인 경우에는 뒤에서 12번째 아키텍처 설계 원리로 학습하게 될 비용 이득 관점의 진보된 평가 방법을 사용할 수도 있습니다. 아키텍처 설계 문제 분석 방법 과거에 여러 연구자들에 의해서 여러 가지 방법이 만들어졌지만, 여기서는 지멘스 회사의 ..

반응형