본문 바로가기

c++

02. C++만의 특징 1

 

공부를 하는 입장이기 때문에, 내용에 오류가 있을 수 있습니다. 오류가 있다면 적극적으로 알려주시면 감사합니다!

 

C++의 iostream

  C++에서 입출력을 담당하는 표준 라이브러리인 iostream (Input/Output Stream)은 다음과 같은 기능을 제공한다.

 

  • cin 객체를 이용한 입력
  • cout 객체를 이용한 출력
  • cerr 객체를 이용한 오류 출력
  • clog 객체를 이용한 로그 출력

이 중에서 가장 많이 사용되는 것은 cin cout 이다.

 

cin 객체는 키보드로부터 입력을 받아 변수에 저장할 때 사용한다.

int num;
std::cin >> num;

 

cout 객체는 화면에 출력할 내용을 출력할 때 사용한다.

std::cout << "Hello world!" << endl;

 

endl 은 개행 문자(\r, \n 등)를 의미한다.

 

Namespace

 네임스페이스는 변수나 함수 클래스 등을 조금 더 관리 하기 쉽도록 만들어 놓은 개념이다. 만약 프로젝트가 진행되다 보면 변수의 이름들이 중복되는 것은 당연한 부분이다. 예를 들어 mode를 바꾸거나 count를 셀때, 변수의 이름이 다르면 이거대로 헷갈리고, 같으면 변수가 같이 써지기 때문에 이거대로 문제이다. 이때 필요한 부분이 네임스페이스 이다.

 

 만약 mode1의 네임스페이스 에서는 count변수를 사용하고 모드 3에서 count변수를 사용하게 된다면

namespace mode1{
  int count = 0;
  ...
}

namespace mode3{
  int count = 0;
  ...
}



mode1::count 
mode3::count

네임스페이스에 변수 혹은 함수등을 써주고 'NAMESPACE'::VALUE로써 사용할 수 있다.이로써 iostream속 있는 함수들은 std라는 네임스페이스 속에 위치한 함수라는 것을 알 수 있다.

 

 또한 네임스페이스의 경우는 아래와 같이 명시하여 사용 할 수 있다.

#include <iostream>

// std속 전부를 사용
using namespace std;

// std속 특정 부분을 사용
using std::cout;
using std::cin;

 이렇게 사용하면 std::를 안붙이고 이름을 사용할 수 있다. 내 생각에는 이런식으로 사용하면 귀찮은 것이 줄어들어 쉽지만, 나중에 내가 볼때나 깃헙에서 코드들을 볼때 어디서 오는 함수인지 헷갈리게 되어 나는 명시를 하는 편이 조금더 나은 것 같다.

 

Function Overloading

 오버로딩이란 뜻을 생각해보면 과도하게 로드하다 라는 느낌이 든다. 즉 함수를 여러번 사용할 수 있다는 느낌이 온다. 

 

 함수 오버로딩이란 함수의 parmeter만 다르다면 함수의 이름을 같게 쓸수 있다는 것이다. 이는 c언어에서는 함수이름만으로 함수를 호출하였지만, c++에서는 함수이름과 함수의 매개변수 모두 고려하여서 함수를 호출하기 때문이다. 또한 함수의 매개변수의 디폴트값을 설정할 수 있다.

 

#include <iostream>

void function(void) {
	std::cout << "function(void) call" << std::endl;
}

void function(int value = 10) {
	std::cout << "function(int value) call" << std::endl;
}

void function(int value1 , int value2) {
	std::cout << "function(int value1 , int value2) call" << std::endl;
}

int main(void) {
	function();
	function(1);
	function('a', 'b');
	function(1, 'a');
	return 0;
}

 

위에 코드를 실행하면 다음과 같은 결과 값을 가질 수 있다. 

소스 코드 실행 결과

 이상하지 않는가? 함수의 오버로딩을 잘 못 사용할 경우 다음과 같이 오류가 많이 발생 할 수 있다. 내가 찾아본 봐로는 'a와 'b'의 아스키 코드 값을 정수형으로 받아서 사용한다는데, 이는 실제 프로젝트에서 오류가 발생하지 않기 때문에 굉장히 찾기 힘든 오류이다. 따라서 함수 오버로딩은 조심해서 사용해야 한다. (함수가 오버로딩이 될수록 매개변수가 헷갈릴 수 있다!)

 

 그리고 함수의 매개 변수에 void가 들어간 것을 확인 할 수 있다. 이는 그냥 안써도 되지 않나? 라는 생각이 드는데 void가 들어가 있으면 함수에 argument가 들어가면 오류를 반환한다. 

 

Inline

마지막으로 인라인 함수의 경우 매크로 함수처럼 전처리 과정에서 실행되며 실행속도가 빨라지는 기능이다.

inline int SQUARE(int x){
  return x;
}

사용 방법도 위와 같이 매우 간단하다. 하지만 인라인 함수를 많이 사용하게 되면, 프로그램 코드가 복잡해진다. 따라서 적절하게 사용하는 것이 인라인 함수도 중요하다.

'c++' 카테고리의 다른 글

[c++] Range-based for loop (범위 기반 for 문)  (1) 2024.04.25
04. C++만의 특징 2  (0) 2024.01.14
03. C언어 복습  (0) 2024.01.04
01. C++의 구조  (0) 2024.01.03
00. 첫글!  (0) 2023.12.26