반응형

 

참조자 (Reference)

- 할당된 어떤 하나의 메모리 공간에 다른 이름을 부여하는 것이다.

  ※ 별명이라고 생각해도 좋다.

- 참조자는 변수 앞에 &를 붙여줌으로써 선언할 수 있다.

  ※ 이미 선언된 변수 앞에 &를 붙이면 주소값을 반환하지만, 새로 선언되는 변수 앞에 &를 붙이면 참조자 선언을 뜻한다.

 

 

 

활용

- 다음과 같이 사용하게되면 num2는 num1의 참조자가 되며 두 변수는 같은 메모리 공간을 가리키게 된다.

int num1 = 10;
//참조자 num2 선언
int& num2 = num1;

 

- 즉, 같은 메모리 공간을 가리키므로 num2에 100을 대입해주면 num1, num2의 값이 100으로 변경된다.

num2 = 100;
//결과 : num1 : 100, num2 = 100

 

 

- 참조자의 수에는 제한이 없으며 참조자를 대상으로도 참조자 선언이 가능하다.

int num1 = 10;
int& num2 = num1;
int& num3 = num1;

//---------------

int num1 = 10;
int& num2 = num1;
int& num3 = num2;

  ※ 위 코드와 아래 코드 모두 동일하게 num1의 메모리 공간을 가리킨다.

  ※ 하지만, 필요 이상으로 참조자를 선언하는것은 바람직하지도 않고, 필요하지도 않다.

 

- 참조자의 선언 가능 범위

  • 참조자는 변수에 대해서만 선언 가능.
int& ref = 20;	//(X)
  • 참조자는 변수에 별명을 붙이는 것이기에 미리 선언했다가 나중에 다른 변수를 참조하는 것이 불가능하다.
int& ref;	//(X)
  • 참조자는 상수에 대해 참조가 허용되지 않는다.
const int num = 10;
int& ref = num;		//(X)
  • 참조자는 NULL로 초기화하는것이 불가능하다.
int& ref = NULL;	//(X)
  • 배열의 요소와 포인터도 변수로 간주되어 참조자의 선언이 가능하다.
//Array reference
int arr[1] = {1};
int& arrRef = arr[0];	//1

//--------------------

//Pointer reference
int num = 1;
int* ptr = #
int& nRef = num;	//1
int* (&pRef) = ptr;	//1

 

 

 

Call-by-value & Call-by-reference

- 참조자의 활용에는 함수가 큰 지분을 차지한다.

  • Call-by-value : 값을 인자로 전달하는 함수의 호출방식
  • Call-by-reference : 주소 값을 인자로 전달하는 함수의 호출방식

- C에서의 Call-by-reference는 주소값을 전달받아 함수 외부에 선언된 변수에 접근한다.

- C++에서의 Call-by-reference는 두가지로 구분할 수 있다.

  • 주소값을 이용한 Call-by-reference (C의 개념과 동일)
  • 참조자를 이용한 Call-by-reference

 

 

참조자를 이용한 Call-by-reference

- 다음 코드를 통해 참조자를 활용해도 Call-by-reference가 가능하다는것을 알 수 있다.

void Swap(int& n1, int& n2)
{
    int tmp = n1;
    n1 = n2;
    n2 = tmp;
}

void main()
{
    int n1 = 10;
    int n2 = 20;
    
    Swap(n1, n2);
    
    //결과 n1 : 20, n2 : 10
}

  ※ 매개변수의 경우 함수가 호출되어야 초기화가 되기때문에 별도의 에러를 발생시키지 않는다.

 

 

 

참조자를 이용한 Call-by-reference의 단점

int n = 20;
TempFunc(n);
cout << n << endl;

- 위의 코드를 기준으로 봤을때, C의 개념이면 무조건 20이 출력되지만, C++에서의 출력값은 예상할 수 없다.

  ※ TempFunc(int)의 매개변수가 참조자일 가능성이 있기 때문.

- 따라서, n의 값을 예상하기 위해서는 TempFunc(int)의 함수 원형을 일일이 확인해야하는 불편함이 생긴다.

- 이 단점은 매개변수에 const를 붙여 상수화 시켜서 매개변수의 값 변경을 막을수있다.

- 이런 불명확함 때문에 C++ 프로그래머들은 참조자를 잘 사용하지 않는다.(고 한다.)

 

 

 

상수 참조하기

- 다음과 같은 방법으로 상수의 참조가 가능하다.

const int num = 10;
const int& ref = num;

- Why?

  • 이것은 '임시객체'를 참조하기 위한 방법이다.
  • 리터럴 상수는 임시적으로 존재하는 값. 즉, 다음 행으로 넘어가면 존재하지 않는 상수다.
  • 그래서 C++은 const 참조자를 이용해서 상수를 참조할 때 '임시변수'를 만들고 이 장소에 상수를 저장해 참조하게 끔 한다.
