프로그래밍 공부
작성일
2023. 4. 19. 19:50
작성자
WDmil
728x90

C++에서는 구조체를 선언하고 내부에 함수를 생성해줄 수 있다.

그러나, 구조체는 선언전에 메모리할당이 발생하지 않는다. 그럼으로 함수는 CODE 영역에 메모리가 할당되어 실행되게 되는데. 구조체 안에 함수가 존재하지 않음으로 사실 구조체는 함수를 실행할 수 없다.

 

구조체 내부에서 함수를 선언하고 실행하는건 다음과 같은 방식을 따른다.

구조체 안에서 선언된 Print함수를 살펴보자.

Print함수가 구조체 내부에서 선언됨을 볼 수 있다. 그러나, 함수는 구조체 내부에 존재하여도 구조체는 선언 전에 메모리 할당이 일어나지 않음으로 함수 메모리에 존재하나. 실행할 수 없다.

 

그럼으로 구조체 내부에 존재하는 함수는 __thiscall 을 내부에 붙여서 구조체 내부에서 함수를 다시 호출해준 뒤.

괄호 안에 자신의 구조채를 선언하여 동작하게 된다.

 

즉, 위에서 보는것은 구조체가 함수를 실행한것 처럼 보이나. 사실 함수는 이미 존재하고, 구조체에서 함수를 실행하는 순간

 

함수는 자기자신을 재선언하게되고. 구조체를 매개변수로 받아와서 동작하게 되는것이다.

 

이는 구조체가 생성되고 선언되기 전에는 메모리에 잡히지 않기 때문에 발생하는 일이다.

 


C++에서는 L-value 와 R-value를 활용한 포인터 연산과 비슷하게 동작하는 레퍼런스 연산을 지원한다.

우선 L-value와 R-value가 무엇인지 부터 살펴보자.

https://inradestrt.tistory.com/166

 

L-value와 R-value는 각각 식이 끝나도, 나중에 접근이 가능한값, 식이 끝나면 나중에 다시 접근이 불가능한 값. 을 이야기한다.

 

이때, C++에서 사용할 수 있는 래퍼런스 연산을 사용할 수 있다. 예시는 다음과 같다.

각각 189줄과 23번줄은 함수이다.

함수에서 int를 가져올 때 & 연산자와 &&연산자를 넣게 되는데, 형식지정자 옆에 붙는 &연산자는

 

L-value 레퍼런스

 

라고 부른다. 변수의 별명이라는 이야기인데, 간단한 코드 동작사항으로 어떻게 동작되는지 살펴보자.

다음 예시에서 볼 수 있듯, r과 val은 같은 데이터값을 가리키는 이름이 된다. 주소와는 약간 비슷하면서도 다른데,

 

레퍼런스는 주소값같이 접근가능한 저장공간을 가지지 않는다. 조금이상한 이야기 같기는 해도, 그림으로 설명하면 다음과 같다.

위 이미지대로 val과 r은 데이터를 지칭하는 이름이 되고, *ptr은 데이터를 가리키는 주소값이 된다. 이렇게 되어있는 이유는,

val과 r은 데이터 그자체를 가리키는 이름이 되고, 이를 이용한 다른 연산 활용방안이 아예 존재하지 않기 때문에 저장공간이 할당이 될 때 심볼 테이블에 저장되게 된다.

int && rr = 10; 와 같이 활용할 수 도 있는데, 이는 const int rr 과 같은 역활을 한다. & 와 &&가 있다고, 별칭의 별칭. 이런식으로 해석되는것 이 아닌, &&이 들어감 으로써 상수와 같은 효과를 낸다.

 

프로그래머 들의 프로그램 의도를 나타낼 때 사용할 수 있다. 즉, 받아오는 데이터가 변경되지 않음. 을 펑션에 나타낼때 사용한다.

 

코드의 직관성을 높이는데 사용할 수 있다.

 

사실 void print(int a) 와 void print(int&& a)는 동작사항 시 차이가 없다.

그러나, int a가 선언되는 것 보다 &&가 붙어있음으로 해당 변수는 받아와서 복사한 후 처리한다.

라는 프로그래머의 의도를 쉽게 이해할 수 있음으로 직관성을 높여준다.


C++에서는 범위기반의 for문 순환연산을 허용한다. 예시를 살펴보자.

이때 피보나치 수의 배열을 다음과 같이 선언하면, for문 순환은 9번째 줄과 같다.

이는, 기본적인 배열순환방법이며 int i를 통해 임의의 배열위치에 접근이 가능한 장점이 있다.

 

그러나, int i 를 통한 임의의 위치에 접근이 가능하나, 아날로그 파형같이 연속된 데이터에 접근하기 위한 연산방법으로는

적합하지 않는 방법이 될 수 있다.

만약, 다음과 같은 위치에 접근하고자 한다면, 디지털 신호에서는 1 이상의 값이 표기된 값에 순차접근을 하면 가능하나, 아날로그 위치에서는 접근이 난해할것이다. 저 위치에 어떻게 접근할 것 인가?

 

이를 위해 C++에서는 다음과 같은 방법을 사용할 수 있다.

 

이것과 같은 순환방식을 사용하는 것 을 볼 수 있다.

 

이는, finbonacci 배열에 접근하여 순차연산을 진행하는데, int i 같은 데이터 가 아닌 처음부터 끝까지 자동으로 배열순환연산을 진행해준다.

 

한번 접근 할 때마다 원하는 연산을 진행할 수 있다.

 

그러나, int i 같이 원하는 배열 위치에 접근하기에는 애로사항이 있을 수 있는 단점이 있다.

 

또한 new와 malloc같은 동적배열생성 시 배열의 최대값을 알 수 없기 때문에 사용할 수 없다.

이렇게 접근하는 방법은 사용할 수 없다.

728x90