페이지 불러오는 중
결론부터 말하면 "함수 내부에서 객체의 내부 상태(필드/요소)를 수정하면 원본이 변경되지만, 매개변수 자체에 새로운 객체를 재할당(Reassignment)하면 원본은 변경되지 않는다."
이 동작 원리를 이해하려면 Primitive vs Reference, Immutable vs Mutable 키워드와 Java의 Pass-by-Value, Python의 Call-by-Sharing(Pass-by-Assignment) 메커니즘을 알아야 한다.
Java는 오직 Pass-by-Value(값에 의한 전달) 방식으로만 동작한다.
다만, 참조 타입(Reference Type)을 넘길 때는 "객체의 주소값(Reference Value)을 복사해서 전달"한다.
public class JavaPassByValue {
public static void main(String[] args) {
int a = 10;
String str = "Hello";
modifyPrimitive(a);
modifyImmutable(str);
System.out.println("a: " + a); // 10 (원본 변경 안 됨)
System.out.println("str: " + str); // Hello (원본 변경 안 됨)
}
static void modifyPrimitive(int val) {
val = 999; // 복사된 값만 변경
}
static void modifyImmutable(String s) {
s = "World"; // String은 Immutable이므로 새로운 String 객체가 할당됨
}
}class Person {
String name;
Person(String name) { this.name = name; }
}
public class JavaReferenceTest {
public static void main(String[] args) {
Person p1 = new Person("Alice");
Person p2 = new Person("Bob");
modifyField(p1);
reassignObject(p2);
System.out.println("p1.name: " + p1.name); // Charlie (🔥 원본 변경됨!)
System.out.println("p2.name: " + p2.name); // Bob (원본 변경 안 됨!)
}
// 1. 객체의 내부 필드 수정 -> 원본 변경 O
static void modifyField(Person p) {
p.name = "Charlie"; // p가 가리키는 동일한 Heap 객체의 필드를 변경
}
// 2. 매개변수에 새 객체 재할당 -> 원본 변경 X
static void reassignObject(Person p) {
p = new Person("David"); // 복사된 참조 변수 p가 새로운 객체를 바라보게 됨
}
}Python은 Call-by-Sharing (Pass-by-Object-Reference) 방식을 사용한다.
전달되는 객체가 Immutable인가 Mutable인가에 따라 동작이 달라진다.
int, str, tuple -> 원본 변경 불가)Python에서 Immutable 객체의 값을 변경하려 하면, 기존 객체를 수정하는 것이 아니라 새로운 객체를 생성하여 변수에 재바인딩한다.
def modify_immutable(num, text):
num = num + 100 # 새로운 int 객체 할당
text = text + " World" # 새로운 str 객체 할당
a = 10
s = "Hello"
modify_immutable(a, s)
print(f"a: {a}") # 10 (원본 변경 안 됨)
print(f"s: {s}") # Hello (원본 변경 안 됨)list, dict, 커스텀 객체 -> 내부 수정 vs 재할당)class User:
def __init__(self, name):
self.name = name
def modify_mutable_element(lst, user):
lst.append(99) # 가변 객체 내부 요소 추가 -> 원본 변경 O
user.name = "Updated" # 가변 객체 내부 속성 변경 -> 원본 변경 O
def reassign_mutable(lst):
lst = [100, 200, 300] # 새 객체 재할당 -> 원본 변경 X
my_list = [1, 2, 3]
my_user = User("Initial")
modify_mutable_element(my_list, my_user)
print("my_list:", my_list) # [1, 2, 3, 99] (🔥 원본 변경됨!)
print("my_user.name:", my_user.name) # Updated (🔥 원본 변경됨!)
reassign_mutable(my_list)
print("my_list after reassign:", my_list) # [1, 2, 3, 99] (원본 변경 안 됨!)[함수에 인자로 전달할 때]
가변 객체 (Mutable) 불변 객체 (Immutable) / Primitive
┌───────────┴───────────┐ │
내부 상태/필드 수정 새 객체 재할당(Reassign) 값 수정 시도
│ │ │
▼ ▼ ▼
🔥 원본 객체 변경됨! 원본 변경 안 됨! 원본 변경 안 됨!set, append, .field = )할 때만 원본이 변경된다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.