비트 연산과 시프트 연산 먼저 비트 연산을 하기 전에 비트에 대해서 알아보겠습니다. 비트(bit, binary digit)는 하나의 비트는 0이나 1의 값을 가질 수 있고, 각각은 참, 거짓 혹은 서로 배타적인 상태를 나타낸다. 이것을 간단하게 2진수로 표현하자면 0,1이 됩니다. 이런 비트가 8개 모이면 그것은 8비트고 다른 말로 바이트가 되고 , 1바이트는 문자를 처리하는 최소 단위로 다른 말로 캐릭터(Character)라고 합니다. 비트 연산의 종류 & (AND) 둘 모두 1이면 1을 반환합니다. 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 | (OR) 하나 이상 1이면 1을 반환합니다. 0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 ^ (XOR)..
프로그래밍/C++
먼저, 일반적인 코드를 보겠습니다. AA라는 클래스를 동적할당하고 사용후에 해제를 해줍니다. 프로그래머가 동적으로 생성한 객체를 별도로 해제해주어야 하는데 C++ 에서는 new와 delete를 사용해서 일일이 입력해주어야 합니다. 물론 꼼꼼한 프로그래머라면 당연히 해제도 신경써야하지만, 만약에 신경을 쓰지 못하거나 애매한 상황이 와버리면 어떨까요? 아주 극단적인 코드를 작성해 보겠습니다. 비멤버함수인 Func에서 0~9까지의 난수를 생성해서 동적할당으로 생성된 test라는 클래스를 생성하고 그 값을 리턴하고 있습니다. 그럼 여기서 Func가 호출될때마다 생성되는 AA라는 객체를 어디서 해제해 줘야 할까요? return 이전에 넣자니 값을 돌려주기전에 객체가 메모리에서 제거된 후에 쓰레기값을 리턴하게 되고..
* 생성자 - 객체가 생성될때 호출되는 함수입니다.* 소멸자 - 객체가 소멸될때 호출되는 함수입니다. 동적할당의 경우 delete에서 소멸자가 호출되고, 일반적인 객체 생성에서는 자동으로 소멸자가 호출됩니다. 자 아래와 같은 객체가 있다고 했을때 생성자와 소멸자가 없는데도 불구하고 객체는 생성, 대입 , 복사가 됩니다. 그 이유는 컴파일러가 디폴트 생성자와 디폴트 소멸자를 자동으로 생성하기 때문입니다.즉 프로그래머가 만들지 않은 생성자와 호출자와 연산자를 컴파일러가 만들어주게 되는것 입니다. [ 3번째 코드는 위 코드와 결국 같다.] 어떻게 생각해보면 참 편리한것 같습니다만...대표적으로 디폴트 복사 생성자에는 문제가 발생됩니다. 그 이유는 아래에서 확인할 수 있는데요. [ 생성자는 순차적이나 소멸자는 ..
그 동안 STL을 공부한다고 하지만 기본이 탄탄하지 못해 그냥 져냥 사용법만 간단히 사용하는 수준이었습니다.이제부터 하루에 조금씩이라도 기초부터 다시 공부를 해 나가야겠습니다. 먼저 STL에 필요한 주요 연산자 오버로딩부터 공부하겠습니다. 연산자 오버로딩이란 함수의 오버로딩과 같이 연산자도 하나의 함수라는 개념을 사용하여, 중복 정의할 수 있도록 하는 것입니다. 즉, 기본적으로 C에서 제공하는 +,-,*,=,++ 등의 연산자의 의미를 다시 부여하는 것을 말합니다. 먼저 오버로딩에 사용되는 operator 키워드 부터 알아보겠습니다. 순서대로 반환형과 Operator 키워드 , 연산자, 매개 변수 순으로 작성합니다.예시에서는 하나의 정수 제곱을 연산자 오버로딩 하였습니다. [결과] 도중에 임시 객체를 사용..
순수 가상 상속 순수 가상 함수란 반드시 재정의가 필요한 함수를 말합니다.기초 클래스에서 해당 함수의 구현의 의미가 없을 경우 사용하게 되며 기존 가상함수와는 다르게 정의가 없는 것이 특징입니다. 먼저 코드를 보겠습니다. Pet 클래스를 보면 생소한 부분이 있습니다.가상 함수 뒤에 = 0을 적어 놓은것인데요. 이 부분이 순수 가상 함수를 선언하는 부분입니다. 굳이 이렇게 사용하는 이유를 생각해보자면, 개는 멍멍 짖는다고 하고 고양이는 냐옹이라고 울때 기초 클래스인 동물 클래스는 뭐라고 울어야 할까요? 딱히 울 이유가 없습니다. 또한 내용을 정의하지 않아도 동물마다 울때의 소리가 다르기 때문에 모든 동물은 다시 해당 함수를 재정의 해야합니다. 이럴때 함수의 인터페이스만을 계승하려는 목적으로 사용하도록 순수..
각 클래스별로 상속관계를 알아봤으니 이제 함수 오버라이딩과 오버로딩에 대해서 알아보고 Virtual 함수의사용처에 대해서도 알아보도록 하겠습니다. 먼저 용어부터 확인해보도록 하겠습니다. 오버로딩 - 매게 변수의 자료형이나 매게 변수 갯수가 다른 같은 함수 이름으로 여러번 정의하는것오러다이딩 - 이미 있는 함수를 새롭게 재정의 하는 것.(클래스 상속간에 기초 클래스에 정의된 함수를 같은 이름으로 유도 클래스에서 재정의 하는 것) 처음에 클래스간의 함수 이름이 다를 경우 이를 딱히 고민하지 않아도 되지만, Render 나 init , release 같은 함수가 공용되게 사용되거나 같은 함수명을 사용하는 경우라면 필요하게 됩니다. 그럼 먼저 코드를 확인해보겠습니다. 1. 상속 오버라이딩 outText라는 함수..
클래스를 사용하면서 객체 포인터를 많이 사용하게 된다. (클래스를 가리키는 포인터)이에 해당 관계에 대해서 소스를 작성하면서 알아보자. [ IS-A 관계 ] 이전에 IS-A 관계를 떠올려 보면 A의 객체는 B이고 B의 객체는 C이다.즉 C는 A의 객체 이다. 그럼 아래와 같은 코드는 정상적으로 작동될 것이다. [결과] a,b,c가 A 클래스 포인터이기 때문에 A 클래스의 객체를 가르켜도 무방하다.즉, B,C의 클래스를 가르켜도 무방하다. 또한 같은 A클래스의 포인터 이지만 각기 다른 클래스 객체를 가리키므로 메모리 주소는 각기 상이하다. 그럼 B 클래스 포인터를 A 객체를 가르키면 어떻게 될까? 위에서도 이야기 했지만 IS-A 관계에서는 B는 A다 라는 말은 성립되지만, A는 B다 라는것은 성립되지 않는..
상속은 유도 클래스는 기초 클래스가 지니는 모든것을 지니고, 또한 유도 클래스만의 특성이 정해진다.이 처럼 클래스의 상속에서는 하나의 베이스가 되는 기초 클래스와 유도 클래스만의 관계가 성립된다. 그렇다면 적절한 상속 관계란 무엇이 있을까? * IS-A 관계 IS-A 관계란 영어에서 is a( "~ 이다.") 라는것으로 상속관계에서 유도 클래스와 기초 클래스와의 적저한 관계를 표현하는 것을 말한다. (상속의 깊이를 더하기 위해서..) Human Is a Tom [사람은 톰이다 (X)] -> 사람이 모두 톰이 될 수는 없다.Tom Is a Human [톰은 사람이다 (O)] -> 톰은 사람이 될 수 있다(사람이다) 위 처럼 각 클래스간에 일종의 상위 개념으로 이해하면 될 것이다.다른 예로는 철수는 아버지의..