본문 바로가기

old/Programming

매개변수 전달 방법 선택하기: 값 vs 참조

반응형

프로그래밍에서 데이터 저장하는 두 가지 방법

데이터를 변수에 넣을 때, 프로그래밍 언어는 두 가지 방법으로 데이터를 저장할 수 있습니다.

  1. 데이터를 힙 메모리에 저장한 다음, 그 메모리의 주소를 스택 메모리에 저장합니다.
  2. 데이터를 스택 메모리에 직접 저장합니다.

두 가지 방법이 있는 이유?

스택 메모리는 힙 메모리보다 훨씬 빠릅니다. 그러나 스택 메모리는 제한된 공간을 가지고 있습니다. 따라서 컴퓨터는 스택 메모리에 정적 데이터(일시적인 사용, 몬스터를 공격할 때 데미지 계산)를 저장하고, 힙 메모리에 동적 데이터(다시 사용, 게임에서 새로운 기술을 배울 때)를 저장하도록 설계되었습니다.

값에 의한 전달(pass by value)이란?

  • 메소드를 사용할 때, 값만 전달됩니다. 그러므로, 입력 데이터가 변경되어도 원래 변수의 데이터는 변경되지 않습니다.
  • 데이터를 스택 메모리에 직접 저장합니다.

참조에 의한 전달(pass by reference)이란?

  • 메소드를 사용할 때, 값의 주소가 전달됩니다. 그러므로, 입력 데이터가 변경되면 원래 변수의 데이터도 변경됩니다.
  • 데이터를 힙 메모리에 저장한 다음, 그 메모리의 주소를 스택 메모리에 저장합니다.

Java Vs. C++

Java는 값에 의한 전달(pass by value)입니다

그러나 객체를 사용할 때, 객체의 주소가 메소드에서 사용됩니다.

즉, 원래 변수의 데이터가 변경됩니다.

public class Main {

    public static void main(String[] args) {
        int a = 10;

        System.out.println("A is " + a); // 10
        increaseNum(a);// 값만 전달됨
        System.out.println("A is " + a); // 10

        Student A = new Student(24);
        System.out.println(A.getAge()); // 24
        increaseAge(A);// 겍체의 값(주소)이 전달
        System.out.println(A.getAge()); // 34

    }

    public static void increaseNum(int input) {
        int temp = input;
        temp++;
    }

    public static void increaseAge(Student input) {
        input.setAge(input.getAge() + 10);
    }
}
public class Student {
    int age;
    public Student(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

C++에서 값에 의한 전달 vs 참조에 의한 전달

C++에서는 변수를 함수나 메소드로 전달할 때 값에 의한 전달과 참조에 의한 전달 중 선택할 수 있으며, 이를 통해 프로그래머는 데이터 처리 방식을 더욱 유연하게 제어할 수 있습니다.

#include <iostream>using namespace std;

class Student {
  private:
    int age;

  public:
    void setAge(int s) {
      age = s;
    }
    int getAge() {
      return age;
    }
};

void increaseAge(Student i) {
  i.setAge(i.getAge()+10}
void increaseAge2(Student &i) {
i.setAge(i.getAge()+10);
}
void increaseNum(int i) {
i++;
}
void increaseNum2(int &i) {
i++;
}

int main(void) {
int a = 10;

cout << "A is " << a << endl; // 10
increaseNum(a); // 값만 전달됨
cout << "A is " << a << endl; // 10
increaseNum2(a); // 참조에 의한 전달
cout << "A is " << a << endl; // 11

Student B;
B.setAge(20);

cout << B.getAge() << "\\n"; // 20
increaseAge(B); // 값만 전달됨
cout << B.getAge() << "\\n"; // 20
increaseAge2(B); // 참조에 의한 전달
cout << B.getAge() << "\\n"; // 30

return 0;

}
반응형