본문 바로가기
C++ Practice

01. C++ 공부

by Srff5123 2024. 1. 12.
728x90

 

위의 코드를 실행했을 프로그래밍을 시작한 사람들은 누구나 Hello world가 출력된다 라는 것을 알수있다. 그렇듯이

별로 특별한것이 없어 보이는 코드지만 프로그램의 중요한 개념을 담고 있는 코드이다.

 

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

 

1. 주석

    위의 코드에 있는 //  주석이다. C++에서는 두가지 방법으로 주석을 표기한다.

    // 슬래시 두개를 써 뒤에 오는 문자를 주석으로 처리 하는 방법과 (줄 단위로만 적용)

위의 방법과 같은 방법으로 사이에 들어있는 코드에 대한 주석을 다는 방법이있다.

 

2. 전처리 지시자

   C++ 프로그램은 세 단계를 거쳐 빌드 된다.

1. 전처리(Preprocess) 작업으로, 코드 내에 지시된 메타정보를 인식하여 자동으로 코드를 수정한다.

2. 컴파일 작업으로 소스 코드를 기계어로 번역한다.

3. 링크 작업으로, 기계어로 된 여러 오브젝트 파일을 묶어서 하나의 실행 파일로 만든다.

 

전처리 지시자는 전처리 단계에서 사용되는 것으로, # 문자로 시작한다. 위의 코드에서

#include <iostram> 구문은 전처리 지시자인 #include를 통하여 <iostream> 헤더 파일의 코드를 모두 가져와

현재 소스파일에 삽입하도록 지시하는 것이다. 

 헤더 파일은 보통 다른 파일에 구현(Define)된 다른 함수들의 함수 선언문을 담고 있어, 그 함수들을 현재 소스에 적용하는 용도로 활용된다. 함수 선언문은 함수를 호풀하는 포맷이 어떻게 되는지 알려줄 뿐, 실제 구현 코드는 따로 존재 한다.

 

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

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

 

<iostream> 헤더 파일은 c++ 제공하는 입출력 메커니즘을 가지고 있기에 이 헤더 파일을 Include하지 않으면, hello , world와 같은 메세지를 출력하는 코드 라인을 컴파일 할 수 없다.

 

C언어에서는 헤더 파일에 .h의 확장자가 붙지만 C++ 표준 라이브러리 헤더 파일에 한하여 <iostream>과 같이 확장자를 생략한다. C에서 사용하는 헤더 파일 대부분은 C++에서도 사용이 가능한데 이러한 경우에는 <stdio.h> 대신 <cstdio>와 같이

변경된 이름을 사용한다.

 

3. main() 함수

 

main() 함수는 프로그램을 실행할 경우 가장 먼저 호출되는 시작으로, int 타입 리턴값은 프로그램의 상태를 알려주는 목적으로 사요완다. main() 함수는 매개변수(parameter)없이 호출이 가능하고, 여러 개의 매개변수를 사용할수도 있다.

예시

argc는 프로그램을 실행할 때 명령줄에서 넘겨진 인자의 개수고, argv에는 각 인자의 문자열 값이 들어 있다. 프로그램의 이름도 인자에 포함되어 제일 첫번 째 인자 (argv[0])으로 취급된다. 하지만 사용해서는 안된다.)

 

4. I/O 스트림

 

출력 스트림. 출력할 데이터를 컨베이어 벨트에 밀어 넣는다고 생각하면 된다, 어떤 것이든 컨베이어 벨트에 밀어 넣으면 표준 출력 장치 또는 사용자 콘솔 화면으로 데이터가 출력된다. std::cout 외에 std::cerr이라는 출력 스트름이 있는데, 

std::cerr은 데이터를 밀어 넣으면 표준 오류 출력 장치로 데이터가 출력된다. << 연산자는 데이터를 컨베이어 벨트에 밀어 넣는 역할을 한다. 앞의 "Hello world"도 "로 묶이 문자열을 표준 출력 장치로 보내고 있는데, 꼭 문자열이 아니더라도 다양한 타입의 데이터를 << 연산자로 밀어 넣을 수 있다. 예를 들어 다음 코드는 문자열, 숫자, 문자열을 차례대로 표준 출력 장치로 보낸다. 

std::endl은 출력할 메세지의 한 줄이 끝났음을 알려준다. 출력 스트림에서는 컨베이어 벨트에 올라온 데이터를 모두 출력해서 남아 있는 데이터가 없게 만들고 줄 바 꿈을 한다.  줄바꿈을 위헤서는 /n 문자를 사용하는데 Escape Sequence다.

