최대 IT인재 매칭 이랜서, 일본 시장 진출

C++ 연산자 가이드북 (비트 연산자부터 논리, 비교까지 총집합)

프리랜서의 모든 것

비즈니스 팁, 08 Jul 2024

c-언어-연산자


C++ 언어를 이용하여 코드를 작성하게 되면 사칙연산, 메모리 접근, 비교 등의 연산을 필요로 합니다. 이럴 때 사용하는 문법 ‘C++ 연산자’인데요, 연산자의 종류가 워낙 다양하다 보니 실수를 방지하기 위해 C++ 연산자에 대한 내용을 검색해 정확한 사용 방법을 확인하고 사용하게 됩니다.


메모리 주소에 직접 접근이 가능한 C++ 언어의 특성으로 인해 연산자 사용 방법과 그 동작을 제대로 이해하지 못하면 원하는 기능을 구현하지 못하거나, 버그를 유발하여 서비스의 중단까지 발생할 수 있습니다.


빠르고 정확하게 동작하는 C++ 애플리케이션은 모두 연산자를 정확하게 이해하고 적절하게 사용하고 있습니다. 여러분의 빠르고 정확한 개발을 도와드리기 위해 C++ 연산자에 대해 알려드리겠습니다.




C++ 연산자란?


‘C++ 연산자’는 프로그램에서 다양한 연산을 수행하기 위해 사용하는 기호 또는 키워드입니다.


 C++에는 다양한 유형의 연산자가 있으며, 각 연산자는 특정 작업을 수행하도록 설계되어 있습니다. 연산자는 변수와 상수를 조작하고, 프로그램 흐름을 제어하며, 데이터를 처리하는 데 필수적인 역할을 합니다.


연산자의 유형과 기본 문법을 통해 C++ 연산자가 코드 내에서 변수와 상수를 어떻게 조작하는지 설명드리겠습니다.




C++ 연산자의 기본 문법


c++-연산자


연산자는 C++ 코드를 작성하는 데 있어 필수적인 요소입니다. 그 이유는 모든 프로그램은 연산자를 이용한 계산을 통해 만들어지기 때문입니다. 


연산자는 C++뿐만 아니라 Java, Python 등 다양한 프로그래밍 언어들에서 연산자는 활용되고 있기 때문에 특정 언어에서의 정확한 활용과 다른 언어와의 차이를 이해하기 위해서 연산자의 활용방법은 잘 숙지해 둘 필요성이 있습니다.


이번 글에서는 C++에서 사용되는 연산자를 6가지 유형으로 나눠 설명드리려 합니다. 코드 예제와 함께 사용방법을 설명드릴 테니 각 연산자의 정확한 활용을 통해 코드 안정성을 높여 보시기 바랍니다.


산술연산자: 사칙연산과 증감을 위한 연산자


프로그래밍은 값의 계산을 통해 원하는 결과를 얻는 과정입니다. 개발자는 각종 산술 연산자를 코드로 작성하여 컴퓨터가 필요한 계산 과정을 빠르게 수행할 수 있도록 하는데요, 코드를 작성하는 데 있어 필수적인 요소이다 보니 산술 연산자는 대부분의 프로그래밍 언어에서 공통적으로 제공되고 있습니다.


C++에서 산술 연산을 위해 사용되는 연산자는 다음과 같습니다. 잘 숙지해 두셨다가 다른 언어에서도 활용해 보시기 바랍니다.



c#-연산자


   int a = 10;

   int b = 5;


   cout << "a + b = " << a + b << endl;  // 덧셈, a + b = 15

   cout << "a - b = " << a - b << endl;  // 뺄셈, a - b = 5

   cout << "a * b = " << a * b << endl;  // 곱셈, a * b = 50

   cout << "a / b = " << a / b << endl;  // 나눗셈, a / b = 2

   cout << "a % b = " << a % b << endl;  // 나머지, a % b = 0

   cout << "++a " << ++a << endl;  // 증가 11, ++a 11

   cout << "--a " << –-a << endl;  // 감소 10, --a 10



산술 연산자는 변수 또는 상수의 계산뿐만 아니라 포인터 연산에도 활용됩니다. 포인터 연산 시 주로 이동을 하게 되는데 그 주소이동의 폭은 변수 타입의 크기에 따라 결정됩니다.


아래 코드는 int 배열의 예시입니다. int형 타입의 크기가 4byte인 점을 감안하여 주소가 어떻게 출력되는지 확인해 보시기 바랍니다. 


   int i_arr[5] = { 1, 10, 100, 1000, 10000};


   cout << i_arr << endl;       // i_arr 배열의 첫 주소 출력

   cout << i_arr + 1 << endl;   // i_arr 배열의 두번째 주소 출력


   cout << *i_arr << endl;       // i_arr 배열의 첫 주소 저장 값 : 1

   cout << *(i_arr + 1) << endl; // i_arr 배열의 두번째 주소 저장 값 : 10


   // 출력 값 :

   // 0x7ffeed170690 # i_arr 배열의 첫 주소

   // 0x7ffeed170694 # 첫 주소에서 4 byte 만큼 이동 (0x7ffeed170691 이 아님)

   // 1

   // 10


