프로그래밍 언어 93

프로그램 인터페이스 예시 STD::vector

하나의 기능을 다양한 기능으로 설계하는 인터페이스 원칙이 원칙의 대표적인 예시는 std::vector이다.std::vector는주어진 인덱스에 담긴 원소를 접근하기 위한두 가지 메서드를 제공한다.경곗값을 검사하는 at()메서드를 사용해도 되고,경곗값을 검사하지는 않지만좀 더 속도가 빠른 배열 표기법을 사용해도 된다.경곗값 검사를 반드시 한다면어느 정도 오버헤드를 감수하고 at() 메서드를 사용하면 된다.이 원칙은 인터페이스를 군더더기 없이설계해야 한다는 원칙의 예외로 봐야한다.이렇게 예외를 적용하더라도나머지 부분은 반드시 군더더기 없이 잘 설계해야한다.

인터페이스를 사용하기 쉽게 설계하기 (2)

필요한 기능 빼먹지 않기필요한 기능을 빼먹지 않는 원칙은두 단계로 적용한다.첫 번째는 클라이언트가 필요로 하는 동작은모두 인터페이스에 추가해야한다.간혹 포함시켜야할 지 불분명한 기능이 있다.이럴 때는 자신이 작성한 코드를 클라이언트가이용하는 모든 경우의 수를 따져봐야한다.인터페이스를 설계할 때 한 가지 관점만 고려하면다른 방식으로 바라보는 클라이언트가 필요한 기능을 놓칠 수 있다.물론 가능한 모든 경우의 인터페이스를 설계한다는 것이불가능에 가깝다.두 번째 인터페이스에 최대한 많은 기능을 구현하는 것이다.라이브러리에서 해결할 수 있거나그러나,인터페이스를 다르게 설계하면 알 수 있는 정보를클라이언트 코드에서 지정하도록 구현하면 안된다.또한 라이브러리의 결과를 합치는 데필요한 일을 클라이언트에게 떠넘기면 안된다.

인터페이스를 사용하기 쉽계 설계하기 (1)

직관적으로 구현하기인터페이스는 사용하기 쉽습니다.이 말은 쉽게 할 수 있도록 구성해야 하지 않을 것입니다.인을 간단하고 간단하게 사용하기 쉽습니다.여러분이 일하는 활동을 하는 데필요한 데이터 구축 하나를 적용하기 위해소스코드를 따라가거나,원하는 기능을 구현하는 코드가 너무 중요합니다.사용하기 쉬운 터터를 개발하기 가장 좋은 방법은사용자에게 있어서의 기준을 결정하는 것입니다.과거에 사용된 것과 유사한 인터페이스는 파악하기 쉽고 즉각적으로 활동할 수 있습니다.기분 나쁘게 행동할 가능성이 있습니다. 늘 사용자의 입장에서 인터페이스를 고려해야 한다.상식에 맞는지, 사용자가 충분히 예상할 수 있는지 따져봐야한다.물론 혁신도 중요하지만혁신은 인터페이스가 아닌 내부 구현 기술에서 추구해야 한다.예를 들어 소비자는일부..

인터페이스 목적 별 용도 고려하기

인터페이스 설계 유의사항1. 인터페이스 목적 별 용도 고려하기2. 인터페이스를 사용하기 쉽게 설계하기 - 익숙한 방식 따르기3. 인터페이스를 사용하기 쉽게 설계하기 - 필요한 기능 빼먹지 않기4. 인터페이스를 사용하기 쉽게 설계하기 - 군더더기 없는 인터페이스 제공하기5. 인터페이스를 사용하기 쉽게 설계하기 - 문서와 주석 제공하기APIAPI는 제품의 기능을 다양한 용도로 활용하거나그 제품의 기능을 확장하기 위해외부에 제공하는 인터페이스이다.내부 인터페이스가 일반 계약서라면API는 법전에 명시된 법률에 가깝다.일단 외부에서 사용자가 우리가 제작한 API를 사용하기 시작하면,특별히 도움되는 기능을 새로 추가하지 않는 한변경하지 않는 것이 좋다.따라서 API를 결정하기 전에 신중하게 설계하고고객이 원하는 바..

STL Map

map이란?맵은 딕셔너리 구조를 가진다.키를 통해서 값을 가져온다. 키와 값을 쌍으로 저장한다.C++ map은 자동 정렬되는 컨테이너이다.이진 탐색 트리 오름차순 기반이다. // 맵만들기 예시int mian(){ std::map simpleScoreMap; // 삽입 방법 1 simpleScoreMap.insert(std::pair("Mocha", 100)); simpleScoreMap.insert(std::pair("Coco", 50)); // 삽입 방법 2 || 이 방법은 접근 방법이기도 하다 simpleScoreMap["Mocha"] = 0; std::cout 맵도 복사 생성자가 있을까? 있다.맵의 복사 생성자 작성법// 복사 생성자를 ..

