4 분 소요


포인터

Bit

  • 메모리의 가장 작은 단위
  • 공학적인 표현으로 0아니면 1 두가지 중 한가지 상태를 가질 수 있다.
  • 1비트의 경우 2^1 여기서 승수가 비트를 나타낸다.
  • 데이터를 저장하고 처리하는데에 사용된다.

Byte

  • 메모리 상의 최소 데이터 단위
  • 데이터 타입의 크기를 결정하는 기본 단위
  • 1바이트 = 8개의 비트를 나타내는 단위
  • 32bit 환경에서 인트형은 4바이트, 2^32 인트형의 범위와 같다.
// 자료형 크기

#include <iostream>
using namespace std;

int main()
{
    bool a;
    char b;
    int c;

    count << sizeof(a) <<endl;
    count << sizeof(b) <<endl;
    count << sizeof(c) <<endl;
}

결과값:
---------------------------------
1
1
4





포인터 변수

  • 메모리상의 주소를 저장하는 변수
  • 변수명앞에 ‘*’ 기호를 사용하여 정의한다.
  • 다른 변수의 주소를 가르켜 데이터를 변경하거나 참조할 수 있다.
// 포인터 활용

#include <iostream>
using namespace std;

int main()
{
    int num = 10;

    int* pnum = &num; // 포인터의 변수가 num의 주소값을 가리킨다.
    *pnum = 20;

    cout << num << endl; // 포인터의 변수로 접근하여 값을 바꾸었기 때문에 20이 출력된다.
    cout << *pnum << endl; // 포인터 변수가 num에 주소값을 가르키고 있기에 num의 값인 20이 출력된다.

    int num2 = 30;

    pnum = &num2; // 포인터 변수가 num2의 주소값을 가리킨다.

    cout << *pnum << endl; // 포인터 변수가 num2에 주소값을 가르키고 있기에 num2의 값인 30이 출력된다.

    int* pnum2 = 5; // 상수 5는 메모리 주소가 없기 때문에 포인터로 가르킬 수 없다.
}





Call By Value

  • 값에 의한 호출로 인자로 받은 값을 복사하여 처리한다.

  • 함수 영역에서 매개변수에 인자 값이 복사가 되고 함수 내에서 매개변수 끼리 값이 바뀌지만 함수가 종료 되면 매개변수들은 사라지게 되므로 실제 전달한 인자의 값에 대한 변화는 없다.

// Call By Value

#include <iostream>
using namespace std;

void TempValue(int n, int m)
{
    int tmp = n;
    n = m;
    m = tmp;
}

int main()
{
    int n = 10;
    int m = 20;

    cout << n << " " << m << '\n';
    TempValue(n, m);
    cout << n << " " << m << '\n';
}

결과값:
---------------------------------
10 20
10 20





Call By Address

  • 주소에 의한 호출로 매개변수인 포인터 변수에 원본의 주소값을 복사한다.

  • 매개변수의 복사된 주소를 참조하여 값을 변경하면 원본의 데이터도 바뀌게된다.

// Call By Address

#include <iostream>
using namespace std;

void TempAddress(int *n, int *m)
{
    int tmp = *n;
    *n = *m;
    *m = tmp;
}

int main()
{
    int n = 10;
    int m = 20;

    cout << n << " " << m << '\n';
    TempAddress(&n, &m);
    cout << n << " " << m << '\n';
}

결과값:
---------------------------------
10 20
20 10





Call By Reference

  • 참조에 의한 호출로 인자로 받은 값의 주소를 참조하여 직접 값을 변경할 수 있다.

  • Call By Adress와 결과 값은 같지만 주소를 복사하여 참조하는 것이 아니라 인자의 주소를 바로 참조하여 값을 변경한다

  • C++에서 도입된 개념이다.

// Call By Reference

#include <iostream>
using namespace std;

void TempReference(int &n, int &m)
{
    int tmp = n;
    n = m;
    m = tmp;
}

int main()
{
    int n = 10;
    int m = 20;

    cout << n << " " << m << '\n';
    TempReference(n, m);
    cout << n << " " << m << '\n';
}

결과값:
---------------------------------
10 20
20 10





이중 포인터

  • 포인터 변수는 주소를 저장하는 변수이고 마찬가지로 이중 포인터는 포인터의 주소를 저장하는 변수이다.

    • numPtr2 = numPtr1의 주소
    • *numPtr2 = numPtr1의 값 = num1의 주소
    • **numPtr2 = numPtr1이 참조하는 값 = num1의 값


다음과 같이 더블 포인터를 활용할 수 있다.

// 더블 포인터 활용

#include <iostream>
using namespace std;

void Func(int** b) {
    *b = new int;
    cout << b << endl; // *a의 주소값
    cout << **b << endl; // *a의 값
    **b = 10; // *a가 가르키는 값을 직접 바꾼다.
    cout << **b << endl;
}

int main()
{
    int* a = NULL;
    Func(&a);
    cout << &a << endl; // *a의 값
    cout << *a;
    delete a;
}

결과값:
---------------------------------
00EFFA0C
-842150451 // 쓰레기 값
10
00EFFA0C
10





클레스

  • 변수와 함수를 결합한 데이터 타입 객체를 생성하기 위해 변수와 함수를 정의하는 일종의 틀의 개념이다.

  • 클래스와 구조체의 차이는?
    • 구조체는 접근 지정자가 없다. 전부 public처럼 접근 가능하다.
    • 클레스는 public, private, protected 접근 지정자가 존재함
  • 클래스, 구조체의 맴버 변수 접근 시 ‘ . ‘을 사용한다.
    • 맴버 변수가 스택 영역에 존재한다.
  • 클래스, 구조체 포인터에 접근할 경우 ‘->’ 또는 ‘(*ptr).’ 같은 방식으로 접근한다.
    • 맴버 변수가 힙 영역에 존재한다.
// 클레스 예시

#include <iostream>
using namespace std;

class Person 
{
// 접근 지시자
//public 어디서든 접근 가능
//protected 내부에서 접근 가능, 자식 접근가능
//private 내부에서 접근 가능, 프랜드 접근 가능

public:
    int num;

private:
    int num1;

public:
    Person() 
    {
        cout << "생성자 호출" << endl;
        num = 10;
        num1 = 50; // 프라이빗 맴버 변수 클래스 내부에서 사용 가능

        cout << num << " " << num1 << endl;
        Print1(); // 프라이빗 맴버 함수 클래스 내부에서 사용 가능
        cout << "생성자 끝" << endl;
    }
    void Print() 
    {
        cout << "public: " << "학술회 너무 재밌어" << endl;
    }

private:
    void Print1() 
    {
        cout << "private: " << "학술회 너무 재밌어" << endl;
    }
};

int main()
{
    Person a;

    // public 외부에서 사용 가능
    a.Print();
    a.num;

    // private 외부에서 사용 불가능
    a.Print1(); // private 맴버 함수 외부에서 접근할 수 없다.
    a.num1; // private 맴버 변수 외부에서 접근할 수 없다.
}

결과값:
---------------------------------
생성자 호출
10 50
private: 학술회 너무 재밌어
생성자 끝

public: 학술회 너무 재밌어

댓글남기기