반응형
프로그래밍에서 데이터 저장하는 두 가지 방법
데이터를 변수에 넣을 때, 프로그래밍 언어는 두 가지 방법으로 데이터를 저장할 수 있습니다.
- 데이터를 힙 메모리에 저장한 다음, 그 메모리의 주소를 스택 메모리에 저장합니다.
- 데이터를 스택 메모리에 직접 저장합니다.
두 가지 방법이 있는 이유?
스택 메모리는 힙 메모리보다 훨씬 빠릅니다. 그러나 스택 메모리는 제한된 공간을 가지고 있습니다. 따라서 컴퓨터는 스택 메모리에 정적 데이터(일시적인 사용, 몬스터를 공격할 때 데미지 계산)를 저장하고, 힙 메모리에 동적 데이터(다시 사용, 게임에서 새로운 기술을 배울 때)를 저장하도록 설계되었습니다.
값에 의한 전달(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;
}
반응형
'old > Programming' 카테고리의 다른 글
그래프 탐색: DFS,BFS 트리: inorder, preorder, postorder (0) | 2023.05.03 |
---|---|
문자열에서 서브스트링substring 찾는 방법 (0) | 2023.04.26 |
프로그래밍에서 인기 있는 변수 이름 표기법: 스네이크 케이스, 파스칼 케이스, 카멜 케이스 (0) | 2023.03.19 |
바이너리 서치 알고리즘이란 (0) | 2022.02.22 |
리니어 서치 알고리즘이란 (0) | 2022.02.16 |