본문 바로가기

c++

ASCII 코드표 유니코드로 프로그램을 작성하는 습관을 기르는 것이 더 좋지만 현재에도 ASCII는 많이 쓰이고 있습니다.그리고 가끔 ASCII코드가 필요할 때가 있습니다.기본적으로 대문자 A는 65, 소문자 a는 97이라는 것 정도는 알아두면 좋습니다. 그리고 97에서 65를 뺀 32값은 공백(Space)입니다.아스키 문자집합은 영미권에서 문자를 표현하기에 적합한 문자입니다.영어의 몇 개 안되는 문자를 표현하기에는 1바이트만 갖고도 충분하기 때문이죠.실제는 7비트만 사용되서 보통 128개의 문자를 사용합니다.그 중에는 제어를 위한 문자도 포함이 되어 있습니다.아스키 코드로는 다양한 문자들을 수용할 수 없기 때문에 유니코드를 사용하는 것이 좋습니다.아스키 코드를 그대로 가져가는 유니코드 방식으로 UTF-8같은 형식도 존재.. 더보기
재귀 함수 & 재귀적 함수호출(recursive function call) C언어든 C++을 공부하는 사람이라면 재귀 함수라는 용어 한 번정도는 들어봤을 것입니다.재귀적 호출은 함수가 자기 자신을 호출하는 호출 방식입니다.MIT 컴퓨터 프로그래밍 입문 교재인 SICP에는 재귀적 호출을 다음과 같이 이해하게 합니다.1. Wishful Thinking('내가 하려는 작업이 이미 있다.' 라고 생각)2. 문제를 작게 자른다.3. 더 이상 자를 수 없는 부분(base)만 처리재귀적 함수 호출을 이해하기 충분한 문장이라고 생각합니다.(프로그래밍에 대한 기본 개념을 익히는 데는 참 좋은 책인 거 같습니다.)그럼 더 자세히 알아보도록 하겠습니다.재귀 함수를 이해하는 데 가장 좋은 예는 역시 Factorial을 구하는 문제가 아닌가 싶습니다.Factorial이 널리 쓰이는 이유는 간단한 연산.. 더보기
함수 오버로딩(overloading)과 오버라이딩(overriding) C++을 배우면서 이 단어들을 들어 보지 못한 사람은 아마 없을 것입니다.단어가 비슷하기 때문에 처음 배우면 개념이 상당히 헷갈리기도 합니다.간단하게 오버로딩과 오버라이딩을 정의해보면 다음과 같습니다.오버로딩은 함수의 중복 정의, 오버라이딩은 함수의 재정의1. 오버로딩(Overloading)오버로딩은 다음과 같습니다. #include using namespace std; void func(int i) { cout 더보기
다형성과 가상함수 상속에서 중요한 사실은 부모는 자식을 가리킬 수 있다는 것입니다. 즉, 부모 클래스 B가 자식 클래스 D를 가리킬 수 있다는 말입니다.하지만 이런 방법은 부모에 없는 자식 멤버는 사라진다는 문제점이 있습니다.부모가 수용할 수 있는 것이 없기 때문에 버려지게 되는 것입니다.그리고 역으로 B = D는 될 수 있지만 D = B는 성립하지 않습니다.다음의 코드를 보도록 하겠습니다. #include using namespace std; class Base { public: void Output() { cout 더보기
C++ 클래스 상속 OOP의 주된 특징 중에 하나는 상속과 그를 통해 구현 되는 다형성입니다. 상속은 현실 세계에서 부모에서 자식에게 전해지는 것과 동일한 의미입니다. 부모 클래스의 정보는 자식에게 전해집니다. 상속은 기존의 클래스를 확장해서 사용할 수 있으며 클래스에 다형성을 부여합니다. 또한, 공통된 속성을 하나로 묶어줄 수 있다는 장점이 있습니다. 일반적으로 C++에서의 상속 클래스는 다음과 같이 표현됩니다. #include using namespace std; class Parent { private: int m_a, m_b; public: Parent(int a = 0, int b = 0) { m_a = a; m_b = b; } void printnum() { cout 더보기
Calling Convention(함수 호출 규약) 함수를 호출하는데는 몇 가지 지켜야 할 약속이 있습니다.변수를 어떻게 넘겨줄 것인가, 리턴값의 반환,인수로 전달한 것을 어떻게 정리할 것인가 등이 약속되어 있어야 합니다.호출하는 함수(caller)와 호출 당하는 함수(callee) 사이에는이 약속이 지켜져야 하는 것은 당연합니다.만약 이 약속이 안 맞춰지면 거의 100% 프로그램이 죽는다고 보면 됩니다.프로그램이 실행이 되면 프로세스라 칭해지며, 메모리가 할당이 됩니다.이렇게 메모리가 할당되면 힙 영역과 스택 영역이 존재하게 되는데,힙은 낮은 번지에서 높은 번지로 자라나고,스택은 높은 번지에서 낮은 번지로 자라난다고 합니다.힙과 스택의 사이에는 자유 영역이 존재하고이 자유영역이 겹치게 되면 메모리 부족이 발생합니다.함수를 호출하면 전달되는 인자나 내부의.. 더보기
C++ 클래스 생성자에서 초기화 리스트 사용해야하는 경우 C++에서는 클래스를 생성하는데 호출되는 생성자라는 특수한 형태의 함수가 있습니다. class A{}; 가 정의되어 있을때 생성자의 이름은 A(){}이고, 리턴 타입은 존재하지 않습니다. 생성자는 오버로딩이 가능합니다. 즉, 넘겨줄 인자의 형식을 달리해서 다양한 생성자를 둘 수 있습니다. 또한 생성자는 보통 다음과 같이 표현됩니다. A(int a, int b) { m_a = a; m_b = b }; 그런데 이런 방식 말고 초기화 리스트(Member Initialization List)를 사용해서 클래스를 초기화할 수 있습니다. 초기화 리스트는 다음과 같이 표현됩니다. A(int a, int b) : m_a(a), m_b(b) { //더 할 일 }; 되도록이면 초기화 리스트를 사용해서 초기화하는 것을 권장.. 더보기