반응형

SW/C++ 87

C++11 : 구조체에 대해 알아볼까요? (개념 및 예제)

이번 포스팅에서는 C에서의 구조체를 이해하시고 있다는 가정하에 C++ 구조체에 대해 말씀드리겠습니다. 하지만 처음 보신다 해도 잘 이해하실 수 있을 것입니다. #include using namespace std; #define NAME_LEN 20#define SEX_LEN 10#define JOB_LEN 20#define CHARACTER_LEN 20 struct Chulsoo{ char name[NAME_LEN]; char sex[SEX_LEN]; char job[JOB_LEN]; char character[CHARACTER_LEN]; int age; bool marriageStatus; void introduce() { cout

SW/C++ 2019.01.03

C++11 : 람다 함수에 대해 알아볼까요? (개념 및 예제)

람다 함수는 인라인 함수처럼 복잡한 함수 호출 과정을 생략해서 시간을 절약할 수 있을 뿐만 아니라, 코드의 가독성까지 높여줍니다. 람다 함수는 C++11부터 사용할 수 있으면 고급 함수이므로 처음 배울 때는 어려울 수 있으므로 반복 학습이 필요합니다. 먼저 다음 예제를 살펴보겠습니다. 인라인과 람다 함수를 비교하였습니다. 코드가 다소 난해하다면 넘기고 읽으셔도 됩니다. #include using namespace std; class Chulsoo{public: void eat(int steakWeight); inline void eatInline(int steakWeight) { cout

SW/C++ 2019.01.02

C++11 : 인라인 함수에 대해 알아볼까요? (개념 및 예제)

인라인이라는 단어 그대로의 의미는 줄 안쪽을 의미합니다. 실제 인라인 함수의 의미와도 일맥상통합니다. 일반 함수와 호출 과정부터 비교해보며 예제를 통해 알아보겠습니다. 함수 호출은 보통 메모리상의 점프를 이용하며, 여러 가지 상태 정보 등을 저장하고 복원해야 하므로 내부적으로 복잡한 과정을 거칩니다. 인라인 함수를 사용하면 복잡한 함수 호출 과정을 단순하게 대체할 수 있습니다. 인라인 함의 문법은 다음과 같습니다. 일반 함수와 같은 형태이지만 inline 키워드로 시작하는 점이 다릅니다. inline 반환형 함수명(매개변수 목록); 인라인 함수가 앞에서 배운 일반 함수와 어떻게 다른지 다음 예제를 보면서 비교해보겠습니다. #include using namespace std; class Chulsoo{pu..

SW/C++ 2019.01.01

C++11 : 함수 오버로딩에 대해 알아볼까요? (개념 및 예제)

오버로딩은 사전 상에서는 짐을 많이 싣는다는 의미를 가지고 있습니다. 함수 오버로딩은 과연 무슨뜻일까요? 단어의 의미는 함수를 짐처럼 많이 싣는다고 생각할 수 있습니다. A 함수, B 함수, C 함수가 있다고 가정하겠습니다. 여러 함수를 하나의 장소, 즉 하나의 함수 이름에 쌓는 것을 함수 오버로딩이라고 설명할 수 있습니다. 함수 오버로딩은 객체지향의 특징 중 하나인 다형성이라는 개념과 일맥상통합니다. 함수의 다형성이란 하나의 함수를 다양한 형태로 나타내는 것을 의미합니다. 다양한 함수를 결합하는 방식에 대해 알아보겠습니다. #include using namespace std; class Chulsoo{public: void Eat(void); void Eat(int SteakNum); void Eat(..

SW/C++ 2018.12.31

C++11 : 디폴트 매개변수에 대해 알아볼까요? (Default Argument)

