๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž

  • C++์—๋Š” ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ๋„ ์กด์žฌํ•œ๋‹ค
  • int ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ : int& operator[](int idx)
  • ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ๋ฐฐ์—ด์˜ ๋ฒ„ํผ๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ƒํ™ฉ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง
    • ์˜ˆ : arr[-1], arr[-100], ํฌ๊ธฐ 3์ธ arr์—์„œ arr[3] ๋“ฑ

const ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ํ™œ์šฉ

class BoundCheckIntArray{
private:
    int * arr;
    int arrlen;
    BoundCheckIntArray(const BoundCheckIntArray& arr) {}
    BoundCheckIntArray& operator=(const BoundCheckIntArray& arr) {}
public:
    BoundCheckIntArray(int len) : arrlen(len){
        arr = new int[len];
    }
    int& operator[] (int idx){
        if(idx<0 || idx>=arrlen){
            cout<<"Array index out of bound exception"<<endl;
            exit(1);
        }
        return arr[idx];
    }
    int GetArrLen() const { return arrlen; }
    ~BoundCheckIntArray() { delete[] arr; }
};

void ShowAllData(const BoundCheckIntArray& ref){
    int len = ref.GetArrLen();
    for(int idx = 0 ; idx<len ; idx++){
        cout<<ref[idx]<<endl;
    }
}

int main(){
    BoundCheckIntArray arr(5);
    for(int i = 0 ; i < 5 ; i++){
        arr[i] = (i+1)*11;
    }
    ShowAllData(arr);
    return 0;
}
  • ์œ„ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ด์œ ๋Š”?
    void ShowAllData(const BoundCheckIntArray& ref){
      int len = ref.GetArrLen();
      for(int idx = 0 ; idx<len ; idx++){
          cout<<ref[idx]<<endl;
      }
    }
    • ์œ„ ์ฝ”๋“œ์—์„œ ์ธ์ž๋กœ BoundCheckIntArray๊ฐ€ const๋กœ ์ „๋‹ฌ๋˜์–ด ์ˆ˜์ •์„ ๋ง‰๊ณ  ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ operator= ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ ํ•จ์ˆ˜๋Š” const ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด.

    โš ๏ธ ์ธ์ž๊ฐ€ const๋กœ ๋“ค์–ด์˜ค๋ฉด, constํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์— ์œ ์˜

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  • operator= ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ ํ•จ์ˆ˜๋ฅผ const์ธ๊ฒƒ ํ•˜๋‚˜, ์•„๋‹Œ๊ฒƒ ํ•˜๋‚˜๋กœ ์˜ค๋ฒ„๋กœ๋”ฉํ•œ๋‹ค.
  • ๊ฑฐ์˜ ์™„์ „ํžˆ ๊ฐ™์€ ํ•จ์ˆ˜์ด์ง€๋งŒ, const๊ฐ€ ๋ถ™๋ƒ ์•ˆ๋ถ™๋ƒ์˜ ์ฐจ์ด๋งŒ ์žˆ์Œ.
#include <iostream>
#include <cstdlib>
using namespace std;

class BoundCheckIntArray{
private:
    int * arr;
    int arrlen;
    BoundCheckIntArray(const BoundCheckIntArray& arr) {}
    BoundCheckIntArray& operator=(const BoundCheckIntArray& arr) {}
public:
    BoundCheckIntArray(int len) : arrlen(len){
        arr = new int[len];
    }
    /*
     * ์ˆ˜์ •๋œ ๋ถ€๋ถ„ ์‹œ์ž‘------------------------------
     */
    int& operator[] (int idx){
        if(idx<0 || idx>=arrlen){
            cout<<"Array index out of bound exception"<<endl;
            exit(1);
        }
        return arr[idx];
    }
    int& operator[] (int idx) const{
        if(idx<0 || idx>=arrlen){
            cout<<"Array index out of bound exception"<<endl;
            exit(1);
        }
        return arr[idx];
    }
    /*
     * ์ˆ˜์ •๋œ ๋ถ€๋ถ„ ๋--------------------------------
     */
    int GetArrLen() const { return arrlen; }
    ~BoundCheckIntArray() { delete[] arr; }
};

void ShowAllData(const BoundCheckIntArray& ref){
    int len = ref.GetArrLen();
    for(int idx = 0 ; idx<len ; idx++){
        cout<<ref[idx]<<endl;
    }
}

int main(){
    BoundCheckIntArray arr(5);
    for(int i = 0 ; i < 5 ; i++){
        arr[i] = (i+1)*11;
    }
    ShowAllData(arr);
    return 0;
}
  • ์ด๋Ÿฌ๋ฉด const๋กœ ๋“ค์–ด์˜จ ์ธ์ž์— ๋Œ€ํ•ด์„œ๋„ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.