본문 바로가기

Back_End(Ruby on Rails)

Basic Principle of Ruby Variable Assignment

반응형

Key points assigning variables in Ruby(루비에서의 변수 할당 원칙)

  • 루비에서의 변수는 해당 개체의 값의 참조가 아니고, 개체의 ‘위치’ 에 대한 참조다.

  • 루비에서의 변수간 할당은 pass-by value로 전달된다! (Pass-by reference의 반대)

얼마전 코드리뷰에서 굳이 불필요한 변수 할당은 자제하라는 피드백을 꽤 여러 번 받았다. 그냥 스택 메모리를 변수가 차지하는 공간만큼 조금씩 잡아먹는다 정도로 생각하고, 크게 생각은 안했었는데, 이 참에 Ruby의 변수 할당 원리/원칙을 정리하고자 한다. 몇 가지 간단한 예시로 루비에서의 변수 할당이 어떻게 작동하는지 살펴보자.

“Ruby” String 클래스의 object를 a, b라는 변수에 할당한다. 각각 의 object.id가 다름 -> 정확히 동작을 얘기하면, a= “Ruby” 를 실행하는 순간, 컴퓨터에서는 “Ruby”라는 새로운 String Object를 만드는 것이다. 이때 a에 이를 할당하는 과정은 a를 reference point to the “Ruby” object 라고 말해주는 것이다. 이때, a,b 의 오브젝트 id( 즉, 개체가 있는 주소) 가 다른 이유는, “Ruby”는 같은 값(same value) 를 가지지만, 다른 메모리 스페이스를 차지하면서 만들어진 독립된 개체기 때문이다. 

 이 경우에 b는 다른 “Ruby” 개체의 주소를 가리키기 때문에, a에서 수정이 일어나도, 변형되지 않는다. 

a에 “Ruby” String class 의 오브젝트를 할당함(물론 타입은 reference pointer).

b에 a를 할당함. (pass by value이므로) b도 역시 똑같은 ref point 다.

 

그럼 rails 코드에서 잦은 변수 할당을 지양해야 하는 이유는? 

우선 동적으로 함수안에서 변수를 할당하면, 해당 변수는 위의 변수 할당 원칙에 따라 힙 스페이스에 있는 개체를 가리키는 포인터변수로 생각할 수 있다. 

그럼 실제 힙 안에 있는 개체 데이터가 없어진다면?? 

할당한 변수는 개체 데이터의 벨류값을 가리키는 것이 아니고, 그 벨류값의 메모리상 주소(location)를 포인팅하기 때문에 null 을 가리키는 셈이 된다.. 즉, 잦은, 불필요한 변수 선언 및 해당 변수의 사용은, 이런 경우에 변수의 유효성을 잃을 수 있음 (null 값의 주소를 가리키는 변수가 필요 있겠나..)

추가로 지양해야 할 이유로는 어차피 변수도 메모리에 담기는 것임.(동적으로 Stack에 할당되고, 개체의 힙을 가리키는 형태로 이해함). 굳이 불필요한 변수를 스택에 올릴 필요가 있나 싶음

 

Reference1: https://medium.com/techtrument/the-basics-of-variable-assignment-in-ruby-ca8daf478e6e

Reference2: https://www.guru99.com/java-stack-heap.html

 

반응형