디폴트 매개변수는 말 그대로 기본 매개변수를 의미합니다. 함수를 정의할 때 매개변수를 넣거나 안 넣으면 되지 왜 디폴트 매개변수가 필요할까요? 그러나 실제로 프로그래밍을 하다보면 항상 넣어줘야 하는 값 마저도 귀찮아 지는 날이 옵니다. 프로그래머는 아주 현명하고 게으른 사람들이 만드는 것이라고 교수님의 말씀이 생각납니다. 다음 예제를 살펴보겠습니다. #include using namespace std; class Chulsoo{public: int Eat(int SteakNum);}; int main(void){ Chulsoo chulsoo; chulsoo.Eat(); return 0;} int Chulsoo::Eat(int SteakNum){ cout

SW/C++ 2018.12.30

C++11 : 형변환에 대해 알아볼까요?

배열의 포인터 변환배열을 포인터로 변환해 주소 이동만 가지고 효율적으로 배열의 값들을 읽거나 수정할 수 있습니다. ptr 포인터 변수에 arr배열을 대이배 자동으로 포인터 형으로 변환합니다. 다음으로 배열의 두번째 요소 값을 출력하는데, 포인터 변수 ptr의 주소를 한 칸 옮긴 값과 일치함을 알 수 있습니다. 배열의 원리가 기본적으로 포인터와 같으므로 자동으로 형변환이 되는 것입니다. #include using namespace std; int main(){ int i; int arr[10]; for (i = 0; i

SW/C++ 2018.12.26

C++11 : 포인터에 대해 알아볼까요?

포인터는 참조자와 유사하게 주소로 특정 변수나 객체를 참조할 수 있습니다.포인터변수에는 특정 변수의 주솟값이 저장됩니다.참조자와 다른 점은 가리키는 대상이 없을 수 있고 가리키는 대상을 언제든 변경할 수 있습니다.따라서 초기화할 필요도 없겠죠? 변수명 앞에 *를 선언하면 포인터 변수를 지정할 수 있습니다.정수형 변수 value를 선언하고 100으로 값을 초기화합니다.그 다음 pointerValue를 포인터 변수로 선언해 value 변수의 주소 참조 값을 저장합니다. int value = 100;int* pointerValue = &value; 다음의 예제의 결과를 생각해보세요. 그리고 한번 돌려보시고 메모리 주소를 확인해봅시다.이번 포스팅에서는 간단하게 다루겠습니다.이미 좋은 강좌들이 많으니 참고하여 다..

SW/C++ 2018.12.20

C++11 : 참조자와 한정자에 대해 알아볼까요?

참조자의 이해이번 포스팅에서는 변수의 별칭을 만드는 참조자와 포인터에 대해 알아보겠습니다.어떤 변수를 참조자로 선언하려면 다음처럼 주소 연산자(&)를 변수명 앞에 지정합니다. int peter = 185;int &seoul = peter; 이렇게 선언하면 seoul 변수는 int형으로 선언한 peter를 참조하게 되며 peter 변수의 별칭이 됩니다.참고로 cout을 이용해 변수를 그대로 출력하면 값이 출력되고 주소 연산자(&)를 변수명 앞에 붙여서(&변수명) 출력하면 해당 변수의 메모리 주소가 출력됩니다. #include using namespace std; int main(){ using salary = double; salary peter = 100.12; salary &sangwon = peter..

SW/C++ 2018.12.18

C++11 : 변수와 자료형에 대해 알아볼까요?

변수이름을 지을 때 일반적으로 지켜야 할 사항1. 의미를 파악할 수 있도록 식별할 수 있는 단어로 구성2. 일반적으로 소문자로 구성클래스 이름은 일반적으로 대문자로 시작3. 숫자는 변수 이름의 첫 글자로 사용할 수 없음4. 여러 단어를 조합할 때는 일관성 있는 규칙을 적용할 것5. 예약어는 변수 이름으로 사용할 수 없음 c++ 기본자료형C++11 표준 문서에 정리된 기본 자료형은 아래 표와 같습니다.데이터를 담을 수 있는 최소 크기를 비트 단위로 명시하고 있는데요.실제 크기는 운영체제나 cpu에 따라 달라질 수 있습니다.최대 크기는 달라질 수 있으나 최소 크기는 준수할 수 있도록 컴파일러에게 기준을 제시합니다. 자료형 의미 최소크기 short 짧은 정수 16bit int 정수 16bit long 긴 정수..

