프로그램이 복잡해지고 여러 라이브러리가 포함될수록 변수, 함수, 구조체, 클래스 등이 같은 이름으로 서로 충돌할 가능성이 커진다.이러한 이름 충돌 문제를 C++에서는 네임스페이스(namespace)를 통해 해결하고 있다.C++에서는 namespace 키워드를 사용하여
사용자가 프로그램과 대화하기 위해서는 입출력을 담당하는 수단이 필요하다.C++의 모든 것은 객체로 표현되므로, 입출력을 담당하는 수단 또한 C언어의 함수와는 달리 모두 객체이다.C언어의 printf() 함수나 scanf() 함수처럼 C++에서도 iostream 헤더 파
C++에서 클래스(class)란 구조체의 상위 호환으로 이해할 수 있으며, C++의 구조체는 멤버로 함수를 포함할 수 있기에, C언어의 구조체보다 좀 더 확장된 의미를 가진다.C++에서는 이러한 클래스를 가지고 객체 지향 프로그램을 작성할 수 있다.멤버 변수를 프로퍼티
멤버 함수가 호출된 객체의 주소를 가리키는 숨겨진 포인터다.하나의 클래스에서 생성된 인스턴스들의 멤버 함수는 모든 인스턴스에 공유된다.인스턴스에서 멤버 함수를 실행할 때, 본인(인스턴스 자신)을 가리키는 상황이 생길 때가 있다.이런 상황에서 본인(인스턴스 자신)에게 접
화살표 연산자 방식으로 초기화하는 방법도 있지만, 객체 생성 시 콜론으로 초기화를 함께하는 방법도 있다.줄 수가 줄어듬객체의 생성과 초기화가 한 번에 이루어짐https://treeroad.tistory.com/entry/%EC%83%9D%EC%84%B1%EC%
42서울에서 제공하는 const 영상을 봤다. 다른 영상에 비해 듣기가 어려워서... 디테일하게 기록은 어려울 것 같다. 간단하게 기록하고, 차차 공부를 더 해나가는 것으로...!C 에서는 다음과 같은 상황에서 에러를 출력한다.그래서 다음과 같이 작성을 해줘야한다. 변
캡슐화는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다: 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.위 문구는 위키 백과에 정의된 문구다. C++에서는 접근 지정자를 통해 캡슐화
구조체와 클래스 c++에서 구조체와 클래스의 신택스(구조)는 같다. 그렇다면 뭐가 다를까? 바로 기본 접근 지정자에 차이가 있다. 아래 코드를 보자. 하나는 구조체, 하나는 클래스로 선언했다. main 문에서는 객체 생성만 한다. main.c
우리는 private 속성에 접근하고 싶고, 바꾸고 싶은 상황이 있다.이럴 때 사용자와 privite 속성 사이의 인터페이스를 이용할 수 있다.값을 지정할 때 set, 가져올 때 get 을 함수 앞에 붙여 사용한다.Sample.class.hpppublic 접근 지정자에
static 으로 변수나 함수를 선언하면, 컴파일 단계에서 메모리에 적재된다. static이 아니라면 스택 또는 힙 메모리 영역을 돌아다니며 메모리를 할당하고 해제하며 이용하겠지만, static 이기 때문에 프로그램이 실행되서 종료되기 전까지 한 메모리를 계속해서 차지
내가 느끼기에 포인터 사용은 C 와 다르지 않다고 느꼈다. 물론... 아직까지는 말이다.그래서 간단하게 예시 코드만 남긴다.Sample.class.hppSample.class.cppmain.cpp
42 서울에서 드디어 새로운 언어를 공부하기 시작했다. 이전까지는 C 로만 프로그래밍을 했었는데, 드디어 C++ 다!42서울에서 제공하는 과제를 해석해보니, 원하는 기능을 구현하고 싶다면 직접 만들기보다 라이브러리를 이용하라는 말이 있었다. C 과제를 할 때는 문자열과
현재 시간을 기록해야하는 과제가 있었다. C++ 에서 시간 관련 함수를 찾아보니 time 함수가 있었다.time 함수는 1970년 1월 1일 0시부터 현재까지 흐른 시간을 time_t 타입으로 반환을 한다.아래 코드를 보면 변수를 선언하고, std::time(&time
C 에서는 malloc 과 free 를 이용해서 메모리를 할당하고 해제한다. 물론 C++ 에서도 malloc 과 free 를 사용할 수 있다. int, float 과 같은 크기가 정해진 자료형에서는…! 하지만 class를 기반으로한 객체에 메모리를 할당한다면 문제가 생
C 의 포인터와 비교해보자. C 는 특정 스코프에서 스택이 아닌 힙 영역에 동적 할당하고, 주소값을 이용해서 조작한다.우리는 굉장히 많은 애스터리스크(\*)와 앤퍼센트(&)를 사용한다. 좋지만 실용적이진 않다. C++ 에는 비슷한 개념인 references 가 있다.쉽
ifstream 은 inputFileStream 의 줄임말로 읽어올 파일을 가리킬 때 사용한다. ofstream 은 outputFileStream 의 줄임말로 읽어올 파일을 가리킬 때 사용한다.파일을 읽어올 때는 ifstream 클래스를, 파일에 내용을 출력할 때는 o
멤버 함수를 통해 멤버 변수의 값을 넣으려고 했다. 초기화 리스트를 최대한 사용해보고 싶었는데, 오류가 발생했다!초기화 리스트를 이용한 초기화는 생성장에서만 할 수 있었다!!아래처럼 바꾼 뒤 에러가 사라졌다.
스트림이 입출력 작업이 가능한 상태인지 확인한다. 이 함수는 스트림의 오류 상태 플래그(eofbit, failbit, badbit) 가 모두 설정되지 않을 때 true 를 리턴한다.다음을 보면, ifstream 클래스로 ifs 객체을 만들면서 프로그램의 첫 번째 인자
프로그램의 매개변수로 들어오는 문자열이 어떤 건지 확인해서 문자열에 해당하는 문구를 출력하는 프로그램을 만들었다. 어떤 건지 확인하는 부분은 compare 함수를 사용했고, 문구를 출력하는 부분은 if/else 대신 switch 구문을 사용해봤다.위 신텍스를 str.c
함수 포인터가 처음 사용해봤다... 후덜덜... 요구지에 멤버 함수에 포인터를 사용하라는 이야기가 있었다..!이것 저것 검색해보고 사용 방법을 알았다. 생각보다 복잡해보였고, 생각보다 쓰기엔 복잡하지 않았다. 살짝 헷갈렸던 것은 배열로 여러가지 함수를 받아오는 포인터였
애드훅 다형성이라 부르는 것은 함수 오버로딩이라고도 한다.함수 오버로딩은 함수 이름은 같지만, 다른 매개변수를 받는 걸 의미한다. C 에서는 있을 수 없지만 C++ 에서는 가능하다.Sample.class.hpphpp 파일의 멤버 함수를 보면 이름이 같은 함수지만 매개
이 부분을 어떻게 설명해야할지 매우 어렵다. 음… 그래서 이해한대로 기록해보려고 한다!어떻게 연산자를 멤버 함수 또는 비멤버 함수로 선언하여 오버로딩 할 수 있을까? 먼저 연산자를 멤버 함수로서 사용하는 구문을 간단한 식을 통해 알아보자. 1 + 1 을 표기하는 방법은
생성자소멸자복사 생성자대입 연산자 오버로딩4 가지 멤버 함수가 있는 클래스 형태이다. 4가지가 필수는 아니다. 하지만 있으면 좋다고 한다. 왜 있어야 좋은지 차차 프로그램을 만들어보며 생각해보자.Sample.class.cppSample.class.hppmain.cpp
Cat class와 Pony class가 있다. 두 클래스는 같은 멤버 변수인 \_numberOfLegs 와 같은 멤버 함수인 run(int distance) 가 있다. 그리고 다른 멤버 함수를 각각 하나씩 갖고 있다.이때, Dog, Rabbit 같은 클래스를 새로 만
const 함수는 함수 내부에서 객체를 조작하지 못하게 방지하겠다 의미이다.근데 static 함수는 클래스에서 선언하지만, 클래스를 통해 생성한 객체에 구속되지 않는다.10개의 객체를 생성하면 static 이 아닌 멤버 함수는 10개의 메모리를 차지하지만, static
부모와 자식 사이의 다형성에 관해 알아보자. 부모와 자식에 같은 이름의 함수가 오버라이딩 된 상태에서, 어떤 타입으로 객체를 생성하는지에 따라 객체가 어떤 클래스의 멤버 함수를 호출하는지 알아보자. 여기서 말하는 타입과 객체는 다음을 말한다.Charcter 클래스와 W
추상 클래스란 뭘까? 특징은 다음과 같다.객체로 만들지 못하고 상속으로만 사용한다.추상클래스를 상속 받은 자식은 순수 가상 함수를 무조건 오버라이딩해야한다.말 그대로 추상클래스는 인스턴스화가 불가능하다. 그렇다면 어떤 걸 보고 추상클래스인지 아닌지 알 수 있을까? 추상
가상 함수https://coding-factory.tistory.com/699가상 소멸자https://musket-ade.tistory.com/entry/C-%EA%B0%80%EC%83%81-%EC%86%8C%EB%A9%B8%EC%9E%90-Virtu
가상 소멸자가 필요한 이유 1 소멸자에 virtual 옵션이 왜 필요할까? 직관적으로 설명하면, 컴파일이 안된다…! 아래 코드는 AAnimal 이라는 추상클래스와 추상클래스를 상속받는 Cat 과 Dog 클래스가 있다. main 에서 추상클래스 타입으로 Dog 객체
C 에서는 예외처리를 오직 if/else 를 사용하여 처리했다. 프로그램의 규모가 커지면서 if/else 는 분기를 나누는데 적절한 구문이 되었고, 코드 가독성 등 효율을 위해 예외처리를 위한 구문이 필요해졌다. 그래서 생긴 것이 try catch 구문이다.C++ 에는
캐스팅은 크게 2가지 방법이 있다. 아래는 C 에서 형변환을 하는 방식이다.명시적 캐스트 - explicit cast묵시적 캐스트 - implicit cast다음과 같이 () 안에 따로 cast 할 자료형 타입을 적지 않았다. 이런 방식을 묵시적 캐스트라고 한다.묵시적
C++ 에는 reinterpret cast 가 있다. 형변환의 한 종류이며 포인터 타입끼리 형변환을 할 때 사용한다.다음과 같이 포인터 또는 참조의 형태를 캐스팅할 때 reinterpret cast 를 사용한다.C 에서는 포인터 형태로 캐스팅할 때 묵시적인 경우에도 컴
const_cast const_cast는 포인터(pointer) 또는 참조형(reference)의 상수성(const)를 잠깐 제거하는데 사용한다. 예시 포인터
static cast 묵시적 다운캐스트는 당연히 안된다. 그리고 상속 관계에 있는 클래스가 아니라면, static cast 가 불가능하다.
다른 캐스트와 다른 가장 큰 특징은 실행 시간에 캐스트가 된나는 것이다. 즉, 컴파일 때 캐스트 되지 않는다는 것이다.다형성 객체에만 사용한다.downcast 할 때만 사용한다. 이때 부모와 자식 사이의 캐스팅인지 확인한다. 부모 자식 간의 캐스팅이 아니라면 dyna
explicit 는 분명한, 명백한이라는 의미가 있다. 이 키워드는 자신이 원하지 않은 형변환이 일어나지 않도록 제한한다. 즉, 묵시적 형변환을 하지 못하도록 막는다.아래 예시를 보면, explicit 키워드에 C(B const &\_) 생성자가 있다. 생성자에 exp
제네릭은 형식(정수, 문자열 등 및 사용자 정의 형식)을 메서드, 클래스 및 인터페이스에 대한 매개 변수로 허용한다.제네릭 프로그래밍은 코드의 효율성을 증가시키는 방법이다. 자료형이 정수, 문자열, 문자 등 다르더라도 여러 코드를 생성할 필요없이 하나의 코드로 모든 자
container 컨테이너? 컨테이너는 다른 개체(요소)들의 모음을 저장하는 객체이다. 컨테이너는 클래스 템플릿으로 구현되어 자료형에 큰 유연성을 제공한다. 컨테이너는 요소들의 저장 공간을 관리하고, 직접 또는 반복자를 통해 요소에 접근할 수 있는 멤버 함수를 제공한
벡터는 크기가 바뀔 수 있는 배열을 나타내는 시퀀스 컨테이너이다. 배열처럼, 벡터는 요소들을 연속적인 위치로 저장한다. 이 말은 요소들의 포인터 오프셋을 사용해서 각 요소에 접근할 수 있음을 의미한다. 하지만 배열과 다르게 벡터의 사이즈는 컨테이너에 의해 저장 공간이
스택은 컨테이너 어댑터의 한 유형으로, 요소가 컨테이너의 한쪽 끝에서만 삽입 및 추출되는 LIFO (후입선출) 으로 작동하도록 설계되어있다.스택은 특정 컨테이너 클래스의 캡슐화된 개체를 기본 컨테이너로 사용하는 클래스(vector, deque, list 등을 상속 받아
Set 은 특정 순서에 따라 고유한 요소를 저장하는 컨테이너이다. set에서 요소의 값은 이를 식별하며, 각 값은 고유해야 한다.set 요소의 값은 컨테이너 내부에서 수정될 수 없다(요소는 항상 const이다). 하지만 컨테이너에서 insert 와 remove 될 수
Map 은 특정 순서에 따라 키 값과 매핑된 값의 조합으로 형성된 요소를 저장하는 연관 컨테이너이다.map 에서, 일반적으로 키 값은 요소를 정렬하고 고유하게 식별하는데 사용되는 반면, 매핑된 값은 키와 연결된(매핑된) 콘텐츠를 저장한다. 키와 콘텐츠의 형태는 다를 수
std::allocator 클래스 템플릿은 STL 에서 사용되는 기본 할당기이다. 기본 할당자는 상태가 없다.즉, 모든 할당자는 상호 교환 가능하고 동일하게 비교되며 동일한 할당자 유형의 다른 인스턴스가 할당한 메모리를 할당 해제할 수 있다.일반적으로 동적 메모리 관리
C++에서 class와 struct의 차이점은 기본적으로 접근성이다.class 멤버 변수와 함수는 기본적으로 private이다.struct 멤버 변수와 함수는 기본적으로 public이다.아래 예시를 보자.에러가 발생하는 것을 볼 수 있다. 따라서, 위 코드에서 A 클래
SFINAE 는 Substitution failure is not an error 의 줄임말로, 대체 실패는 오류가 아니라는 것을 의미한다.즉, 템플릿 변수에 들어갈 수 없는 자료형이나 값이 들어가도 오류가 발생하지 않는 상황을 말한다.예를 들어, 아래에 오버로드된 함
이전에 enable_if 에 대해 설명을 하면서 is_integral 에 대해 잠시 언급했다.https://velog.io/@jaekim/SFINE-%EC%99%80-enableif간략히 정리하면... 템플릿의 제네릭 변수(T)에 어떤 자료형이 들어왔을 때,