반응형

'Stack > C++' 카테고리의 다른 글

C++ 파일 입출력 ofstream, ifstream  (0) 2021.10.16
C++ 생성자, 복사생성자, 소멸자 (+ const)  (0) 2021.10.15
C++ 동적할당 new, delete  (0) 2021.10.13
C++ 클래스, 객체, 인스턴스  (0) 2021.09.29
C++ 객체지향  (0) 2021.09.28
반응형

 

클래스 (Class)

- 여러 자료형의 변수와 함수를 묶는 사용자 정의 자료형이다.

- 사물의 특성과 행동을 소프트웨어적으로 모델링하여 데이터화한다.

- 구조체와는 다르게 접근제어 지시자를 선언하지 않을시 private로 선언된다.

#include <iostream>
using namespace std;

struct Struct
{
    int i;
};

class Class
{
    int i;
};

void main()
{
    Struct s;
    s.i = 0;
	
    Class c;
    c.i = 0; //에러가 발생한다.
}

 

 

 

접근제어 지시자

- C++에서의 접근제어 지시자는 세가지가 존재한다.

  • private : 클래스 내에서만 접근허용
  • public : 어디서든 접근허용
  • protected : 클래스 안이거나, 상속관계에 있을때 접근허용

 

 

 

클래스 (Class) / 객체 (Object) / 인스턴스 (Instance)

- Class : 객체를 설계할 때 필요한 설계도

class TempClass
{
private:
    int n;
public:
    TempClass(int n)
    {
        this->n = n;
    };
    int GetNum()
    {
        return n;
    };
};

- Object : Class가 만들어진 결과물

void main()
{
    TempClass tmpClass;
}

- Instance : 만들어진 Object에 개별적인 정보를 부여하여 만들어진 사용 가능한 상태의 정보.

void main()
{
    TempClass tempClass(10);
}

  ※ 좀 더 정확히는 메모리상에 구현된 객체를 인스턴스라고 한다. (객체가 인스턴스를 포함한다.)

  ※ 위와 같은 상태에서는 tmpClass가 객체이고, (10)이 인스턴스가 된다.

  ※ 즉, 객체는 클래스 타입으로 선언되었을 때를 의미하고, 인스턴스는 인자를 받아 메모리에 할당되어 실제 사용 가능한 상태를 말한다.

반응형

'Stack > C++' 카테고리의 다른 글

C++ 파일 입출력 ofstream, ifstream  (0) 2021.10.16
C++ 생성자, 복사생성자, 소멸자 (+ const)  (0) 2021.10.15
C++ 동적할당 new, delete  (0) 2021.10.13
C++ 참조자(Reference)  (0) 2021.09.29
C++ 객체지향  (0) 2021.09.28
반응형

 

객체지향이란?

- Object-Oriented Programming (OOP)

- 컴퓨터 프로그래밍의 패러다임 중 하나.

- 객체를 만들어 객체들 간의 상호작용을 통해 로직을 구성하는 방법이다.

  ※ 객체 : 독립된 단위

- 장점

  • 유지보수 용이 : 수정사항이 클래스 내부에 있기 때문에 쉽게 찾을 수 있다.
  • 대형프로젝트에 적합 : 모듈화가 가능하므로 다수가 참여하는 대형프로젝트에서 분담이 쉽다.

- 단점

  • 처리속도가 절차지향보다 상대적으로 느리다.
  • 설계에 많은 시간이 소요된다.

 

 

객체지향의 특징

- 추상화 (Abstration)

  • 대상의 특성을 제외한 공통점을 모아 정보화한다. (Class)

- 캡슐화 (Encapsulation)

  • 외부동작(함수)을 제외한 자신의 정보(변수)를 숨긴다. (정보은닉)

- 상속 (Inheritance)

  • 이전에 만들어진 Class의 기능을 상속을 통해 가져와 부모Class의 기능을 그대로 재활용이 가능하다.

- 다형성 (Polymorphism)

  • 약속된 부분만 유지한다면 한 요소에 여러 개념을 넣을 수 있다. (오버라이딩, 오버로딩)
반응형

'Stack > C++' 카테고리의 다른 글

C++ 파일 입출력 ofstream, ifstream  (0) 2021.10.16
C++ 생성자, 복사생성자, 소멸자 (+ const)  (0) 2021.10.15
C++ 동적할당 new, delete  (0) 2021.10.13
C++ 참조자(Reference)  (0) 2021.09.29
C++ 클래스, 객체, 인스턴스  (0) 2021.09.29

+ Recent posts