C++은 잘못된 주소를 참조하는 경우 Segmentation Fault를 유발합니다. 실제 동작하는 코드에는 치명적인 실수이기 때문에 포인터 연산을 이용한 참조를 할 때에는 올바른 접근을 하고 있는지 유의해야 합니다.



할당연산자: 메모리에 값을 할당하는 연산자


C++ 프로그램이 동작할 때 변수를 계산하기 위해서는 메모리에 값이 할당되어야 합니다. 연산과 할당을 동시에 수행하는 연산자들을 확인해 보시고 코드에 적극 활용해 보세요. 가독성이 좋아져 동료들과의 협업이 수월해질 것입니다. 



C++에서 값의 할당을 위해 사용되는 연산자는 다음과 같습니다.



c-언어-비트-연산자


   a += 5;  // a = a + 5;

   cout << "a += 5 -> " << a << endl; // 출력: a += 5 -> 16


   a -= 3;  // a = a - 3;

   cout << "a -= 3 -> " << a << endl; // 출력: a -= 3 -> 13


   a *= 2;  // a = a * 2;

   cout << "a *= 2 -> " << a << endl; // 출력: a *= 2 -> 26


   a /= 4;  // a = a / 4;

   cout << "a /= 4 -> " << a << endl; // 출력: a /= 4 -> 6


   a %= 3;  // a = a % 3;

   cout << "a %= 3 -> " << a << endl; // 출력: a %= 3 -> 0




비교연산자: 변수의 값을 비교하는 연산자


C++에서 변수 또는 상수의 값을 비교하기 위해 사용하는 비교연산자의 사용방법과 예시는 다음과 같습니다. 비교 연산자는 조건문(if ~else)과 for 문 등 C++ 코드에서 분기를 만들기 위해 주로 사용됩니다.



c-언어-논리-연산자


   a = 10;

   b = 3;


   cout << (a == b) << endl;  // 같음, 출력 : 0

   cout << (a != b) << endl;  // 다름, 출력 : 1

   cout << (a > b) << endl;   // 큼, 출력 : 1

   cout << (a < b) << endl;   // 작음, 출력 : 0

   cout << (a >= b) << endl;  // 크거나 같음, 출력 : 1

   cout << (a <= b) << endl;  // 작거나 같음, 출력 : 0




논리연산자: 논리 게이트를 코드로 구현하는 논리연산자


논리 연산자는 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 판단합니다. True, False를 빠르게 계산하는 알고리즘이 필요할 때 논리연산자를 사용하면 연산 성능을 개선할 수 있습니다. 


AND 연산(&&)과 OR 연산(||)은 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다. NOT 연산자(!)는 피연산자가 하나인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽인 점을 유의하시기 바랍니다.



c-언어-연산자-우선-순위


   bool c = true;

   bool d = false;


   cout << (c && d) << endl;  // 논리 AND, 출력: 0

   cout << (c || d) << endl;  // 논리 OR,  출력: 1

   cout << (!c) << endl;      // 논리 NOT, 출력: 0




비트 연산자: 빠른 계산을 보장하는 연산자


비트 연산자는 변수가 저장하고 있는 값에 대하여 비트 연산( bitwise operation) 을 수행합니다. 비트 연산자는 산술연산자보다 더 빠르게 동작하는 것으로 알려져 있어 2진수 연산이 가능한 알고리즘에서 활용하시면 코드의 성능을 개선할 수 있습니다.



c-연산자


   a = 5;  // 0101 in binary

   b = 3;  // 0011 in binary


   cout << (a & b) << endl;  // 비트 AND, 1 (0001)

   cout << (a | b) << endl;  // 비트 OR, 7 (0111)

   cout << (a ^ b) << endl;  // 비트 XOR, 6 (0110)

   cout << (~a) << endl;     // 비트 NOT, -6 (1010)

   cout << (a << 1) << endl; // 비트 왼쪽 시프트, 10 (1010)

   cout << (a >> 1) << endl; // 비트 오른쪽 시프트, 2 (0010)




기타 연산자:  계산 외 목적으로 활용되는 기타 연산자


기타 연산자들은 C++에서 필요한 연산을 위해 제공되는 연산자로 각종 특수한 작업을 수행합니다. 데이터의 메모리 크기, 타입 변경 등 코드 구현을 위한 기능이 필요할 때 기타 연산자들을 사용합니다.



c-비트-연산자




c-언어-증감-연산자



