프로그래밍 공부
작성일
2024. 1. 3. 19:51
작성자
WDmil
728x90

1.1.1 C++ 맛보기 - Hello, World

#include <iostream>
int main()
{
	std::cout << "Hello, World!" << std::endl;
    return 0;
}

위 코드의 기본개념을 이해해보자.

 

위 코드의 각 항목은, 다음과 같은 정보를 담고있다.

  • 주석
  • 전처리 지시자
  • main() 함수
  • I/O스트림

주석

주석은, 프로그래머를 위한 것 으로, 컴파일러는 주석을 무시한다.

 

C++에서는 두가지 방법으로 주석을 표기한다. 하나는 슬래시 두개를 벼처써 종류에 상관없이 그 뒤에 오는 모든 문자를 주석으로 처리하는 방법,

// ~

/**/로 끝내는 구간 자체를 줄바꿈을 포함해서 모두 주석으로 처리하는 여러줄 주석 작성 방법. 이 있다.

 

/*  */


전처리 지시자

C++프로그램은 전처리, 컴파일, 링크 단계로 총 세단계를 거쳐서 빌드된다.

 

전처리

코드 내에 지시된 메타정보를 인식하여, 자동으로 코드를 수정한다.

 

컴파일

소스코드를 기계어로 번역한다.

 

링크

기계어로 된 여러 오브젝트 파일을 하나로 묶어서 실행 파일로 만든다.

 

위의 세단계를 거쳐서 빌드된다.


전처리 지시자는 전처리 단계에서 사용되는 것으로, #으로 코드를 시작하게 된다.

#include < iostream > 을 예로 들어 이야기 하면,

 

#include를 통해, <iostream>헤더파일의 코드를 모두 가져와서 현재 소스파일에 삽입하도록 지시하는것 이다.

 

헤더파일은 보통 다른 파일에 구현(define)된 함수들의 함수 선언(declare)문을 담고 있어서 그 함수들을 현재 소스에서 참조하여 호출할 수 있도록 컴파일러에 정보를 알려주는 용도로 사용한다.

 

함수 선언문은 함수를 호출하는 포맷이 어떻게 되는지 알려줄 뿐 이고, 해당 함수의 실제 구현 코드는 따로 존재한다.

 

일반적으로 C++에서는 선언부가 헤더파일이라 부르는 .h확장자 파일에 들어가고, 정의부는 소스 파일 이라 부르는 .cpp확장자 파일에 들어간다.

 

단, C#이나 자바 같은 다른 프로그래밍 언어는 선언부와 정의부를 구분하지 않는 경우가 많다.

 

<iostream> 헤더 파일은 C++에서 제공하는 입출력 메커니즘을 담고 있기 때문에 이 헤더파일을 인클루드 하지 않으면, Hello, World 메시지를 출력하는 코드 라인을 컴파일 하지 못하게 된다.

전처리 지시자 기능 용도
#include [ file ] 지정한 file의 내용을 현재 소스 파일에서 해당 지시자가 위치한곳에 삽입한다. 대부분 다른 곳에 정의된 함수를 이용하기 위해 함수가 선언된 헤더파일을 삽입하는데 이용된다.
#define [ key] [ value ] 지시자 이후에 뒤따르는 모든 key 키워드를 value로 치환한다. C에서는 상수나 매크로를 정의하는데 이용된다. C++에서는 좀 더 개선된 상수 정의 방법을 제공하고 매크로는 여러 가지 부작용이 있기 때문에 권장하지 않는다.
#ifdef [ key ]
#end if
특정 키워드가 #define 문이나 컴파일러 옵션으로 정의되어 있는지 여부에 따라 ifdef( if defined, 즉 , 정의되어 있으면) 또는 ifndef(if not defined, 즉, 정의되어 있지 않다면) 로 둘러싸인 코드블록 을 활성화/ 비활성화 한다. 보통은 헤더파일 인클루드 시 중복된 인클루드를 막기 위한 용도로 사용된다. 헤더파일의 시작과 끝을 #ifndef ... #endif 지시자로 둘러싸면 특정 소스 내에서 같은 헤더파일을 여러번 인클루드 하더라도 최초 한번만 인클루드 된다.
#pragma [ xyz ] xyz 부분은 컴파일러마다 다른데, 언어 차원에서 표준화되지 않고 특정 종류의 컴파일러에서만 지원되는 전처리 기능을 이용할 때 사용된다. 중복 인클루드를 편하게 막아내는데 사용된다.

 

전처리 지시자를 사용하여 헤더파일의 중복 인클루드를 막는경우는 다음과 같다.

 

#ifndef MYHEADER_H
#define MYHEADER_H
// ... 헤더 파일 내용
#endif​

main() 함수

main () 함수는 프로그램을 실행할 때 가장 먼저 호출되는 시작점이다. main() 함수의 int 타입 리턴값은 프로그램의 상태를 알려주는 목적으로 사용한다.

 

main() 함수는 파라미터 없이 호출될 수도 있고 다음과 같이 두 개의 파라미터를 사용할 수도 있다.

int main(int argc, char* argv[])

argc는 프로그램을 실행할 때 명령줄에서 넘겨진 인자의 개수 이고, argv에는 각 인자의 문자열 값이 들어간다.

 

프로그램의 이름도 인자에 포함되어서 제일 첫 번째 인자(argv[0])으로 취급된다.

 


I/O 스트림

 

I/O스트림은 인풋 아웃풋 스트림 으로

 

출력 스트림은 출력할 데이터를 컨베이어 벨트에 밀어넣는 다고 생각하면 된다.

 

어떤 것이든 컨베이어 벨트에 밀어넣으면 표준 출력 장치 또는 사용자 콘솔 화면으로 데이터가 출력된다.

std::cout , std::cerr이라는 출력스트림이 있는데, std::cerr은, 표준 오류 출력 장치로 데이터가 출력된다.

 

<< 연산자는 데이터를 컨베이어 벨트에 밀어넣는데 사용된다.

 

Hello, World 에서는 따옴표로 묶인 문자열을 표준 출력 장치로 보내고 있는데, 꼭 문자열이 아니더라도 다양한 타입의 데이터를 << 연산자로 밀어넣을 수 있다.

 

std::cout << "There are " << 219 << " ways I love you. " << std::endl;

위 코드는 각 항목을 << 연산자를 통해 순서대로 표준 출력 장치로 보내는 코드이다.

 

std::endl은 출력 메시지의 한 줄이 끝났음을 알려준다. 출력 스트림에서 std::endl을 만나면, 컨베이어 벨트에 올라온 데이터를 모두 출력하여 남아있는 데이터가 없게 만들고. 줄바꿈을 한다.

 

줄바꿈을 위해 \n 문자를 사용할 수도 있다. \n문자는 줄바꿈을 의미하는 이스케이프 시퀸스(escape sequence) 이다.

 

이스케이프 시퀸스는 따옴표로 둘러싸인 문자열에서 자유롭게 사용할 수 있다.

 

\n 줄 바꿈
\r 캐리지 리턴(출력 커서를 처음으로 옮김)
\t 탭 문자
\\ 역슬래시 문자
\" 따옴표

 

스트림은 사용자 입력을 받을 때 에도 이용할 수 있다.

 

가장 간단한 방법은 >> 연산자를 입력 스트림에 적용하는 것 이다.

 

std::cin 입력 스트림은 키보드 입력을 받는 데 이용할 수 있다.

 

사용자 입력을 받을 때는 입력받는 데이터가 어떤 타입인지 알 수 없음으로 까다로운 면이 있다.

 


 

728x90