SW/C++ 2018.12.18

C++11 : 표준입출력에 대해 알아볼까요?

컴퓨터 장치는 외부 장치와 소통해야 합니다. 따라서 입력과 출력 인터페이스를 제공합니다. 컴퓨터 장치는 키보드 입력과 모니터 출력을 주요 입출력 인터페이스로 사용하고 있습니다. C++에서는 다른 프로그래밍 언어와 마찬가지로 입출력을 쉽게 할 수 있는 클래스 라이브러리를 제공하며 기본 기능으로 std 표준 라이브러리에 포함했습니다. 뿐만 아니라 파일에 읽고 쓰는 것도 중요한 입출력 인터페이스입니다. 우리는 개발을 하면서 설정 파일을 쓰며 동적으로 읽고 변경된 사항을 반영하기 때문입니다. 입출력의 시작 C++은 scanf()와 printf() 함수 대신 cin, cout 클래스를 제공합니다. 가능하면 C++에서는 scanf()와 printf() 함수를 사용하지 맙시다. 키보드와 모니터 입출력을 위한 헤더와 ..

SW/C++ 2018.12.17

[ C++ ] namespace에 대해 알아볼까요?

C++ 공부를 하면 namespace라는 문법을 자연스럽게 접합니다.하지만 정확한 의미를 모르고 using namespace std 라고 입력할 뿐입니다.화면에 자열을 출력할 때 필요한 규칙 정도로 생각하고는 합니다. 네임스페이스는 지정한 라이브러리를 사용할 수 있도록 소속을 알리는 역할을 합니다. using namespace std using 키워드로 std 라이브러리에 포함된 내용들을 사용할 것이라고 선언합니다. 따로 소속을 알리지 않아도 사용할 멤버가 std 라이브러리에 포함된 것으로 간주하게 됩니다. 만약 using 키워드로 네임스페이스를 지정하지 않고 cout을 활용한다면 어떻게 될까요?std::cout 처럼 std 라이브러리에 포함된 멤버임을 알려주어야 합니다. 다음은 네임스페이스를 활용한 간..

SW/C++ 2018.12.15

C++와 객체 지향에 대해 알아볼까요?

C++는 고성능의 세련된 문법을 보유하고 있습니다. 또 라이브러리를 제공하는 훌륭한 객체지향 언어입니다. 90년대 초반 부터 마이크로소프트와 인텔 등의 기업들과 gcc를 앞세웠습니다. 그 결과 오픈 소스 진영에서 하드웨어와 운영체제에 최적화된 컴파일러를 앞다투어 지원해왔습니다. 특히 C++11 버전에는 다양한 기능을 추가했습니다. 뿐만 아니라 개발자 편의를 제공하는 스펙들을 포함하였습니다. Boost와 같은 라이브러리를 함께 사용하면 코드를 더욱 명료하게 작성할 수 있습니다. C++ 등장배경과 표준C는 1972년 벨 연구소의 유닉스 운영체제 개발자인 데니스 리치가 고안하였습니다. 운영체제를 개발할 때 하드웨어 제어를 위해 어셈블리어를 사용하였습니다. 유지보수가 어렵고 하드웨어 의존성이 컸습니다. 대안을 ..

SW/C++ 2018.11.19

[ C++ ] atomic 개념 및 예제

