프로그래밍 언어/C & C++ 정리 94

람다 함수들

람다 함수들 람다도 초보자에겐 생소한데람다 함수"들"? 이라고 하니 좀 더욱 더 생소할 것이다. 지금부터 람다에 대해서 간략하게 설명하겠다. 람다(lambda) 함수(람다 표현식 또는 간단히 람다라고도 함)를 보면초보 프로그래머에게 도움이 될 수 있도록 추가된C++11의 기능이 아니라고 의심할 수 있다.람다 함수는 겉보기에도 그런 의구심을 가질 수 있기 때문이다.람다 함수의 예제이다. [&count] (int x} {count += (x % 13 == 0);}  하지만 보이는 것 만큼 미스터리한 것은 아니며특히 함수를 사용하는 STL 알고리즘에서 유용한 서비스를 제공한다.  함수 포인터, 펑크터 그리고 람다 사용법 STL 알고리즘에 정보를 반영하는 세 가지 접근법을 사용한 예제를 살펴보자.우선 이 세가지..

안정된 인터페이스 만들기

클래스는 C++의 기본 추상화 단위다.클래스를 작성할 때추상화 원칙을 적용하여 인터페이스와 구현을 최대한 분리하는 것이 좋다.특히 데이터 멤버를 private로 지정하고게더와 세더를 제공하는 것이 바람직하다.인터페이스 클래스와 구현 클래스앞서 설명한 기준과 바람직한 설계 원칙을 적용하더라도C++언어와 추상화 원칙에 잘 맞지않는 부분이 있다.C++에서는 public 인터페이스와 private(또는 protected) 데이터 멤버 및 메서드를모두 클래스 정의에 작성하기 때문에클래스 내부 구현사항이 클라이언트에 어느 정도 노출될 수밖에 없다.그러므로 비 public 메서드나 데이터 멤버를 클래스에 추가할 때마다이 클래스를 사용하는 클라이언트 코드를 매번 다시 컴파일해야 하는 단점이 있다.프로젝트가 커질수록 이..

C++ 20 중첩 클래스

중첩 클래스클래스 정의에는 데이터 멤버와 멤버 함수 뿐만 아니라 중첩 클래스, 구조체, 타입 앨리어스(typedef), 열거 타입(enum)도 선언할 수 있다.클래스 안에서 선언한 모든 것은해당 클래스의 스코프로 제한된다.public으로 선언한 멤버를 클래스 외부에서 접근할 때는ClassName::과 같이 스코프 지정 연산자를 붙여야 한다.클래스 정의 안에서 다른 클래스를 정의할 수도 있다.예를 들어 SpreadsheetCell 클래스를Spreadsheet 클래스 안에서 접근할 수 있다.그러면 Spreadsheet 클래스의 일부분이 되기 때문에이름을 간단히 cell이라고 붙여도 된다.예를 들면 다음과 같다.export class Spreadsheet{ public : class Cell ..

이동 의미론으로 이동 처리하기

객체에 이동 의미론(move semantic)을 적용하려면이동 생성자와 이동 대입 연산자를 정의해야 한다.그러면 컴파일러는 원본 객체가 임시 객체로 되어있어서연산을 수행한 후 자동으로 제거되거나사용자가 명시적으로 std::move()를 호출하여 삭제될 때앞서 정의한 이동 생성자와 이동 대입 연산자를 이용한다.즉 메모리를 비롯한 리소스의 소유권을 다른 객체로 이동시킨다.이 과정은 멤버 변수에 대한 얕은 복제와 비슷하다.또한 할당된 메모리나 다른 리소스에 대한 소유권을전환함으로써 댕글링 포인터나 메모리 누수를 방지한다.이동 생성자와 이동 대입 연산자는 원본 객체에 있는데이터 멤버를 새 객체로 이동시키기 때문에그 후 원본 객체는 정상이긴 하나 미확정된 상태로 남게 된다.흔히 이러한 원본 객체의 데이터 멤버의 ..

포인터를 사용하는 이유 토막 정리

포인터를 왜 쓰는지 알면언제 써야할지 명확하게 알고 쓸 수 있다1. 포인터 변수에 함수 주소를 저장하고 이를 호출해 상황에 따라 다르게 작동하는 코드를 만들 수 있다거나ex) 함수 포인터, 델리게이트 등2. 크기가 큰 구조체나 클래스를 매개변수로 넘겨줄 때 값 복사로 넘겨주면 상당히 무거운 작업이 되므로 이에 대한 참조(주소)만 넘겨준다던가ex) const & 같이 넘겨주는 경우3. 동적 할당한 메모리를 포인터로 가리킬 수 있다거나ex) 동적 할당 메모리 관리1,3번의 활용상속구조를 이용해서 버추얼테이블을 효율적으로 활용하는 캐스팅2번으로 상속구조 클래스 내부의 함수 얕은 참조로 경량화 가능

복제와 대입 처리하기

복제 생성자나 대입 연산자를 직접 정의하지 않으면컴파일러가 자동으로 만들어준다.이렇게 컴파일러에서 생성된 메서드는객체 타입 데이터 멤버에 대해복제 생성자와 대입 연산자를 재귀적으로 호출한다.하지만 int, double, 포인터와 같은 기본 타입에 대해서는비트 단위 복제(=bitwise copy) (또는 얕은 복제 (=shallow copy))나 대입이 적용된다.+++ Plus +++bitwise copy, shallow copy 에서는원본과 복사된 내용이 모두 메모리에 있는동일한 객체를 참조한다.+++++++++++즉, 원본 객체의 데이터 멤버를 대상 객체로단순히 복제하거나 대입만 한다.복제 생성자와 대입 연산자 정의해주기그런데 객체에 동적으로 할당한 메모리가 있으면 문제가 발생한다.이러한 문제는s라는 ..

대입 연산자

대입 연산자 정의 방법대입 연산자를 구현하는 방법은복제 생성자와 비슷하지만,몇 가지 중요한 차이점이 있다.첫째, 복제 생성자는 초기화할 때 단 한 번만 호출된다.이때 대상의 객체는 유효한 값을 가지고 있지 않다.또한 대입 연산자는 객체에 이미 할당된 값을 덮어쓸 수 있다.그러므로 객체에서 메모리를 동적할당하지 않는 한이 차이점은 크게 드러나지 않는다.이에 대한 코드 예시는 아래와 같다.MyClass myClass;myClass = myClass;대입 연산자를 구현할 때는 자기 자신을 대입하는 경우도 고려해야 하지만,고려하지 않아도 될 경우가 있다.1) 클래스 내부에 멤버가 하나고2) 이 멤버가 기본형이라면 이를 고려하지 않아도 된다.위 예제의 MyClass가 double형 하나만 가진 클래스라면이를 성립..

생성자

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

동적 메모리 다루기

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

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

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