ํ๋ก๊ทธ๋๋ฐ์์ ํจ์ ํธ์ถ ๋ฐฉ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ํนํ, Call by Value์ Call by Reference๋ ๋ ๊ฐ์ง ์ฃผ์ํ ํธ์ถ ๋ฐฉ์์ผ๋ก, ๊ฐ๊ฐ ๊ณ ์ ํ ํน์ง๊ณผ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์ ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ๊ณผ Java์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง์ ๋ํด ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Call by Value
Call by Value๋ ํจ์๊ฐ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ณต์ฌ๋ณธ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค. ์ด ๋ฐฉ์์ ์ฃผ๋ก ๊ธฐ๋ณธํ ๋๋ ์์ ํ์ (primitive type)์ ๋ฐ์ดํฐ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์๋ ์ค์ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ด ์ฌ๊ธฐ์ ํด๋น๋ฉ๋๋ค.
๐ซ ์์ ์ฝ๋๋ ์ดํด๋ฅผ ์ํด C++๋ก ์์ฑ๋์์ต๋๋ค.
#include <iostream>
using namespace std;
void modify(int a) {
a = 20;
}
int main() {
int a = 10;
modify(a);
cout << a << endl;
}
์คํ ๊ฒฐ๊ณผ:
10
์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ํตํด ์์๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ main ๋ฉ์๋๊ฐ ์คํ๋๋ฉด ์คํ์ main ํจ์์ ์ฝ ์คํ์ด ์์ฑ๋๊ฒ ๋ฉ๋๋ค. ์ด ๊ณต๊ฐ์ main ํจ์์์ ์์ฑ๋๋ ์ง์ญ ๋ณ์๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ์ฝ ์คํ์ด ์์ฑ๋ ํ, int a = 10์ด ์ํ๋๋ฉด main์ ์ฝ ์คํ์ ์์์ ์ฃผ์์ธ 0x001 ์ฃผ์์ 10์ด๋ผ๋ ๊ฐ์ a์ ํ ๋นํฉ๋๋ค.
๊ทธ ํ, modify(a) ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ฅผ ํตํด modify ์ฝ ์คํ์ด ์์ฑ๋๊ณ ํด๋น ์์น์ ์ง์ญ ๋ณ์ a์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ ๋๊ฒจ์ค main ์ฝ ์คํ์ a๊ฐ์ ๋ณต์ฌ๋ณธ์ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฐ ํ์, modify ๋ฉ์๋์์ ๊ฐ์ ์์ ํ์ง๋ง ์ฃผ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ main ๋ฉ์๋์ a์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ด์ ๊ฐ์ด main๊ณผ modify์ ๋ณ์ ์ด๋ฆ์ ๊ฐ์ง๋ง ์๋ก ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์์ ํ๋๋ผ๋ ์๋ณธ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ด๋ ํจ์ ๋ด๋ถ์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ์๋์ ๋ณ์์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ํ์ง๋ง ์ด๋ ๊ฐ์ ๋ณต์ฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ผ๋ฉฐ, ํนํ ํฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
Call by Reference
Call by Reference๋ ํจ์๊ฐ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ์ฌ ์์ ์ ์ํํ๋ ๋ฐฉ์์ ๋๋ค. ์ด ๊ฒฝ์ฐ, ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์๋์ ๋ณ์์ ๊ฐ๋ ํจ๊ป ๋ณ๊ฒฝ๋ฉ๋๋ค.
๐ซ ์์ ์ฝ๋๋ ์ดํด๋ฅผ ์ํด C++๋ก ์์ฑ๋์์ต๋๋ค.
#include <iostream>
using namespace std;
void modify(int& a) {
a = 20;
}
int main() {
int a = 10;
modify(a);
cout << a << endl;
}
์คํ ๊ฒฐ๊ณผ:
20
Call by Value์ ๋ฌ๋ฆฌ ์ด๋ฒ์๋ ์๋ณธ ๋ณ์์ ๊ฐ์ด 10์์ 20์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ด๋ป๊ฒ ์ด๊ฒ ๊ฐ๋ฅํ ๊ฑด์ง ์ฝ๋๋ฅผ ์ํํ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ณผ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ ์ฝ๋์์ int a = 10์ ์ํํ๋ฉด ์๋์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ ํ, modify(a)๋ฅผ ํธ์ถํ๋ฉด modify(int &a)๋ฅผ ์ํํ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ int& a๋ ์ธ์๋ก ๋๊ฒจ์ค ๋ณ์์ ์ฐธ์กฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ทธ๋ก ์ธํด modify์ a๋ ์ฃผ์๋ฅผ ํ ๋น๋ฐ์ง ์๊ณ main์ a๋ฅผ ์ง์ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ก ์ธํด modify ๋ฉ์๋ ์์์ ๊ฐ์ ์์ ํ๋๋ผ๋ a๋ main์ ์๋ a๋ฅผ ์ฐธ์กฐํ๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ ์ํฅ์ ๋ผ์น๊ฒ ๋ฉ๋๋ค.
์ ๋ฆฌํด ๋ณด์๋ฉด Call by Value๋ ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์๋์ ๊ฐ์ ๋ณต์ฌ๋ณธ์ ์ ๋ฌํ๋ ๋ฐฉ์์ด๊ณ , Call by Reference๋ ๋ณ์์ ์ฐธ์กฐ๋ฅผ ์ง์ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋๋ค.
Java์์์ Call by Value์ Call by Reference
์ง๊ธ๊น์ง๋ C++๋ฅผ ํตํด Call by Value์ Call by Reference๊ฐ ๊ฐ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ดค์ต๋๋ค. C++์์๋ ๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌํด์ ์ ๋ฌํ๋ Call by Value์ ์๋ณธ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ ์ ์๋ Call by Reference๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด Java์์๋ ์ด๋จ๊น์?
Java์์ ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ฉด Call by Reference์ผ๊น?
์ฌ์ค Java๋ C++๊ณผ๋ ๋ค๋ฅธ ํน์ง์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํจ์ ํธ์ถ ๋ฐฉ์์ด ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค. ๋ฐ๋ก Java์๋ Call by Reference๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ์ ์ ๋๋ค.
๋ง์ ์ฌ๋๋ค์ด Java์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๋ Call by Reference์ฒ๋ผ ๋์ํ๋ค๊ณ ์ฐฉ๊ฐํ๋๋ฐ, ์ฌ์ค Java๋ ์ค์ง Call by Value๋ง์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๋ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ด์ ๋ Java์ ๊ฐ์ฒด ๊ด๋ฆฌ ๋ฐฉ์๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด ์๋ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋๋ ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Jwooo");
modify(p);
System.out.println(p.name);
}
static void modify(Person p) {
p.name = "woooJ";
}
}
์คํ ๊ฒฐ๊ณผ:
woooJ
Person p = new Person("Jwooo")๋ฅผ ์คํํ ์ํ์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ต๋๋ค.
ํด๋น ๋ฌธ์ฅ์ด ์คํ๋๋ฉด, ํ ๋ฉ๋ชจ๋ฆฌ์ Person ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , main์ ์ง์ญ ๋ณ์ p(0x001)์๋ ํด๋น ๊ฐ์ฒด์ ์ฃผ์ ๊ฐ(0x002)์ด ์ ์ฅ๋ฉ๋๋ค.
๊ทธ ํ, modify ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ p(0x003)๋ main์ p(0x001)๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฃผ์ ๊ฐ(0x002)์ ๋ณต์ฌํด์ ์ ๋ฌ๋ฐ์ต๋๋ค. ๋ฐ๋ผ์ modify ๋ด๋ถ์ p(0x003)๋ ๊ฐ์ Person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ฒ ๋ฉ๋๋ค.
modify ๋ด๋ถ์์๋ p.name์ ์์ ํ๊ฒ ๋๋๋ฐ, ๋ฉ์๋ ๋ด๋ถ์ p(0x003)๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก, p.name์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์ฒด์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ฒ ๋ฉ๋๋ค. ์ด๋ main์ p(0x001)์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์ ์ํฅ์ ๋ฐ๊ฒ ๋๊ณ main์์ p.name์ ์ถ๋ ฅํ๊ฒ ๋๋ฉด woooJ๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋๋ค.
์ด๋ ๊ฒ ์ธ์๋ก ๋์ด์จ ๋ณ์์ ์ฐธ์กฐ๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ ๋ณต์ฌํ์ฌ ๋๊ธฐ๋ ๋ฐฉ์์ธ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์์ง ์๋ฌธ์ ์ด ๋จ์์์ ์ ์์ต๋๋ค. ์์ ์์ ๋ฅผ ๋ณด๊ณ "๊ฒฐ๊ตญ ์ฃผ์๋ฅผ ํตํด ๊ฐ์ด ๋ณ๊ฒฝ๋์์ผ๋ Call by Reference๋ก ๋์ํ๋ ๊ฒ์ด ์๋๊ฐ?"๋ผ๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ํ์์ ๋๋ค.
๋ง์ฝ Java๊ฐ Call by Reference๋ผ๋ฉด, ๋ฉ์๋ ๋ด๋ถ์์ ๊ฐ์ฒด๋ฅผ ์๋ก์ด ๊ฐ์ฒด๋ก ์ฌํ ๋นํ๋ฉด ์๋ณธ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ๋์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์์ ์ฝ๋๋ฅผ ํตํด ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Jwooo");
modify(p);
System.out.println(p.name);
}
static void modify(Person p) {
p = new Person("woooJ");
}
}
์คํ ๊ฒฐ๊ณผ:
Jwooo
์ ์ฝ๋์์๋ modify ๋ฉ์๋ ๋ด๋ถ์์ p = new Person("woooJ")๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง๋ง, main์์ ์ถ๋ ฅ๋ ๊ฐ์ ์ฌ์ ํ Jwooo์ ๋๋ค.
์ด์ ๋ ๊ฐ๋จํฉ๋๋ค. Java์์๋ ๋ฉ์๋ ํธ์ถ ์ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ ๋ณต์ฌํด์ ์ ๋ฌํ๋ฏ๋ก, ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฌํ ๋นํด๋ ์๋์ ์ฐธ์กฐ์๋ ๋ฌด๊ดํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฆ, modify ๋ด๋ถ์์ p๊ฐ ์๋ก์ด Person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋๋ผ๋, ์ด๋ modify์ ์ง์ญ ๋ณ์ p(0x003)์ด ๋ฐ๋ ๊ฒ์ด์ง main์ p(0x001)์๋ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ Java๋ Call by Reference๊ฐ ์๋๋ผ "๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ"์ Call by Value ๋ฐฉ์์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
Java๋ ์ Call by Reference๋ฅผ ์ง์ํ์ง ์์๊น?
C++๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ๋ค๋ฃฐ ์ ์๋ ํฌ์ธํฐ์ ์ฐธ์กฐ๋ฅผ ํ์ฉํ์ฌ Call by Reference๋ฅผ ์ง์ํ ์ ์์์ต๋๋ค. ํ์ง๋ง Java๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ ์ดํ ์ ์๋ ํฌ์ธํฐ๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ชจ๋ ๊ฐ์ Call by Value๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ ์ฑํํ์ต๋๋ค.
์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ํ๋ณดํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํตํ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ง์ ํฌ์ธํฐ๋ฅผ ์ง์ ๋ค๋ฃจ๋ฉด์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค๊ณ ์ฒ ํ ๋๋ฌธ์ ๋๋ค.
๊ฒฐ๋ก
Java์์ ๊ฐ์ฒด๋ฅผ ๋๊ธธ ๋ ์ฐธ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์ค์ ๋ก๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋ฉ๋๋ค. ์ฆ, ๋ฉ์๋ ๋ด๋ถ์์ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ฉด ์๋ณธ ๊ฐ์ฒด์๋ ์ํฅ์ ๋ฏธ์น์ง๋ง, ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ฉด ์๋ณธ ๊ฐ์ฒด์๋ ๋ฌด๊ดํ๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์ด๋ฌํ ํน์ง ๋๋ฌธ์, Java๋ Call by Reference๊ฐ ์๋๋ผ Call by Value์์ ์ ์ ์์ต๋๋ค.
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Java์ GC (0) | 2025.03.02 |
---|---|
ConcurrentHashMap์ ์ด๋ป๊ฒ ๋์์ฑ์ ๋ณด์ฅํ ๊น? (0) | 2024.10.28 |
CompletableFuture์ ForkJoinPool (0) | 2024.08.08 |