◆헤더 파일
◆헤더 파일에 넣는 것
- 함수 원형
- #define 이나 const를 사용하여 정의하는 기호 상수
- 구조체 선언
- 클래스 선언
- 템플릿 선언
- 인라인 함수
◆헤더 파일 사용시
#include "header.h"
◆헤더 파일의 관리
- 헤더 파일을 어떤 파일에 포함시킬 때에는 단 한번만 포함시켜야 한다.
- #ifndef (if not defined)를 사용하여 이를 예방하자.
#ifndef HEADER_H_
...
#endif
- header.h 가 선언되었다면 #endif로 넘어간다.
◆번역 단위(translation unit)
▷파일의 C++ 표준을 위해 사용할 명칭
◆◆기억 존속 시간, 사용 범위, 링크
◆C++가 데이터를 저장하는 4가지 유형 (시간 차이)
●자동 기억 존속 시간(automatic storage duration)
- 함수 매개변수를 포함하여, 함수 정의 안에 선언된 변수는 자동 기억 존속 시간을 가진다. 그들은 프로그램 실행이 그들을 정의하고 있는 함수나 블록 안으로 들어갈 때 생성된다. 그리고 그들에게 대입된 메모리는, 프로그램 실행이 해당 함수나 블록을 떠날 때 해제된다. C++는 두 종류의 자동 변수를 가진다.
●정적 기억 존속 시간(static storage duration)
- 함수 정의의 바깥에서 정의된 변수 또는 키워드 static을 사용하여 정의된 변수는, 정적 기억 존속 시간(static storage duration)을 가진다. 그들은 프로그램이 실행되는 전체 시간 동안 존속한다. C++는 세 종류의 정적 변수를 가진다.
●쓰레드 존속 시간(Thread Storage Duration)
- 요즘은 멀티코어 프로세서가 많이 사용되는데, 이것은 여러 작업을 동시에 처리할 수 있는 CPU를 의미한다. 멀티코어 프로세서를 사용하여 연산작업을 쓰레드(thread) 단위로 쪼개서 처리할 수 있다.
●동적 기억 존속 시간(dynamic storage duration)
- new 연산자를 사용하여 대입된 메모리는, delete 연산자로 해제되거나 프로그램이 종료할 때까지, 둘 중 어느 것이 먼저 일어날 때까지 존속한다. 이 메모리는 동적 기억 존속 시간을 가진다. 때로는 이 메모리를 자유 공간(free store)이라 부른다.
◆C++ 변수의 사용 범위
●지역 사용 범위(local scope)(= 블록 사용 범위, block scope)
- 선언된 괄호 안에서만 알려지며, 덮어쓸 수 있다.
●전역 사용 범위(global scope)(= 파일 사용 범위, file scope)
- 정의된 지점부터 파일 전체에 걸쳐 알려진다.
●함수 원형 사용 범위(function prototype scope)(함수 안에 선언된 멤버)
- 함수의 매개변수 리스트를 둘러싸고 있는 괄호 안에만
●클래스 사용 범위(class scope)(클래스 안에 선언된 멤버)
●이름 공간 사용 범위(namespace scope)
◆C++ 함수의 사용 범위
- 전역 사용 범위(global scope)(= 파일 사용 범위, file scope)
- 클래스 사용 범위(class scope)(클래스 안에 선언된 멤버)
- 이름 공간 사용 범위(namespace scope)
◆C++ 기억 공간의 속성
- 기억 존속 시간
- 사용 범위
- 링크
◆자동 변수
- 함수 매개변수와, 함수 안에서 선언된 변수는 기본적으로 자동 기억 존속 시간을 가진다.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>링크란?
◆◆정적 변수
●프로그램이 실행되는 전체 시간동안 존속한다.
●컴파일러가 모든 정적 변수를 수용할 수 있을 만큼 넉넉한 크기가 정해진 메모리 블록을 대입한다.
●초기화 되지 않은 모든 정적 변수들은 모든 비트가 0으로 세팅된다
- 이것을 제로 초기화(zero-initialzed)라고 한다.
●C++은 세 가지 유형의 링크(외부 링크, 내부 링크, 링크 없음)를 가지는 정적변수를 제공한다.
◆세가지 유형의 링크 정적변수들
●외부 링크를 가지는 정적변수
- 어떠한 블록에도 속하지 않는 바깥에 선언
- 프로그램을 구성하는 다른 파일에서도 사용이 가능하다.
#include <iostream>
int outLink;
int main(){
}
●내부 링크를 가지는 정적변수
- 어떠한 블록에도 속하지 않는 바깥에 선언하되 static(기억 공간 제한자)를 선언 앞에 붙인다.
- 이 코드가 담겨 있는 파일에서만 사용 가능하다.
#include <iostream>
static int inLink;
int main(){
}
●링크가 없는 정적변수
- static이라는 제한자를 사용하여 블록 안에서 선언한다.
#include <iostream>
int main(){
static int noLink;
}
◆정적 변수 초기화
- 정적 변수는 제로 초기화될 수 있고 상수 표현 초기화될 수 있으며, 동적 초기화될 수 있다.
- 제로 초기화와 상수 표현 초기화를 합해서 정적 초기화라고 부른다.
◆정적 존속 시간, 외부 링크
- 외부 변수는 정적 저장 기간의 파일 범위를 가진다.
◆C++의 변수의 단일 정의 원칙
●외부 변수는 그 변수를 사용하는 모든 각각의 파일에서 선언되어야 한다.
●이를 위해 두종류의 변수 선언을 한다.
- 선언을 정의 하는 것, 대입되는 변수에 대하여 저장소를 제공한다.
int outLine=0; //정의 outLine은 1
- 참조 선언 혹은 단순히 선언하는 것, 기존의 변수를 의미함으로 저장소를 생성하지는 않는다.
extern int outLink1 = 1; //outLink1은 1이다를 정의한다.
extern int outLink2; //다른 파일에 정의된 전역변수 outLink2를 사용할 수 있게 불러온다.
◆사용 범위 결정 연산자(scope resolution operator)(::)
- ::를 변수 이름 앞에 붙이면 그 변수의 전역 버전을 사용하라는 뜻이 된다.
◆전역과 지역(global과 local)
- 데이터의 무결성을 위해 지역 변수를 필요한 함수에만 데이터를 전달하는 것이 좋다.
- 전역 변수는 여러 함수가 공통으로 사용하는 데이터 블록을 만들기 좋다.
- 특히 상수 데이터를 나타내는데에 유용하다.
◆정적 존속 시간, 내부 링크
- 파일 사용 범위에 있는 변수에 static 제한자를 적용하면 내부 링크를 갖게 된다.
- 전역 변수는 프로그램의 끝까지 존속하기 때문에 이름이 같으면 안된다.
- 그래서 그 파일에서만 이용하기 위해 static 제한자를 사용한다.
◆정적 기억 존속 시간, 링크 없음
- 지역 변수를 위한 정적 기억 존속 시간
◆◆제한자
◆기억 공간 제한자(storage class specifer)
- register : 레지스터
- static :내부 링크 지역 변수를 위한 정적 기억 존속 시간
- extern : 참조 선언
- thread_local : 변수를 포함하는 쓰레드의 존속시간, static과 extern과 같이 쓸 수 있다.
- mutable : 구조체나 클래스에 const가 선언되어 있다 하더라도, 그 구조체의 특정 맴버를 변경할 수 있음을 나타낸다.
◆Cv-제한자
- const : 메모리가 초기화 된 후 프로그램이 그 메모리를 변경할 수 없다.
- volatile : 프로그램 코드가 변경하지 않더라도 특정 메모리 위치에 있는 값이 변경될 수 있다.(하드웨어)
◆const에 대한 보충
- C++에는 const 전역 변수는 내부 링크를 갖도록 디폴트로 내정된다.
- 외부 링크 참조의 const 변수는 extern 키워드를 사용해야 한다.
extern const int first;
extern const int * second;
- 아래와 같이 초기화를 할 경우 디폴트로 되어 있는 내부 링크를 가릴 수 있다.
extern const states = 50;
- 함수나 블록 안에서 const를 선언하면, 그것은 블록 사용 범위를 가진다.
◆함수와 링크
- 기본적으로 함수는 외부 링크를 가진다.
- static을 사용해 함수의 사용 범위를 하나의 파일로 제한할 수 있다.
static int function(int x);
- 변수와 마찬가지로, 정적 함수는 그 정적 선언이 들어있는 파일에서 외부 정의를 무시한다.
◆C++ 언어 링크(C++ language linkage)
●컴파일러가 쓰기 위해 행하는 이름 변환
- sqaure(int,double) -> _squaure_i_d_
◆사용할 프로토콜 알려 주기
extern "C" void spiff(int); //C 프로토콜을 사용하여 이름을 찾는다.
extern void void spiff(int); //C++ 프로토콜을 사용하여 이름을 찾는다.
extern "C++" void spiff(int); //C++ 프로토콜을 사용하여 이름을 찾는다.
◆외부 링크로 포인터를 선언한다면
- (함수 같은 짧은)존속 시간이 다되어 정의한 포인터가 없어지더라도, 힙에 내용이 저장되어 있다면, 다른 파일에서 포인터로 이를 사용할 수 있다.
◆구조체 초기화
- 괄호를 이용해 리스트 초기화를 사용한다.
struct student{
char[10] name,
int age};
student * nami = new student {"nami\n", 25};
◆new : 연산자들, 함수들, 대체 함수들
- 이 두가지 경우는 같다.
int * pi = new int;
int * pi = new(sizeof(int));
int * pa = new int[40];
int * pa = new (40*sizeof(int));
◆위치 지정 new 연산자
- 사용할 위치를 사용자가 지정할 수 있는 위치 지정 연산자이다.
- new 헤더 파일을 포함시켜야 한다.
int buffer1;
int buffer2[20];
int main(){
//일반 new 연산자
int * p1 = new int {0}; //힙에 0을 넣는다.
int * p2 = new int[20]; //힙에 int 배열을 넣는다.
//위치 지정 new 연산자
int * p3 = (buffer1) int; //buffer1에 0을 넣는다.
int * p4 = (buffer2) int[20]; //buffer2에 int 배열을 넣는다.
}
◆◆구식 C++ 이름 공간
●선언 영역(declarative region)
- 선언을 할 수 있는 영역
●잠재 사용 범위(potential scope)
- 어떤 변수의 잠재 사용 범위는, 그 변수를 선언한 지점부터 선언 영역의 끝까지이다.
- 하지만 잠재 사용 범위에서 변수가 보이지 않을 수 있다.
- 내포된 선언 영역에 같은 이름으로 선언된 또 다른 변수에 의해 앞이 가려질 수 있다.
◆새로운 이름 공간 기능
- 하나의 이름 공간에 속한 이름은 다른 이름 공간에 속한 이름과 충돌하지 않는다.
- 이름 공간은 전역 위치에 또는 다른 이름 공간 안에도 놓일 수 있다.
- 블록 안에는 놓일 수 없다.
- 사용 범위 결정 연산자(::)를 사용하여 주어진 이름 공간으로 제한한다.]
namespace Choi{
char * name(const char *)
}
namespace Ai{
int * name(int char *)
}
Choi::name = "Choi";
Ai.name = 0;
◆using 선언과 using 지시자
- using 선언은 하나의 특별한 식별자를 사용할 수 있게 만든다
using Choi::name;
name = "CHOI";
name = 10; //불가능, Ai::name을 using 지시자가 없기 때문에
- using 지시자는 그 이름 공간 전체에 접근할 수 있게 만든다.
using namespace Ai;
name = 0;
- 어떤 이름 공간에 대한 대용 이름(alias)을 만들 수 있다.
namespace HW = Hello_World;
namespace HCPP = HW::Hello_Langauge::Hello_CPP;
using HCPP::Hello_World_and_CPP;
◆이름을 명명하지 않은 이름 공간
- 이름 공간의 이름을 생략하여 만들 수 있다.
- using 지시자가 뒤에 있는 것처럼 동작한다.
- 내부 링크를 가지는 정적 변수 대신 사용할 수 있다.
'C++ > C++' 카테고리의 다른 글
11. 클래스의 활용 (0) | 2023.07.19 |
---|---|
10. 객체와 클래스 (0) | 2023.07.17 |
8. 함수의 활용 ★ (0) | 2023.07.12 |
7. 함수 - C++의 프로그래밍 모듈 (0) | 2023.07.10 |
6장 조건문 (0) | 2023.07.02 |