Ruby 변수 종류 4가지 정리 (지역 변수, 전역 변수, 인스턴스 변수, 클래스 변수)
Ruby에서의 지역 변수, 전역 변수, 인스턴스 변수, 클래스 변수의 특징과 차이점들에대해 알려드리도록 하겠습니다.
최대한 이해하기 쉽게 실제 테스트 결과와 함께 설명드리도록 하겠습니다!
지역 변수
var1 = "문자열"
var2 = 2
var3 = 1.5
var4 = ["a", "b", "c"]
var5 = {a: "A", b: "B"}
var6 = true
var7 = nil
puts var1, var2, var3, var4, var5, var6, var7
# Output
# 문자열
# 2
# 1.5
# a
# b
# c
# {:a=>"A", :b=>"B"}
# true
#
변수명을 소문자나 Underscore(_)로 시작하여 생성할 수 있는 변수로
지역 변수이기에 선언된 블록, 메소드, 클래스, 모듈 등의 스코프를 벗어난 위치에서 사용할 수 없습니다.
var1 = 1
var2 # 에러발생 [undefined local variable or method `var2' for main:Object (NameError)]
지역변수는 선언시 초기화를 하지않으면 NameError가 발생합니다!
전역 변수
$var1 = 1
$var2
puts $var1, $var2
# Output
# 1
#
프로그램 전역에서 사용 가능한 전역변수로 $ 기호로 시작하여 선언할 수 있습니다.
지역변수와 달리 초기 값을 지정해주지 않아도 NameError가 발생하지 않고 nil 값을 가지게 됩니다.
인스턴스 변수
인스턴스 내에서 사용 가능한 변수로 @ 기호로 시작하여 선언할 수 있습니다.
class Test
def set(str)
@name = str
puts "이름이 #{@name}(으)로 설정되었습니다."
end
def get
return @name
end
end
if __FILE__ == $0 then
test = Test.new
test.set("테스트")
puts "이름은 #{test.get} 입니다."
end
# Output
# 이름이 테스트(으)로 설정되었습니다.
# 이름은 테스트 입니다.
위 코드에서 [Test] 라는 이름의 클래스에서 @name 이라는 인스턴스 변수가 [set]이라는 메소드에서 선언되지만
다른 메소드인 [get] 이라는 메소드에서 스코프가 다르지만 해당 변수를 사용할 수 있는 것을 확인할 수 있습니다.
만약 @을 사용하지 않고 선언하여 지역변수로 선언을 하게 된다면,
class Test
def set(str)
name = str
puts "이름이 #{name}(으)로 설정되었습니다."
end
def get
return name
end
end
if __FILE__ == $0 then
test = Test.new
test.set("테스트")
puts "이름은 #{test.get} 입니다."
end
# Output
# 이름이 테스트(으)로 설정되었습니다.
# test.rb:8:in `get': undefined local variable or method `name' for #<Test:0x00007fe1958c5860> (NameError) from test.rb:16:in `<main>'
[set] 메소드를 실행할때는 문제가 없겠지만,
[get] 메소드가 실행될 때 위와 같이 NameError가 발생하는 것을 확인하실 수 있습니다.
인스턴스 변수로 선언되지 않은 지역 변수는 선언된 변수의 스코프는 선언된 메소드 내부까지이기 때문입니다.
클래스 변수
해당 클래스로 선언된 모든 인스턴스에서 공유되는 변수로 @ 기호를 2번 사용한 @@로 시작하여 선언할 수 있습니다.
class Test
@@cv = 0
def initialize
@n = 0
end
def get
return "#{@@cv} / #{@n}"
end
def sum
@@cv += 1
@n += 1
end
end
if __FILE__ == $0 then
test1 = Test.new
test2 = Test.new
puts "test1의 초기 @@cv / @n : #{test1.get}"
puts "test2의 초기 @@cv / @n : #{test2.get}"
test1.sum
test2.sum
puts "더하기 후 test2 @@cv / @n : #{test2.get}"
puts "더하기 후 test1 @@cv / @n : #{test1.get}"
end
# Output
# test1의 초기 @@cv / @n : 0 / 0
# test2의 초기 @@cv / @n : 0 / 0
# 더하기 후 test2 @@cv / @n : 2 / 1
# 더하기 후 test1 @@cv / @n : 2 / 1
위 코드에서 [Test] 라는 이름의 클래스에서 @@cv 라는 클래스 변수가 존재하고,
인스턴스 생성시 초기화 메소드인 [initialize] 에 @n 인스턴스 변수가 존재합니다.
[Test] 클래스의 인스턴스 [test1] 과 [test2] 를 선언하고 두 인스턴스를 선언한 뒤 @@cv의 값과 @n의 값은 둘 다 0인 것을 확인할 수 있습니다.
그리고는 [test1]과 [test2]의 [sum] 메소드를 실행하여 각각에서 @@cv와 @n의 값을 1씩 증가시켜준 뒤,
각각의 @@cv와 @n을 다시 확인해보면 @n의 경우 인스턴스 변수로서 각 인스턴스별로 1씩 증가시켰기에 1이라는 값을 가지고 있지만,
@@cv의 경우 클래스 변수로서 2개의 인스턴스가 함께 공유하고 있기에 1씩 2번 증가 되어 2라는 값을 가지게 됩니다.
이상으로 Ruby에서의 지역 변수, 전역 변수, 인스턴스 변수, 클래스 변수에 대한 설명을 마치도록 하겠습니다.
도움이 되셨다면 공감, 댓글 부탁드립니다!
궁금하신 점이나 요청사항은 언제든지 말씀해주세요!
피드백도 언제나 환영입니다!
감사합니다.
'Developer > Ruby' 카테고리의 다른 글
Ruby 문자열 거꾸로 뒤집는 방법 - String.reverse (0) | 2022.09.07 |
---|---|
Ruby 주석 사용하는 방법 (How to write comments in Ruby) (0) | 2022.09.06 |
Ruby 출력 함수 print vs puts vs p 차이 (0) | 2022.09.05 |
Ruby kind_of vs is_a vs instance_of 차이 (0) | 2022.09.04 |
Ruby 타입 확인 및 비교하는 방법 - How to check type in Ruby (0) | 2022.09.03 |
댓글