Concatenating items in the array

Tags:

프로그래밍에서 배열을 다루며 종종 발생하는 문제는 배열 내용을 출력하는 것입니다. 이때는 취향에 따라 다양하게 할 수 있겠습니다만 주로 다음과 같은 식이 될 것입니다.

{1, 2, 3, 4, 5}가 있을 때,
첫번째 유형은 1, 2, 3, 4, 5라고 출력하는 것이고
두번째 유형은
1
2
3
4
5
라고 출력하는 것이죠.

그런데 이런 사소한 아이디어도 실제 코드로 옮기려면 복잡해집니다. 왜냐하면 첫번째 유형은 자료 사이에 콤마를 두번째 유형은 자료 사이에 newline 을 넣어주어야 하기 때문입니다. 즉, 모든 원소마다 콤마를 찍거나 뉴라인을 해서는 안되고 처음~끝에서 두번째까지만 콤마 혹은 newline을 찍어야합니다.

그래서,

#include
#include
#include
#include

using namespace std;

int main()
{
int items[] = { 1, 2, 3, 4, 5 };
vector vi(items, items + 5);

ostringstream oss;
copy(vi.begin(), vi.end(), ostream_iterator(oss, ” “));

string result = oss.str();

cout << "[" << result << "]" << endl; cout << "[" << result.erase(result.size() - 1) << "]" << endl; return EXIT_SUCCESS; } [/code] 와 같이 코딩하고 실행하면, [code lang="cpp"] mkseo@mkseo:~/tmp$ ./a.out [1 2 3 4 5 ] [1 2 3 4 5] mkseo@mkseo:~/tmp$ [/code] 와 같이 결과가 나옵니다. 마지막 스페이스를 일부러빼야한다는거죠. 뭐 복잡한 테크닉이 있을 수 있겠지만 그 어느것도 elegant solution에 가깝지는 않습니다. 자바의 경우엔 '그냥 짠다..'라는 느낌이 더 강한 코드밖에 못짤거라 생각됩니다. C++로 더 삽을 뜰 수도 있겠지만, 그래봤자 결론은 '그래서 내가 C++이 싫은거라고, 쳇.' 정도 밖에 안되겠죠. (그러나 더 우아하게 짜실 수 있는 분은 커멘트 부탁합니다. 언제나 멋진코드는 환영!!) 루비가 놀라운 점은 바로 이런 것에 대한 해결책입니다. [code lang="ruby"] irb(main):003:0> print “[“, [1, 2, 3, 4, 5].join(” “), “]\n”
[1 2 3 4 5]
=> nil

다른 어떤 언어를 가져와도 루비처럼 리스트 초기화와 동시에 이처럼 한줄만으로 하나의 역할을 아름답게 처리하진 못할 것입니다. 더 흥미로운점은 \n은 *NIX에선 \n, 윈도우에선 \r\n으로 알아서 출력된다는 것이죠. 사소한 것이지만 결코 사소하지 않은 루비의 편리함/아름다움입니다.

p.s. C++ 코딩을 시작한 순간 루비가 머리를 떠나지를 않는군요ㅋ