연산자 오버로딩, 연산자를 내맘대로 구현하기


앞에서 설명드린 연산자는 변수와 상수에 대한 연산기능을 제공합니다. 그런데 객체는 어떨까요? 


C++에서 제공하는 기본 자료형들은 덧셈 연산자에 대한 동작이 구현되어 있기 때문에 숫자를 더하면 덧셈이,  문자열을 더하면 문자열이 이어지게 됩니다. 하지만 개발자가 새롭게 만든 객체에 대해서는 어떤 동작을 해야 할지 모르기 때문에 컴파일러는 빌드를 실패하게 됩니다.


이럴 때 연산자 오버 로딩을 하면 객체의 연산이 이뤄지도록 할 수 있습니다.



연산자 오버로딩 개념


연산자 오버 로딩은 클래스나 구조체에 대한 연산자 함수를 정의하여, 객체 간의 연산이 자연스럽게 이루어지도록 하는 기법입니다. 즉, 기존의 연산자가 클래스나 구조체의 객체에 대해 적절히 동작하도록 하는 것을 의미합니다.


기본적인 개념에 대해 알아보았으니 이제 연산자 오버 로딩 방법에 대해 알아보겠습니다.


연산자 오버로딩으로 객체 연산 구현


makeLatte 함수를 카페 라떼로 설명해보겠습니다. 에스프레소 객체에 우유 객체를 더해 라떼를 만들어야 하는데 컴파일 오류가 발생했었습니다.


Latte makeLatte( Milk m, Espresso e) {

   return e + m; // Compile Error!

}


이제 연산자 오버 로딩 이라는 것에 대해 알게 되었으니 실제 어떻게 사용하는지까지 코드를 통해 살펴보겠습니다. 아래는 Espresso 클래스에 덧셈 연산자를 오버 로딩하여 라떼를 만드는 코드입니다


class Espresso {

   string name;

public:

   Espresso() {

       name = "Espresso";

   }

   // 덧셈 연산자 오버로딩

   Latte operator +(const Milk &m) {

       return Latte();

   }

};


Espresso 클래스에서 덧셈 연산자를 오버 로딩하여 Milk 객체와 더해질 때 Latte를 리턴하는 연산자를 정의해 주었습니다. 이렇게 연산자를 재 정의해 줌으로써 우리가 앞서 만들었던 makeLatte 함수가 정상적으로 라떼를 만들어 주는 것을 확인할 수 있습니다.


int main() {

   Milk m;

   Espresso e;


   Latte l = makeLatte(m, e); // 에스프레소와 우유를 더해 라떼 객체를 생성

   l.print(); // 출력: Latte


   return 0;

}


연산자 오버 로딩은 C++ 기본 연산자를 이용하여 개발자가 구현 한 객체를 연산하도록 도와주는 유용한 기능입니다. 연산자 오버 로딩을 잘 활용하면 객체의 유형에 따라 새로운 기능을 정의하여 더 직관적이고 이해하기 쉬운 코드를 만들어 낼 수 있다는 장점이 있어 널리 활용되고 있습니다.



연산자 오버로딩시 주의사항


앞에서 C++ 연산자 오버 로딩을 통해 필요한 기능을 구현해 보았습니다. 하지만 모든 C++ 연산자가 위 예시와 같이 구현되지는 않습니다. 여러분이 연산자 오버 로딩을 할 때 참고하셔야 할 내용을 알려드리겠습니다.


1) 연산자 오버로딩이 불가한 연산자


C++에서 모든 연산자가 오버 로딩이 가능한 것은 아닙니다. 아래 연산자들은 오버 로딩이 불가능 한 대표적인 연산자이니 오버 로딩 구현 시 염두에 두시기 바랍니다.



c++-삼항-연산자


위 연산자 들이 오버 로딩 되지 않는 이유는 built-in 함수로서 항상 일관된 동작을 수행해야 한다거나 문법 사용에 있어 혼란을 야기하지 않기 위해 C++ 표준으로 정했기 때문입니다.



2) 멤버 함수로만 구현이 가능한 연산자


C++ 연산자 중에서 멤버 함수로 만 오버 로딩이 가능한 연산자들이 있습니다. 이런 연산자들은 객체가 존재해야 의미가 있는 연산자들로 전역함 수로 정의가 불가능합니다.


c++


지금까지 연산자 오버 로딩 시 주의해야 할 사항들을 알려드렸습니다. 개발을 하면서 연산자 오버 로딩을 활용하다 보면 논리적으로 맞지 않는 연산자까지 입맛에 맞게 구현하는 경우도 간혹 발생하는데요. 


다른 개발자들이 이해할 수 있도록 연산자 오버 로딩을 활용하는 게 좋지만 언제나 실전에서는 예외적인 상황이 발생곤 합니다. 이런 상황이 있더라도 앞에 언급한 주의사항을 인지해서 잘못된 코드를 작성하는 데 시간을 낭비하는 일이 없으면 좋겠습니다.