쓰레드 기본 사용법

멀티스레드 프로그래밍은 멀티프로세서가 장착된 컴퓨터 시스템에서 중요한 기법이다.멀티스레드 프로그래밍을 이용하면 시스템에 있는 여러 프로세서 유닛을병렬로 사용하는 프로그램을 작성할 수 있다.시스템에 프로세서 유닛이 장착되는 방식은 다양하다.독립적인 CPU 프로세서 칩이 여러 개 달려 있을 수 있고,한 프로세스 칩 안에 코어라 부르는 독립 CPU가 여러 개 있을 수 있고,또 어떤 시스템은 두 가지 방식이 혼합되기도 한다.이렇게 프로세스 유닛이 여러 개 달린 프로세서를 흔히 멀티코어 프로세서라 부른다.사실 이렇게 프로세서가 여러 개 달린 시스템이 나온지 꽤 오래되었지만이제는 서버부터 개인용 컴퓨터, 심지어 스마트폰에 이르기까지 거의 모든 시스템이멀티코어 프로세서를 사용한다.이처럼 멀티코어 프로세서가 보변화되었..

decltype과 템플릿

decltype의 개요decltype 형식 지정자는 지정된 식의 형식을 생성한다.즉 쉽게 말해 받아온 개체 타입을 그대로 개체를 생성해주는 키워드이다. decltype의 일반적 용례 템플릿decltype 형식 지정자는 auto 키워드와함께 템플릿 라이브러리를 작성하는 개발자에게 주로 유용하다. decltype 및 autoC++14에서는 후행 반환 형식 없이 decltype(auto)를 사용하여반환 형식이 템플릿 인수에 따라 달라지는함수 템플릿을 선언할 수 있다. C++11에서는 auto 키워드와 함께 후행 반환 형식에 대한decltype 형식 지정자를 사용하여 반환 형식이해당 템플릿 인수의 형식에 종속되는 함수 템플릿을 선언할 수 있다. 예를 들어, 함수 템플릿의 반환 형식이템플릿 인수의 형식에 종속되는..

STL의 vector, push_back()과 emplace_back()

push_back , emplace_back 둘의 공통점push_back , emplace_back은두 함수 모두 vector컨테이너가 주어졌을 때 한 칸을 늘리고 해당 값을 넣어주게 된다. 둘의 차이점그러나 내부적으로 동작하는 것은 조금 다른데, push_back의 경우push_back의 경우 메모리를 이동하거나 임시 객체를 이용하여임시객체가 생성되고 넣어준 뒤에 임시 객체가 삭제되는 호출이 있다.-> 복사의 개념 emplace_back의 경우대신 emplace_back은 받은 인수를 이용해 내부에서 생성자를 통한 객체 생성 후추가를 하기 때문에 임시 객체의 생성, 파괴가 없어서 push_back보다 효율적일 수 있다.-> 이동의 개념

그래서 다형성이 뭐라고요?

간단히 말하자면여러 가지 형태를 가지는 것이다. 여러 가지 형태를 가지는 것이니,오버로딩과 오버라이딩을 써서 여러 형태를 가지는 기능들을한데 묶어 분류해 놓은 것이다. 다형성은 굉장히 중요하다.그 이유는, 실제 유용성이 굉장히 많다.예를 들어 게임이라고 하면,몬스터의 종류가 많을 것이다.이런 몬스터의 부모 클래스가 되는 BaseMonster 클래스가 있을 것이고,이 클래스에 파생되는 애들도 있을 것이다.그럼 몬스터 종류가 약 20개쯤 된다고 가정해보자. 이 다른 타입들을 배열에 저장하기에는 좀 부담스럽다.귀찮고 번거로운 일이기 때문에. BaseMonster 클래스 내부에virtual 반환형 Move()  함수를 제작한다.이후 monster* 배열을 제작한 후, 이 배열 내부에 있는 moster의 move..

인라인 함수

함수를 호출할 때 필요 조건 함수는 메모리 안에 "할당"되어 있다. 함수를 호출하기 위해 필요한 단계들 변수들을 스택에 push 함수 주소로 점프 함수를 실행 호출자 함수로 다시 점프 1번 단계에서 넣어뒀던 변수들을 "pop" 함수 주소로 이동되서 써야하니까 변수를 스택에 넣어두고스택에서 가리키는 포인터를 확 뒤돌리는 것 만으로도충분히 그 값을 쓸 수 있다.하나하나 빼서 쓰지는 않다. 여기서 실제 컴퓨터 아키텍처에 따라4,5번은 순서가 뒤바뀔 수 있다. 함수의 단점뭔가 여러 단계를 거치므로 생기는 단점이 있을 것 같지 않은가? 여러 단계를 거치다보니 좀 더 느리다는 단점있다.CPU 캐시에 최적이 아닐 수도 있으면 더 느리다.모던 cpu 아키텍처에서는 더 느리다...