[루비 사용자 가이드] 전역 변수

루비/레일스 프로그래밍/루비 사용자 가이드 2009.02.05 22:03

전역 변수는 $로 시작하는 변수입니다. 전역 변수는 프로그램 아무데서나 사용될 수 있습니다. 초기화 하지 않은 전역 변수는 nil값을 지닙니다.

ruby> $foo
   nil
ruby> $foo = 5
   5
ruby> $foo
   5

전역 변수는 적절한 곳에만 사용해야 합니다. 전역 변수는 아무데서나 쓰고 읽을 수 있기 때문에 위험합니다. 전역변수를 남용하는 것은 버그를 여기저기 퍼지기 쉽게 합니다. 또한, 전역변수가 많이 사용되었다는 것은 프로그램 디자인이 신중하게 이루어지지 못했음을 나타내는 증거라 할 수 있습니다. 여러분이 전역변수가 필요하다고 생각할 때마다, 나중에 무심코 다른 곳에서 사용되지 못하도록 최대한 자세한 설명이 되는 이름을 짓도록 하십시오(위 코드와 같이 $foo와 같은 이름을 사용하는 것은 좋은 생각이 못됩니다).

전역변수의 한 가지 좋은 점은 변경을 추적할 수 있다는 것입니다. 전역변수의 값이 변경될 때마다 호출되는 프로시저를 설정할 수 있습니다.

ruby> trace_var :$x, proc{puts "$x is now #{$x}"}
   nil
ruby> $x = 5
$x is now 5
   5

전역 변수가 변경시마다 프로시저를 호출하도록 지정된 경우에 액티브 변수(active variable)라 불리기도 합니다. 액티브 변수가 유용한 한 예로 GUI 화면이 최신 내용을 반영하도록 하는 것을 들 수 있습니다.

이름이 달러 기호($)와 그 뒤의 한 문자로 이루어진 특별한 변수들이 있습니다. 예를 들어 $$는 루비 인터프리터의 프로세스 아이디를 저장하고 있으며, 읽기만 가능합니다. 아래 표에 중요한 시스템 변수를 몇 가지 정리해 두었습니다.

$! 마지막 에러 메시지
$@ 에러가 발생한 위치
$_ gets가 마지막으로 읽어들인 스트링
$. 인터프리터가 마지막으로 읽어들인 라인 번호
$& 정규식에 의해 매치된 마지막 스트링
$~ 마지막으로 매치된 정규식 매치(부분식의 배열 형태)
$n 마지막 매치의 n번째 부분 식($~[n]과 동일)
$= 대소문자 구분 플래그
$/ 입력 레코드 구분자(separator)
$\ 출력 레코드 구분자(separator)
$0 루비 스크립트 파일의 이름
$* 커맨드 라인 인자들
$$ 인터프리터의 프로세스 아이디(ID)
$? 마지막으로 실행되었던 자식 프로세스의 종료 상태(exit status)

위에 나열된 변수 중에서 $_$~는 지역 범위를 가집니다. 이름은 전역변수여야 할 것 처럼 되어 있지만, 지역범위를 가질 때 더더욱 유용합니다. 또한, 그 변수들은 역사적 이유로 그런 이름이 붙었습니다(역주:Perl에 있는 특수 변수를 이어받아서 그렇습니다).

신고
Trackbacks 2 : Comment 0

티스토리 툴바