연산자,  C++에서는 기본 자료형이 아니어도 활용할 수 있습니다.


대부분의 프로그래밍 언어에서의 연산자는 해당 언어가 지원하는 기본 자료형에 대한 연산자를 제공하지만 C++, Python 등 몇몇 언어에서는 연산자 오버 로딩을 통해 개발자가 직접 연산자를 재정의 할 수 있도록 합니다. 


연산자 오버 로딩을 남용하는 경우 가독성을 떨어뜨리고 불필요한 버그를 유발할 수 있지만 잘 활용하면 가독성과 객체 연산에 필요한 기능을 재 정의할 수 있다는 장점이 있습니다.


C++ 연산자의 유형과 문법을 정확하게 이해하고 오버 로딩을 적극 활용하신다면 객체의 연산을 통한 다양한 기능 구현을 가독성이 좋은 코드로 작성할 수 있을 것입니다.



이랜서 추천, 개발자의 업무 효율 높여주는 효율 개선 시리즈 

▶️ [Javascript 문법] 문자열 자르기부터 복잡한 문자열 총정리!

▶️ Java Optional, 도대체 왜 쓰는거야? (Feat. NPE 피하는 방법)

▶️ 정규 표현식; 자바 정규식을 활용해서 문자열을 손쉽게 처리하는 방법


이랜서 선정, 업무 자동화를 통한 자원 활용 업그레이드 시리즈

▶️ 프롬프트 작성법, 'Chat GPT 엔지니어'는 이렇게 사용합니다.

▶️ ERP 프로그램이란? 성공적인 ERP 구축을 위한 종합가이드

▶️ [자바 대표 빌드 도구] Maven과 Gradle의 차이, 무엇이 다를까?



C++과 관련된 IT 프로젝트를 찾으시나요?

대한민국 최대 IT 인재 매칭 플랫폼 이랜서


c


이랜서는 24년의 노하우와 데이터를 활용하여 IT 전문가에게 맞춤형 프로젝트를 매칭하는 IT 인재 매칭 플랫폼입니다.


C 언어부터 C++, C#, Java, Spring, JavaScript, TypeScript, Node js, .Net, NestJS, Next js, PHP, jQuery, 데이터 전문가(DA, DBA, ETL 등), SQL 전문가, UI/UX 디자이너서비스 기획자, PM, PO, ERP, SAP 전문가 등 약 40만 명의 IT 전문 프리랜서가 이랜서를 통해 최적합 프로젝트를 매칭받고 있습니다.




최신 산업 트렌드부터 금융 IT 프로젝트까지

이랜서에서 경쟁력 있는 C++ 프로젝트를 매칭해 드립니다.


c-언어


경기 불황으로 인해 프로젝트가 줄어드는 요즘, 이랜서 회원이라면 프로젝트에 걱정이 없습니다. 프로젝트가 끝날 때가 되면 이랜서에서 지속적으로 프로젝트를 매칭해 주기 때문입니다.



“업무를 지속적으로 제공해주어 

별도의 구직활동이 불필요합니다.”


경기 불황, 약 40만 명의 IT 전문가는 

이랜서를 통해 걱정없이 프로젝트를 수주하고 있습니다.



c#


IT 전문가가 프로젝트에만 집중할 수 있게, 이랜서에는 매니저가 상주하며 IT 전문가에게 필요한 서비스를 지원합니다. 프로젝트 수주부터 일정 조율까지 1:1 매칭 서비스를 제공합니다.




경력 기술서 & 이력서 정리는 오토폴리오에게 



AI24년의 데이터를 바탕으로 

최고 수준 경력 기술서 & 이력서 작성을 도와드립니다.



c++-string



프로젝트 수주를 위한 가장 중요한 열쇠, 바로 경력 기술서이력서 입니다. 잘 쓴 경력 기술서이력서는 클라이언트에게 깊은 인상을 남겨 프로젝트 수주 확률을 높여주는데요.


이랜서 회원들은 경력 기술서 작성에 걱정 없습니다. 이랜서 독자 계발 자동 이력 서비스 ‘오토폴리오’AI 기술을 바탕으로 24년의 데이터를 바탕으로 자동으로 최고 수준의 경력 기술서와 이력서 작성을 도와줍니다. 




경기 불황에도 걱정없는 프로젝트 수주,

이랜서와 함께라면 가능합니다. 


c++-pair

이랜서는 24년의 데이터를 통해 IT 전문가에게 가장 적합한 IT 프로젝트를 추천해 드립니다. 필요한 사항이 있으면 전담 매니저에게 문의하세요. 데이터를 바탕으로 최적합 IT 프로젝트를 매칭해 드립니다.




최신 블로그