CPP_어소_23_분할 구현

CJB_ny·2022년 5월 18일
0

CPP_AROTHO

목록 보기
21/83
post-thumbnail

헤더, 파일의 분할 왜 하는지?

근데 분리를 하다보면 문제 -> 전역변수

AI를 예로 듦.


변수의 종류

1. 지역 변수

가 사용하는 메모리 영역 == 함수가 호출 될 때 사용하는 영역

-> 스택

2. 전역 변수

데이터 영역에 있기 때문에 == 프로그램이 최초로 실행될 때 데이터 영역에 메모리를 할당 받기 때문에

3. 정적 변수

static

4. 외부 변수

extern

정적변수 외부변수(+전역) 모두 데이터 영역을 사용한다.

메모리 영역

OS가 프로그램(프로세스)가 실행될 때

부여하는 메모리 영역을 개념적으로 나누어서 지칭한 것이다.

OS마다 더 세분화 할 수있지만 크게는 이렇게 됨.

1. 스택 영역

지역 변수가 사용하는 메모리 영역 == 함수가 호출 될 때 사용하는 영역

2. 데이터 영역

전역 변수가 사용하는 메모리 영역

3. 힙 영역

4. 읽기 전용(코드, ROM)


분할 구현

헤더파일과 CPP파일을 분리해서 구현 할 것이다.

왜? 분리함?

헤더는 뭐임?


헤더파일에 func.h, 소스파일에 func.cpp 파일 각각 만듦.

헤더

이런 함수가 있다고 이렇게 "선언"만 해놓은 것이다.

Test라는 함수를 이렇게 밑에 구현하면 에러 뜸


왜? -> 코드가 위에서 부터 아래로 순차적으로 검사를 해 나가기 때문에.


그래서 함수를 일단

이렇게 위에 "있다"고만 선언이 가능함.

그래서 그러면

"선언"만 했는데 뭔지 알고 작동이 하나?

=> 나중에 "컴파일 단계"에서 "링크" 단계가 있다.

그떄, 호출하기로한

이 함수가 여기에있다는 것을 알아서 "링크 단계"에서 이런것 들을 다 잡아준다.

그런데

선언만 하고 밑에 구현을 안 한다면?

이렇게 된다.

LNK보이나? -> "링크 단계"에서 발생한 에러이다.

에러뜬것을 보면 C가 붙어있음 => "컴파일 에러"이다.

코드를 쭉 작성해주다가 에러가 뜨면은 "컴파일"도 안해주는 것이다.

그러면 반대로

컴파일 오류가 아니라면 문법적으로 문제가 있다는 거야? 없다는 거야?

"문법"에는 오류가 없다는 것이다.


그래서 위에서 설명한 것들이

헤더파일과 분할 구현한 것들과 무슨 상관이 있느냐 하면은

func.h에 Add라는 함수가 "있을 꺼야~"라고 했다.

그리고 "실제 구현"을 func.h에 하는게 아니라 func.cpp에 하는 것이다.


전천리기

#include 는 전처리기 인데

그중에서도 include가 포함이 되어있으면

뒤에 명시해놓은 파일을 복붙하는 것이다.

그래서 func.cpp에

이게 같다 붙여 놓은 것이다.

그래서 구현을

이래 함..

근데 func.cpp에 구현해놓은 것들을 main에서 사용하고 싶다면

#include "func.h"

func.h에서 Add함수 정의

func.cpp 에서 Add함수 구현

main에서 Add사용을 하면

컴파일러는 어느 단계에서 이것을 연결? 알아서 컴파일을 할까??

이것이 "링크 단계"에서 다 되는 것이라 문제가 없다.

그림처럼 func.h에서 선언만 한것을 가져오는 것이다.

그런데??

컴파일 까지는 문제 없지만

정말 Add라는 함수가 있는지는 알 수 없다.

(전체 컴파일이 아니라 문법적인 컴파일 한해서)

그래서 이것들을 전체로 합쳐서

.exe라는 하나의 실행파일이 될 것이다. == 프로그램

그 프로그램안에는 각각의 파일을 따로 구현을 하였지만,

내가 원하는 기능이 하나로 합쳐져서 완벽하게 합쳐져야한다.

오른쪽처럼 나중에 완전히 하나로 합쳐주는 것이다.


구현

여기서 선언해주고

이렇게 정의 해주면

main.cpp에서 다 사용이 가능하다는 말이다.

그래서 왜 구현?

딱 봐도 어느정도 정리가 되고있지 않나??

(유니티에서 기능을 분할을 하라는 것과 똑같다)

코드를 손쉽게 관리를 하기 위해서 (당연하노)

그런데 나중에는 링크라는 과정에서

속도 저하가 일어날 수 밖에 없다.

나중에 AI가 코드를 짠다고하면 main파일안에다가 싹다 구현을 할 것이다.

(성능이 더 좋기 때문에)

문제

그런데 분할 구현하다 보면 발생하는 문제 = 전역변수(데이터 영역)

이것 보도록 하자.

profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글