두 가지 코드 모두 Dart에서 클래스 객체와 변수(기본형 데이터 타입)가 함수에 전달될 때 어떤 변화를 보이는지 알아보는 예시입니다. 특히 함수 내부에서 값이 변경되었을 때 그 값이 함수 밖에서도 유지되는지에 중점을 두고 있습니다. 각각의 경우를 살펴보겠습니다.
class Temp {
bool temp = false;
Temp();
}
void main() {
Temp temp = new Temp();
print('before temp : ${temp.temp}');
setTemp(temp);
print('after temp : ${temp.temp}');
}
void setTemp(Temp temp) {
temp.temp = true;
}
이 코드에서 Temp는 temp라는 bool 속성을 가진 클래스이며, 이 속성은 기본값이 false로 설정되어 있습니다.
main() 함수에서 새로운 Temp 객체를 생성하고, 이 객체의 temp 속성은 기본적으로 false입니다.
setTemp(temp) 함수를 호출한 후, 함수 내에서 temp.temp = true로 변경됩니다.
클래스 객체는 참조에 의해 전달되기 때문에, 해당 객체의 주소값에 의해 함수 내에서 객체에 대한 변경 사항이 원본 객체에 영향을 미치지 않습니다. 따라서 setTemp() 함수 호출 후에 temp.temp가 true로 바뀝니다.
before temp : false
after temp : true
void main() {
bool temp = false;
print('before temp : $temp');
setTemp(temp);
print('after temp : $temp');
}
void setTemp(bool temp) {
temp = true;
}
여기서 temp는 bool 변수이며, 처음에는 false로 설정됩니다.
temp 변수를 setTemp(temp)에 전달하면, 값에 의해 전달되기 때문에 변수의 복사본이 함수로 전달됩니다.
setTemp 함수 내부에서 이 복사된 변수는 false로 변경되지만, 이는 원본 변수에 영향을 주지 않습니다. 따라서 함수 외부에서 temp는 여전히 변경되지 않고 false로 남아있습니다.
값에 의한 전달 방식을 사용하면, 함수 내부에서 변수 값을 마음대로 변경하더라도 원본 데이터는 보호됩니다. 이는 데이터 무결성을 보장하는 데 매우 유용하며, 특정 함수가 다른 함수나 로직에 예상치 못한 영향을 미치지 않도록 해줍니다.
before temp : false
after temp : false
클래스 객체는 참조에 의해 전달되므로 함수 내에서 변경된 사항이 함수 외부에서도 반영됩니다.
기본형 타입(예: bool)은 값에 의해 전달되므로 함수 내에서의 변경 사항이 함수 외부에는 영향을 미치지 않습니다.
클래스 = 주소값을 전달함으로 원본값이 변경됨 (O)
기본값 = 복사값을 전달함으로 원본값이 변경안됨. (X)
참고 블로그