본문 바로가기
프로그래밍/c++

c++배워보기(3)

by 나도한강뷰 2023. 3. 18.

잡다한것

  • 지역변수와 전역변수가 이름이 겹치면?
    • 지역변수가 scope안에서 선언되어있기 때문에 지역변수가 기본적으로 호출된다.
    • :: 표시를 통해서 전역변수를 사용할 수 도 있다
      a++; (지역변수)
      ::a++; (전역변수)
  • 변수의 수명
    • 메모리 공간을 확보하고, 변수를 저장하고, 추후 메모리를 해제하는 과정이 변수의 수명과정이다.
    • 변수의 선언위치에 영향을 받는다
    • 함수가 시작될때 메모리(스택)가 준비되고, 함수가 종료될때 메모리(스택)가 해제된다.
      • static을 통해서 지역변수를 선언하면, 전역변수와 동일한 수명을 가지게 된다.
        • 프로그램이 끝날때까지 없어지지 않는다.
        • 정적으로 메모리를 할당해준다는 의미를 가진다.
        • 정적으로 메모리를 할당해주면 자동으로 0으로 값이 초기화된다.
        • 자동으로 할당되는 지역변수는 초기값이 자동으로 할당되지 않는다.
      • 지역변수의 포인터를 리턴값으로 하면 그 메모리값은 함수종료시 삭제되기때문에 의미가 없어지고, static으로 선언해주어야된다.
        • go의 경우, 지역변수가 포인터로 리턴되게되어도, 그런 포인터값은 함수종료시, 삭제되지않고 수명이 연장된다.
    • 동적 메모리 할당도 있다.
      • new연산자를 통해서 가능하다.
        ```c
        int* pa;
        pa = new int;
      • pa = 50;
        ```
      • 포인터를 먼저 선언한다.
      • 포인터 안에 형에대한 메모리를 할당받고 그 값을 넣어준다.
      • 이럴 경우 변수를 이용하는 경우와 달리, 주소를 사용하여서 값을 이용하여야된다.
    • 동적 메모리 할당이후 해제도 해주어야된다.
      • 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
  • 사용자 정의 형
    1. 열거형(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에는 우리가 미리 선언해 놓은것들만 들어갈 수 있다.)
    2. 구조체형(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의 경우 대문자 소문자로 구분해서 매우 편리
    3. 공용체(union data type)
      • union 공영체형명 {
        형명 식별자;
        형명 식별자;
        }
      • struct이랑 비슷하다.
      • 그러나 모든 멤버는 저장공간을 공유한다, 그러므로 값을 한번에 하나만 저장할 수 있다.
      • 이런경우는, 형명이 다른 2가지 값을 동일하게 컨트롤 할때 많이 쓰는거 같다.

'프로그래밍 > c++' 카테고리의 다른 글

c++배워보기(4)  (0) 2023.03.19
c++배워보기(2)  (0) 2023.03.13
c++ 배워보기(1)  (0) 2023.03.08