6 min read

cpp[11] - 헤더와 STL

이론상 배열과 반복문 정도만을 사용해서 모든 문제를 해결할 수 있습니다만, 현실적으로는 그 모든것을 일일히 작성하는것이 비현실적이고 불가능한 일입니다.

그렇기에 자주 사용되는 기능을 더 뛰어난 개발자들이 미리 구현해둔 소스코드를 가져와서 사용할 것인데, 어떻게 가져올 수 있는가 에 대해서 다루어보도록 하겠습니다.

헤더파일

헤더는 웹 페이지로 치자면

화살표 친 영역에 해당하는 것으로, 웹에서는 홈페이지를 요약 제시하는 부분이기도 합니다.

C언어에서의 헤더 역시 #include 를 통해 제일 위에 적으며, 헤더파일 안에 우리가 사용 가능한 수많은 함수들의 목록이 제시되어있기 때문에 그것을 가져다 쓸 수 있는 것입니다.

대표적인 헤더파일로는

  • iostream C++ 입출력
  • stdio.h C 입출력
  • math.h 절댓값 abs()나 루트 sqrt(), 반올림 round() 등을 지원
  • stdlib.h 메모리 관리 등등 잡다한 함수들
  • algorithm 다양한 함수의 모음집
  • vector, set, map... 각 자료구조(후술) 들을 사용할 수 있게 해줌.

등등이 있는데, 이걸 일일히 외우는것이 쉽지 않기 때문에 단 하나로 축약해서 사용합니다.

bits/stdc++.h

백준 온라인 저지 채점 환경과 몇몇 컴파일러에서 지원하는 축약 구문입니다.
실제 저 헤더 파일을 열어보면 다른 수많은 헤더파일들에 대한 include 구문으로 가득 채워져 있으며, 즉 이 헤더파일 하나를 불러오는 것으로 위에서 본 기능들을 포함한 수많은 기능들을 전부 사용할 수 있게 됩니다.

실제 사용은

#include <bits/stdc++.h>
using namespace std;

int main(){
	cout << "Hello World\n";
	return 0;
}

과 같이 iostream이었던 부분을 바꿔주기만 하면 되며, 앞으로의 수많은 기능을 사용하기 위해서는 bits/stdc++.h의 사용이 필수가 됩니다.

STL

Standard Template Library, STL은 C++ 언어에서 사용할 수 있는 미리 정의된 기능들의 집합입니다. 수많은 기능들이 있는데, 그중 극히 일부를 나열해보자면

  • pair - 두개의 값을 저장, 좌표같은거 저장할때 용이.
  • vector - 크기가 가변적인 배열
  • queue - 표준적인 FIFO 큐
  • stack - 표준적인 LIFO 스택
  • lower_bound 이분탐색
  • sort 정렬
  • max min 최대최소

정도가 가장 빈도 높게 사용되는 기능들입니다.
하나같이 활용도가 높은 것들이고, 직접 구현하면 오류를 일으키기 쉽거나 직접 구현하는데 필요한 난이도가 비정상적으로 높은 경우(set 등) 을 미리 만들어서 제공하고 있습니다.

CS vs PS

CS

Computer Science의 약자로서, 컴퓨터공학과 혹은 소프트웨어 학과에서 배우게 되는 분야 전반을 통칭합니다. 어떤 알고리즘이 어떻게 구현되는지, 컴퓨터라는것은 어떻게 동작하는지를 아는것이 CS의 영역입니다.

보통 면접을 준비하는 단계에서 자주 요구되는 역량이기도 하며, 면접을 준비하시는 분들은 보통 CS스터디나 서적 등을 통해서 관련 역량을 익힙니다.

PS

Problem Solving의 약자로서, 백준 온라인 저지나 기타 코딩테스트 환경에서 요구하는 역량입니다. 어떤 알고리즘을 어떻게 사용할지, 컴퓨터라는것을 어떻게 하면 잘 써먹을지를 아는것이 PS의 영역입니다.

코딩테스트를 준비하는 단계에서 곧잘 요구되는 역량이며, 코딩테스트를 준비하시는 분들은

  • 프로그래머스
  • 백준
    등의 플랫폼을 사용, 문제를 해결하며 공부합니다.

이렇듯 두 분야는 비슷한것 같으면서도 서로 목적이 다른데, STL 라이브러리는 이중 PS에 특화되어 있습니다.

PS에서는 std::set 를 구현하는데 사용한 레드블랙 트리에 대해서 공부하지 않습니다.
std::set 을 활용하는 문제들의 적정 난이도는 Silver IV 이지만,
레드블랙 트리를 활용하는 문제는 Ruby IV에 위치하고 있습니다.

하지만 CS에서는 std::set이 레드블랙 트리를 통해 구현되었다는 사실이 중요하며, 자료구조 수업에서는 set을 어떻게 써먹을 수 있는지 보다는 레드-블랙 트리를 통한 set의 구현에 더 초점을 맞춥니다.

결론

STL 라이브러리에 구현되어 있는 수많은 기능들을 가져와 사용하면서부터, CS 지식과는 조금 더 멀어지고 PS의 방향으로 나아가게 됩니다.

앞으로의 본 시리즈 글은 STL 라이브러리에 대해 쭈욱 순회해보며
직접 구현하는 방법 과 STL을 사용하는 방법을 지속적으로 비교, STL의 활용이 앞으로 더 좋을 것임을 계속해서 알려드리는 글이 될 것입니다.

CS 정보도 나중에 시간이나 기회가 된다면 다뤄볼지도 모르겠으나
당장 우리의 목표는

알고리즘을 위한 C++ 시리즈

라는 이름에 맞게 PS에 입문하기 위한 C++ 지식을 전제로 하고 있기에, 앞으로 CS쪽을 설명하는 일은 본 시리즈에서 줄어들 예정입니다