뮤텍스를 통해서 전역 변수를 동기화하여 하나씩 증가시킬 수 있습니다. 그러나 일반적으로 뮤텍스와 같은 lock을 이용하여 개발하는 경우, 사용자가 잘못 사용할 때 교착 상태와 같은 문제를 야기시킬 수 있습니다. 그러므로 주의 깊게 사용해야 합니다. C++11에서는 atomic을 이용하여 뮤텍스와 같이 lock, unlock을 사용하지 않고 값을 증가시키거나 값을 감소시킬 수 있는 기능을 제공하고 있습니다. atomic : atomic 변수를 선언할 수 있는 데이터형이다.fetch_add : atomic의 멤버 함수로, 값을 증가시키는 함수입니다.fetch_sub : atomic의 멤버 함수로, 값을 감소시키는 함수입니다. aomic으로 설정된 변수에는 초기에만 값을 대입할 수 있습니다. 그 이외에는 대입..

SW/C++ 2018.11.16

[ C++ ] mutex 개념 및 예제

뮤텍스는 스레드로 동시에 여러 개를 처리할 떄 모든 스레드가 접근하는 데이터를 하나의 스레드가 먼저 사용할 수 있도록 독점적으로 자원을 가져다 사용할 수 있도록 해주는 방법입니다. 자세한 내용은 다음에 기회가 된다면 운영체제 관련 포스팅을 진행해보도록 하겠습니다. 관련 예제에 대해 알아보겠습니다. #include #include #include #include #include #include using namespace std; int value;mutex value_mutex; void increase_value(){ // 뮤텍스를 이용하여 동기화 value_mutex.lock(); value++; cout

SW/C++ 2018.11.16

[ C++ ] thread 개념 및 예제

프로그래밍에서 동시에 여러가지 동작을 하기 위해 스레드(thread)라는 개념을 도입하였습니다. 스레드는 하나의 프로그램이 마치 동시에 여러 개의 동작을 하는 것과 같은 효과를 표현하기 위해 운영체제에 도입된 개념입니다. 저는 웹 서핑을 할 때 주로 크롬을 이용합니다. 크롬은 움직이는 이미지를 보여주면서 그 동시에 음악도 들려줍니다. 휴대전화에서는 음악을 들으면서 메신저를 0할 수 있습니다. 이처럼 하나의 프로그램 안에서 동시에 여러개의 흐름이 있는 것처럼 효과를 내는 것이 바로 스레드라고 생각하시면 됩니다. 스레드는 굉장히 많이 사용되는 개념입니다. 반드시 다시 공부해나가야할 개념인 것 같습니다. 관련 개념으로 mutex와 atomic도 모두 스레드와 관련된 내용입니다. 스레드는 c++ 표준에는 자리 ..

SW/C++ 2018.11.16

[ C++ ] chrono 개념 및 예제

기존의 C++ 라이브러리는 시간을 계산하는 방법이 정밀하지 않았습니다. 최소한의 정밀하게 측정할 수 있는 시간이 10ms 정도였습니다. 다른 방법이 있었지만 C++ 표준에서 제공하는 것이 아니라 운영체제에서 제공하는 방법이었습니다. C++11에서는 나노초까지 계산할 수 있는 chrono를 추가하였습니다. #include #include using namespace std;using namespace chrono;int main(){ system_clock::time_point startTime = system_clock::now(); for (auto i = 0; i

SW/C++ 2018.11.16

[ C++ ] foward_list 개념 및 예제

foward_list 기존의 C++에서 list라는 동적인 자료를 저장하는 자료구조를 제공했습니다. list는 원소별로 이전 원소와 다음 원소를 가리키는 정보를 특별히 가지는 자료구조인 것입니다. 원소가 많아지면 원소의 개수만큼 이전 원소와 다음 원소를 가리키는 자료까지 생겨나게 됩니다. 따라서 원소의 개수가 많아지면 그만큼 추가적인 정보까지 생겨 오버헤드를 유발할 수 있습니다. 이에 착안한 foward_list는 이전 원소를 가리키지는 않고 다음 원소만 가리킴으로써 원소가 많아져도 list보다는 더 적게 추가 정보가 생기도록 하였습니다. list보다 속도가 더 빠르게 설계되어 다음 원소만시켜도 괜찮은 데이터에 맞게 설계된 자료구조입니다. #include #include using namespace st..

SW/C++ 2018.11.16
반응형