잡다한것
- 지역변수와 전역변수가 이름이 겹치면?
- 지역변수가 scope안에서 선언되어있기 때문에 지역변수가 기본적으로 호출된다.
- :: 표시를 통해서 전역변수를 사용할 수 도 있다
a++; (지역변수) ::a++; (전역변수)
- 변수의 수명
- 메모리 공간을 확보하고, 변수를 저장하고, 추후 메모리를 해제하는 과정이 변수의 수명과정이다.
- 변수의 선언위치에 영향을 받는다
- 함수가 시작될때 메모리(스택)가 준비되고, 함수가 종료될때 메모리(스택)가 해제된다.
- static을 통해서 지역변수를 선언하면, 전역변수와 동일한 수명을 가지게 된다.
- 프로그램이 끝날때까지 없어지지 않는다.
- 정적으로 메모리를 할당해준다는 의미를 가진다.
- 정적으로 메모리를 할당해주면 자동으로 0으로 값이 초기화된다.
- 자동으로 할당되는 지역변수는 초기값이 자동으로 할당되지 않는다.
- 지역변수의 포인터를 리턴값으로 하면 그 메모리값은 함수종료시 삭제되기때문에 의미가 없어지고, static으로 선언해주어야된다.
- go의 경우, 지역변수가 포인터로 리턴되게되어도, 그런 포인터값은 함수종료시, 삭제되지않고 수명이 연장된다.
- static을 통해서 지역변수를 선언하면, 전역변수와 동일한 수명을 가지게 된다.
- 동적 메모리 할당도 있다.
- new연산자를 통해서 가능하다.
```c
int* pa;
pa = new int; - pa = 50;
``` - 포인터를 먼저 선언한다.
- 포인터 안에 형에대한 메모리를 할당받고 그 값을 넣어준다.
- 이럴 경우 변수를 이용하는 경우와 달리, 주소를 사용하여서 값을 이용하여야된다.
- new연산자를 통해서 가능하다.
- 동적 메모리 할당이후 해제도 해주어야된다.
- delete 포인터 명;
- 메모리를 삭제한다.
- 동적메모리는 지역변수와 다르게 내가 원하는 순간에 메모리를 할당하고, 원하는 순간에 메모리를 삭제함으로 메모리를 효율적으로 사용할 수 있게 만든다.
- 정적/자동할당은 수명을 내마음대로 설정할 수 없다는게 단점이다.
- 동적할당은 배열에 잘 사용된다.
- 배열의 크기를 추후 필요할때 할당 할 수있기때문에 효율적이다.
이런식으로 할당int num; int* pt; cin >> num; pt = new int[num];
- 배열의 크기를 추후 필요할때 할당 할 수있기때문에 효율적이다.
- 지역변수가 할당되는 공간: 스택 메모리
- 정적변수가 할당되는 공간: 정적 메모리
- 동적변수가 할당되는 공간: 힙 메모리
파일 분할
- 여러 파일에 나누어서 프로그래밍 하는것
- header 파일에 함수 프로토 타입을 선언한다.
- 그 함수의 구체적인 내용을 다른 cpp파일에 선언한다.
#include "myfunc.h"
- 위와같은 방식으로 헤더 파일을 읽어드린다.
다양한 형
- typedef 형명 식별자
- typedef unsigned long int Count; Count num =1;
- 위와같이 타입을 정의 내려줄 수 있다.
- 가독성을 높이는데 도움이 된다.
- go에서는 type 으로 선언가능하다. type Count int
- 사용자 정의 형
- 열거형(enumerated data type)
- 정의: enum 열거형명 {식별자1, 식별자2, ...};
- enum Week {sun, mon, tue, wed, thu, fri, sat};
- 이용: Week w;
enum Week {sun, mon, tue, wed, thu, fri, sat}; Week w; w = sun; (w에는 우리가 미리 선언해 놓은것들만 들어갈 수 있다.)
- 구조체형(struct)
- 정의:
struct 구조체형명 {
}형명 식별자;
- 구조체는 변수들을 묶어서 하나로 선언하기 위해서 만들어졌다.
- 내가 정의 내린것들의 정보를 하나로 묶기위해서 제공된다.
- 구조체변수명.멤버 의 형태 "."으로 내부 변수에 접근할 수 있다.
- go에서는 구조체형의 정의 또한 var aaa struct {}형태로 선언한다(통일되어 있다.)
- 초기화: 구조체로 생성된 객체의 맴버에 값을 넣거나, 한번에 구조체_형명 구조체_변수명 = {val1,val2,val3}로 초기화 가능하다
- c++에서는 동일한 구조체일 경우, 구조체끼리 대입이 가능하다.
- 멤버에 값이 복사되어서 저장됨으로 주소를 복사하는것은 아니다.
- 함수에 넣을시, 값이 복사되기때문에 너무 많은 값을 포함한 구조체를 인수로 넣으면 함수 호출이 지연될 수 있다.
- 그럴때는 구조체 포인터를 인수로 넘기면 된다.
- 근데 구조체 포인터/ 구조체 자체를 넘기는거는 성능상 이렇게 생각할 수 도 있지만, 그 함수의 역할에 따라서 나누는게 바람직해보인다.
void show(Car* pc){ pc->num pc->gas } (c++에서 포인터로 넘어간 값을 참조하기위해서는 .이 아닌, -> 화살표로 값을 참조한다.) (go에서는 포인터로 넘기든 값으로 넘기든 .으로 값을 참조한다.)
- 근데 구조체 포인터/ 구조체 자체를 넘기는거는 성능상 이렇게 생각할 수 도 있지만, 그 함수의 역할에 따라서 나누는게 바람직해보인다.
- 이런게 불편할시, 레퍼런스를 인수로 사용하면 편리하다.
void show(Car& c){ c.num c.gas (레퍼런스를 인수로 받으면, 이런형식으로 사용할 수 있다.) }
- 그럴때는 구조체 포인터를 인수로 넘기면 된다.
- struct의 경우 private값과 public값을 나눠서 선언할 수 있는데, 기본 public이기때문에 아무것도 안적으면 자동으로 public이 된다.
- private:로 선언하면, 외부 접근이 불가능해 진다.
- go의 경우 대문자 소문자로 구분해서 매우 편리
- 정의:
- 공용체(union data type)
- union 공영체형명 {
형명 식별자;
형명 식별자;
} - struct이랑 비슷하다.
- 그러나 모든 멤버는 저장공간을 공유한다, 그러므로 값을 한번에 하나만 저장할 수 있다.
- 이런경우는, 형명이 다른 2가지 값을 동일하게 컨트롤 할때 많이 쓰는거 같다.
- union 공영체형명 {
- 열거형(enumerated data type)
'프로그래밍 > c++' 카테고리의 다른 글
c++배워보기(4) (0) | 2023.03.19 |
---|---|
c++배워보기(2) (0) | 2023.03.13 |
c++ 배워보기(1) (0) | 2023.03.08 |