프로그래밍 언어 95

생성자

명시적으로 정의하는 복사 생성자C++에서의 복사 생성자는명시적으로 정의할 수 있다.명시적으로 정의하는 2가지 방식은default로 만드는 것과delete로 삭제하는 것이 있다.복사 생성자를 삭제하면더 이상 객체를 복제하지 않는다.객체를 값으로 전달하는 것을 방지하기 위하여이러한 삭제를 정의할 수 있다.만약 클래스의 데이터가 복사 생성자가 삭제되었다면,그 클래스의 복사 생성자도 자동으로 삭제된다.초기화 리스트 생성자초기화 리스트 생성자란,std::initilalizer_list를 첫 번째 매개변수로 받고,다른 매개변수는 없거나 디폴트 값을 가진 매개변수를추가로 받는 생성자를 말한다.위임 생성자(delegating Constructor)위임 생성자를 사용하면같은 클래스의 생성자끼리 호출할 수 있다.단, 생성..

동적 메모리 다루기

메모리는 컴퓨터의 구성 요소에 속한다.C++에서는 동적 메모리를 사용자가 직접 관리해야 하므로크게메모리의 작동 과정,할당과 해제,메모리 할당에 실패한 경우이 3가지를 알아보자.메모리 작동 과정객체가 메모리에 할당 되는 방식을 머리 속에 자연스럽게그려지는 것 부터 시작해보자.네모 박스를 레이블이라 칭하고이 레이블은 메모리를 가리키는 일종의 변수의 이름이라 생각하자.이 레이블(상자)에 담긴 데이터는그 메모리에 현재 저장된 값이다.이제 객체가 메모리에 할당되는 과정을 떠올려 보았다.이러한 객체가 정적할당 되는 경우에는스택이라는 메모리 공간에 저장되어 컴파일 타임에생명주기가 결정이 된다.이러한 변수를 자동 변수라 하며스코프에 따라 자동으로 해제되므로 자동 변수라 한다.동적할당 되는 경우에는힙이라는 메모리 공간에..

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

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

인라인 함수

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

프로그램 인터페이스 예시 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가 여러 개 있을 수 있고,또 어떤 시스템은 두 가지 방식이 혼합되기도 한다.이렇게 프로세스 유닛이 여러 개 달린 프로세서를 흔히 멀티코어 프로세서라 부른다.사실 이렇게 프로세서가 여러 개 달린 시스템이 나온지 꽤 오래되었지만이제는 서버부터 개인용 컴퓨터, 심지어 스마트폰에 이르기까지 거의 모든 시스템이멀티코어 프로세서를 사용한다.이처럼 멀티코어 프로세서가 보변화되었..