이스케이프 시퀀스는 따옴표로 둘러싸인 문자열에서 자유롭게 이용 가능하고, 예시로는

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

 

스트림은 입력을 받을 경우에도 사용을 하는데 간단한 방법으로는 >> 연사자로 std::cin 입력 스트림으로 사용자의 키보드 입력을 받는데 이용한다. 

 

5. 네임 스페이스 

네임스페이스(Namespace)는 코드 내에서 이름이 같은 변수명이나 함수명이 서로 충돌하는 문제는 해결하기 위해 고안되었다. 예를 들어 함수 하나는 만들었을때 그 함수와 같은 이름인 함수가 외부 라이브러리에 있을 경우가 있는 문제를 해결해준다. 특정 코드 영역에서 참조하는 이름을 어느 이름 집합에서 찾아야 하는지 범위를 제한할 수 있다. 특정 함수를 특정 네임스페이스에 종속시키려면

다음과 같이 네임스페이스 블록으로 둘러싼다. foo() 함수를 mycode라는 이름의 네임스페이스 아래에 둠으로써 다른 라이브러리에 있는 이름이 같은 함수와 충돌하는 것을 방지한다.

 

호출할 때는 함수 이름 앞에 네임스페이스와 범위 지정 연산자(Scope Resolution Operator) ::을 붙인다.

네임 스페이스 블록 안에 속한 코드에서는 명시적인 mycode:: 범위 지정 없이 같은 네임 스페이스에 있는 코드를 불러다 쓸 수 있다. 이러한 암묵적인 네임스페이스 적용은 좀 더 읽기 좋은 코드를 작성할 수 있게 해준다.

 

다음 예제에서는 using 지시자를 이용하여 네임스페이스 사용을 명시적으로 선언하여, 아래에 있는 코드에서는 스코프 설정 연산자 mycode::를 붙이지 않아도 mycode 네임스페이스에 속한 이름(함수명, 데이터 타입/ 변수명 등)을 쓸 수 있다.

 

using 지시자를 여러개 선언하면 복수의 네임스페이스를 한꺼번에 네임스페이스 지정 없이 사용 가능하다.

하지만 너무 많이 사용할 경우 어느 이름이 네임스페이스에 선언된 것인지 알기 힘들기에 적당히 조절하여 사용하는 것이 좋다.

 

cout과 endl같은 경우는 네임스페이스 std에 속한 것이기 때문에 using 지시자로 네임스페이스를 사용하면, std::를 사용하지 않고 cout과 endl을 쓸수있다.

 

using 지시자는 네임스페이스에 속한 항목을 특정해서 지정할 수도 있다. using std::cout;   << 이런식이다.

위와 같게 특정해서 지정할 경우

이런식으로 사용 가능하다.

 

6. 변수

변수는 코드 내 어디에나 선언이 가능하고, 해당 선언이 속한 블록내의 선언 이후 코드에서 그 변수에 접근할 수 있다.

변수를 선언할 때는 초깃값은 변수가 할당된 메모리 영역에 들어있던 값이 되다. 초깃값 설정이 없는 변수 선언은 버그를 유발할 수 있기 때문에 피하는 것이 좋다. 

 

C++에서 자주 사용하는 변수 타입을 정리한 예

 

이러한 여러 타입들은 캐스팅을 통하여 다른 타입으로 변환할 수 있다.

명시적인 변수 타입 캐스팅을 위해서는 세가지 방법이 있다.

첫번째는 c언어와 동일하게 캐스팅할 타입을 괄호로 명시하는 것이다.

위와 같은 식으로 캐스팅을 한 경우 소수점 이하 부분을 잘라낸 3이 된다.

어떤 상황에서는 변수 타입 캐스팅이 자동 또는 강제(coerced)로 일어날수있는데, 이러한 경우를 묵시적 캐스팅 이라고 한다. 예를 들어 short 타입 변수는 long 타입 변수로 명시적인 타입 캐스팅 없이도 자동으로 캐스팅 될 수 있다.

long타입은 short 타입과 같이 정수를 표현하면서도 그 표현 범위가 더 넓기 때문이다.

단 이러한 경우에는 자동으로 캐스팅 되기 때문에 데이터에 손실이 없는지 고려해야 한다.

 

 

728x90

'C++ Practice' 카테고리의 다른 글

C++ 부동 소수점  (0) 2024.03.15
전문가 C++공부  (0) 2024.03.01
전문가 C++ 공부  (0) 2024.02.22
02. 전문가 C++ 공부  (1) 2024.02.06
비트 연산 활용  (0) 2023.12.19