본문 바로가기

Cpp

(35)
객체 사용 전 객체 초기화 C++ 에서 객체 초기화는 상황에 따라 다른 모습을 보인다.int x;는 확실히 0으로 초기화된다. 그런데class Point{int x,y;};여기서는 초기화가 보장 될 수 도 있고 아닐 수 있다..... 일단 C 부분만을 기준으로 "초기화에 런타임 비용이 소모 될 가능성이 있다면 초기화가 보장되지 않는다." 여기서 중요한 것은 C 가 아닌 부분이 겹치면 상황이 애매해진다는 것이다. 이것은 C 배열은 원소가 확실히 초기화된다는 보장이 없지만 vector(STL) 는 보장해준다   따라서 생성 시 혹은 객체의 사용 전 가능한 항상 초기화하는 것이다. 참고로 생성자에서 초기화 리스트를 사용하지 않는다면 그것은 대입 방식이다, class PhoneNumber { // PhoneNumber 클래스 정의..
const 사용 const 를 사용하는 것으로 특정 값을 불변 시킬 수 있고 컴파일러 및 다른 프로그래머들은 이를 지켜 줄 수 있다. 여기서 const 를 포인터 사용한다면 왼쪽을 기준으로 하고 오른쪽을 본다const int* // 값만 상수int* const // 포인터만 상수 그러니const int operator*(....)const int* 와 int const * 는 같다. STL 의 반복자 또한, * 를 기반으로 만들어 졌기 때문에 주소 변경을 원하지 않을시에 const_iterator 를 사용할 수 있다. const 함수 const operator 를 이용한 예방const int operator*(..,..) 다음과 같이 반환형을 수정되지 않도록 막으면if(a*b=c)와 같이 == 을  = 로 잘못쓰는 실..
#define 대신 const, enum, inline 을 생각 할 것 #define 매크로를 사용하면 선행 처리되면서 기호 테이블에 들어가지 않으며 컴파일러에게도 보이지 않는다. 그래서 디버깅 시에 찾기 어려울 수도 있다 매크로 이름이 아닌 값으로 에러 메시지가 나올 것 이기 때문에 확실히 파악하기 어려울 수 있다. 매크로 대신 상수를 쓸 수 있다.const double Aa = 1.653; const 이기 때문에 컴파일러의 눈에 보이고 기호 테이블에도 들어간다. 매크로 사용시 코드에 매크로 이름이 나타나면 선행 처리로 값으로 바뀌면서 목적 코드 안에 값 등장 횟수만큼 사본이 들어간다. 다만, 상수 타입 사용시에는 사본이 딱 한 번 생성된다. #define 대신 상수를 사용한다면 조심해야 할 것1. 상수 포인터를 사용할 경우 : 상수 포인터를 쓴다면 안정적으로 const ..
C++의 하위 언어 C++ 을 여러 언어들의 연합체로 생각 할 수 있다.다음은 C++ 을 이루는 하위 언어이다. C- C++ 은 C 를 기본으로 하고 있다. 따라서 C++ 로 C 의 규칙 만을 이용한 프로그래밍이 가능하다. 당연히 효율적인 프로그래밍이 힘들다. 객체지향 C++'클래스를 쓰는 C++' 이 여기에 해당된다.클래스, 캡슐, 상속, 다형, 추상, 가상함수 등등의 개념이 포함된다 프로그래밍 방식이다. 객체 지향의 설계 규칙은 여기에 해당된다. 템플릿 C++C++ 의 일반화 프로그래밍 이다. 이는 사용자조차 자료형을 파악하지 않고 일반적으로 사용하는 프로그래밍이다.템플릿을 사용하면 높은 확장성 및 재사용성을 보장 받을 수 있다. STL템플릿 라이브러리. STL은 컨테이너, 반복자, 알고리즘 과 함수 객체를 사용하기 때..
바이트 패딩 바이트 패딩은 메모리 정렬 요구사항을 충족시키기 위해 구조체나 클래스의 멤버 사이에 추가적인 바이트가 삽입되는 현상이다. 데이터의 효율적인 접근을 도와주는 역할을 하기 때문에 접근에 대해서 성능 최적화 역할을 한다. 메모리 정렬이란?CPU는 특정 바이트가지의 데이터를 읽고 쓰는 것이 효율적이다.만약 4바이트 정렬이라면 필요한 데이터 타입은 메모리에서 4의 배수 주소에서 시작해야 최적의 성능을 제공한다. 정렬되지 않은 주소의 데이터를 읽고 쓰면 CPU가 추가 작업을 해야하는 단점이 생긴다. 바이트 패딩의 상황구조체 또는 클래스에서 멤버 변수를 나란히 배치할 때, 각 변수는 자신의 데이터 정렬 요구사항에 맞게 배치되야 한다.이때, 정렬을 맞추기 위한 패딩 바이트가 삽입된다. class WhatIsPaddin..
RAII란? RAII (Resource Acquisition Is Initialization) C++의 메모리 관리 개념. 객체가 생성 될 때 생성자를 사용하고, 해제 할 때 소멸자를 사용하는 등의 C++ 에서의 자원 관리 방식들을 통칭하여 이르는 개념. 앉넌하게 자원을 관리하기 위해서 사용되어진다.RAII 로 불릴수있는 자원 관리 방식생성자 소멸자 : 자원 획득시 생성자를, 해제 시 소멸자를 이용한다. 스마트 포인터 : unique 포인터 , shared 포인터는 생성자에서 메모리를 할당하고, 소멸자에서 자동으로 메모리를 해제하기 때문에 메모리 누수를 방지.참조 카운팅 : shared 포인터에서 사용하는 메모리 관리 방식. 객체를 참조하는 포인터의 갯수를 카운팅하며 카운팅이 0 이되면 소멸자에서 자동으로 메모리를 ..
해시 테이블 해시 테이블은 Key와 Value 로 데이터를 저장하는 자료구조 입니다. 해시 테이블은 해시 함수를 사용합니다. 해시 함수를 이용하여 key 값을 해시 value 를 생성합니다. 생성된 해시 value 를 배열의 인덱스로 하여 그 공간에 value 를 저장합니다. 값을 찾을 때에도 key 값을 해시함수에 넣어 해시 value 를 찾고 배열의 인덱스로 하여 value 를 찾습니다.만약 해시 함수에 의해 나오는 해시 value 값이 같다면 충돌이 생기며,1. 체이닝2. 오픈 어드레스를 이용하여 해결합니다. 1. 체이닝 : 해시 테이블의 각 인덱스의 저장공간을 리스트로 만들어 충돌이 발생할 때 리스트를 이용하여 연결합니다.2. 오픈 어드레스 : 충돌이 일어나면 다른 비어있는 공간을 찾고 저장합니다. 해시 테이..
객체지향의 4대 특성 객체지향의 4대 특징으로는 추상화, 캡슐화,상속, 다형성이 있습니다. 추상화 : 객체들의 공통된 속성과 행동들을 묶어 표현하는 개념입니다. 공통된 기능과 속성만 표현하기 때문에 클래스를 단순화하고 세부적인 내용은 오버라이딩하여 표현합니다. 캡슐화 : 캡슐화는 낮은 결합도를 유지 할 수 있도록 설계하는 객체지향 프로그래밍의 한 특징입니다. 변수와 메소드를 클래스라는 캡슐에 넣어서 분류하여 재활용이 원할하게 하며 접근제한자를 통해 정보은닉을 할 수 있습니다.외부에서 객체의 데이터를 직접 접근하지 못하게 하고, 메서드를 통해서만 접근하도록 제한합니다 상속 : 한 클래스가 가진 속성과 기능을 하위 클래스에게 물려주는 것을 의미합니다. 파생 클래스는 기반 클래스의 특정 속성과 기능을 사용할 수 있습니다. 계층적 ..