본문 바로가기

C++

[13] 파일 분할

728x90

파일 분할

저희가 코드를 작성하다 보면 지금 쓰고 있는 굳이 다시 작성하지 않고, 함수를 다른 프로그램에서도 쓰고 싶을 수도 있습니다.

이럴 때 파일을 분할하면 재사용 가능하도록 만들 수 있습니다.

 

아래 이미지를 보면

이 프로그램은 3가지 파일이 연관되어있습니다.

메인 함수가 있는 cpp파일, iostream헤더 파일, iostream.cpp파일입니다.

이 코드를 실행시키면, 메인 cpp파일과 iostream.cpp파일을 컴파일해서 오브젝트 파일로 만든 후 링크시켜서 프로그램을 만듭니다.

 

헤더 파일

함수 프로토타입 선언만 작성된 파일입니다.

메인 함수가 실행될 때 함수 호출이 있으면, 헤더 파일의 프로토타입을 통해서 컴파일 시점에 호출된 함수가 제대로 호출된 것인지 검사를 합니다.

 

※파일을 컴파일하고 링크하는 순서는 개발환경에 따라 다를 수 있습니다.

 

표준 라이브러리

어떤 프로그램에서도 사용할 수 있도록 표준적인 처리를 정의한 함수입니다.

입출력 함수나 문자열 처리 함수가 표준 라이브러리에 포함됩니다.

이 함수들을 사용하기 위해서 표준 헤더 파일을 인클루드 해야 합니다.

표준 헤더 파일을 인클루드 할 때는 < >를 사용하고, 사용자 정의 헤더 파일을 인클루드할 때는 " "를 사용합니다.

< > 안의 파일은 개발환경이 표준 라이브러리 디렉토리로 인식한 곳에서 로드되고, " "안의 파일은 소스파일이 있는 디렉토리에서 로드됩니다.

 

스코프

전역 변수와 함수는 모든 파일에서 사용할 수 있습니다. 하지만, 이름 앞에 static이 붙어있으면 파일안에서만 사용하도록 제한이 생깁니다.

위에서 보듯이 모든 파일에서 사용할 수 있는 경우를 "외부 링크 속성을 가진다."고 하고, 특정 파일 안에서만 사용가능한 경우를 "내부 링크 속성을 가진다."라고 합니다.

 

extern

만약, 다른 파일안에 있는 전역변수를 사용하고 싶다면

위와 같이 변수앞에 extern이 있는 변수가 선언된 헤더 파일을 인클루드해야 합니다.

 

 

네임스페이스

일반적으로 지역변수, 전역변수의 스코프는 함수 내부, 프로그램 전체이지만, 네임스페이스라는 스코프를 사용하면 네임스페이스 내부의 요소들을 기본적으로 네임스페이스 안에서만 사용할 수 있습니다.

이렇게 하면, 다른곳에서 네임스페이스 안에 있는 이름들을 전혀 다른 기능을 가진 요소로써 사용 가능합니다.

네임스페이스 바깥에서 네임스페이스 내부의 요소들을 사용하고 싶다면 아래와 같이 사용합니다.

만약, 네임스페이스를 자주 사용해야 한다면 매번 Sample::을 붙이는 것은 번거롭습니다.

이럴 때, using을 사용하면 코드를 단축할 수 있습니다.

 

using

네임스페이스 이름을 지정하지 않고도 네임스페이스 안의 변수나 함수를 사용할 수 있게 해주는 키워드입니다.

2가지 방법을 소개하겠습니다.

 

개별적인 요소만 네임스페이스 생략가능

 

전체 요소에 대해 네임스페이스 생략가능

이렇게 파일 분할에 대한 내용과 네임스페이스에 대해 알아보았습니다.

 

 

왜 네임스페이스를 사용해서 코드를 작성할까요?

재사용을 하고 싶다면 그냥 다른 파일에 함수를 구현하고 헤더 파일을 인클루드해서 이용하면 될텐데 왜 네임스페이스를 사용해야 할까요?

일단은 현재 드는 생각은 오버로드, 템플릿처럼 인수의 개수나 타입이 무조건 달라야 하거나 타입만 다른 경우에만 이용할 수 있는 것과 다르게 네임스페이스를 사용하면 같은 이름과 인수를 가진 함수도 네임스페이스에 따라서 다른 기능을 가지도록 구현을 할 수 있다는 것이 큰 장점인 것 같습니다.

다른 자료를 참고 하면, 이런 특성을 가지고 서로 다른 개발자들일 협업하다가 같은 이름의 함수를 만들었는데 각각 다른 네임스페이스에 정의가 되어 있다면 오류없이 네임스페이스에 맞게 이용할 수 있습니다.

이렇게 네임스페이스를 사용하면 전체를 고쳐야 할 수도 있는 오류를 일으키지 않고 잘 돌아가게 할 수 있습니다.

 

참고자료

hwan-shell.tistory.com/4

 

C++의 namespace의 사용법과 이유(1)

C++에는 C에 없는 namespace라는 기능이 존재합니다. namespace라는 기능을 설명하기에 앞서 C++에 특지에 대해 이해하고 넘어갑시다!! C++은 객채지향 언어입니다. C언어는 절차지향 언어이지요. 이 둘

hwan-shell.tistory.com

 

728x90

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

[15] 클래스  (0) 2021.05.02
[14] typedef, 구조체, 공용체  (0) 2021.05.01
[12] 동적 메모리 확보  (0) 2021.05.01
[11] 스코프와 기억수명  (0) 2021.04.30
[10] 배열  (0) 2021.04.30