본문 바로가기
Developer/Ruby

Ruby 타입 확인 및 비교하는 방법 - How to check type in Ruby

by roqkfrlfhr 2022. 9. 3.

Ruby 타입 확인 및 비교하는 방법 - How to check type in Ruby


Ruby에서 타입을 체크하고 비교하여 확인하는 방법을 알려드리도록 하겠습니다.

좀 더 다양한 케이스를 보여드리기 위해 테스트를 위해 루비의 자료형별로 변수를 하나씩 선언 및 초기화 하고,

새로운 클래스 'Flower'와 'Flower' 클래스를 상속받은 'Freesia' 라는 클래스를 선언하여 해당 클래스에 대해서도 인스턴스를 하나씩 생성하여 사용하였습니다.

 

타입 확인, 출력 하는 방법 - [변수.class] / [변수.class.name]

class Flower
end

class Freesia < Flower
end


var0 = "문자열"
p var0.class, var0.class.name # String "String"

var1 = 2
p var1.class, var1.class.name # Integer "Integer"

var2 = 1.5
p var2.class, var2.class.name # Float "Float"

var3 = ["a", "b", "c"]
p var3.class, var3.class.name # Array "Array"

var4 = {a: "A", b: "B"}
p var4.class, var4.class.name # Hash "Hash"

var5 = true
p var5.class, var5.class.name # TrueClass "TrueClass"

var6 = false
p var6.class, var6.class.name # FalseClass "FalseClass"

var7 = nil
p var7.class, var7.class.name # NilClass "NilClass"

var8 = Flower.new
p var8.class, var8.class.name # Flower "Flower"

var9 = Freesia.new
p var9.class, var9.class.name # Freesia "Freesia"

[변수.class]를 사용하여 변수의 클래스, 즉 타입을 확인할 수 있습니다.
[변수.class.name]을 사용하면 해당 타입문자열로 얻어올 수도 있습니다.

 

 

타입 비교하는 방법

1. 변수.class == Class 방법

class Flower
end

class Freesia < Flower
end

var0 = "문자열"
var1 = 2
var2 = 1.5
var3 = ["a", "b", "c"]
var4 = {a: "A", b: "B"}
var5 = true
var6 = false
var7 = nil
var8 = Flower.new
var9 = Freesia.new

puts "[var0] 값 : #{var0} / class : #{var0.class} / Type Check 예시 : #{var0.class == String}, #{var0.class == Integer}"
puts "[var1] 값 : #{var1} / class : #{var1.class} / Type Check 예시 : #{var1.class == Integer}, #{var1.class == Float}"
puts "[var2] 값 : #{var2} / class : #{var2.class} / Type Check 예시 : #{var2.class == Float}, #{var2.class == Array}"
puts "[var3] 값 : #{var3} / class : #{var3.class} / Type Check 예시 : #{var3.class == Array}, #{var3.class == Hash}"
puts "[var4] 값 : #{var4} / class : #{var4.class} / Type Check 예시 : #{var4.class == Hash}, #{var4.class == TrueClass}"
puts "[var5] 값 : #{var5} / class : #{var5.class} / Type Check 예시 : #{var5.class == TrueClass}, #{var5.class == FalseClass}"
puts "[var6] 값 : #{var6} / class : #{var6.class} / Type Check 예시 : #{var6.class == FalseClass}, #{var6.class == NilClass}"
puts "[var7] 값 : #{var7} / class : #{var7.class} / Type Check 예시 : #{var7.class == NilClass}, #{var7.class == String}"
puts "[var8] 값 : #{var8} / class : #{var8.class} / Type Check 예시 : #{var8.class == Flower}, #{var8.class == Freesia}"
puts "[var9] 값 : #{var9} / class : #{var9.class} / Type Check 예시 : #{var9.class == Freesia}, #{var9.class == Flower}"


# Output
# [var0] 값 : 문자열 / class : String / Type Check 예시 : true, false
# [var1] 값 : 2 / class : Integer / Type Check 예시 : true, false
# [var2] 값 : 1.5 / class : Float / Type Check 예시 : true, false
# [var3] 값 : ["a", "b", "c"] / class : Array / Type Check 예시 : true, false
# [var4] 값 : {:a=>"A", :b=>"B"} / class : Hash / Type Check 예시 : true, false
# [var5] 값 : true / class : TrueClass / Type Check 예시 : true, false
# [var6] 값 : false / class : FalseClass / Type Check 예시 : true, false
# [var7] 값 :  / class : NilClass / Type Check 예시 : true, false
# [var8] 값 : #<Flower:0x00007fcc5f8cfc70> / class : Flower / Type Check 예시 : true, false
# [var9] 값 : #<Freesia:0x00007fcc5f8cfc48> / class : Freesia / Type Check 예시 : true, false

[변수.class == Class] 로 타입을 비교 확인할 수 있습니다.
변수에 .class 를 사용하면 각 자료형별 클래스를 확인할 수 있는 것을 이용하여 해당 변수.class에 비교 연산자인 [==]로 확인하고싶은 클래스와 같은지 비교할 수 있습니다.



2. 변수.class.name == Class이름(문자열) 방법

class Flower
end

class Freesia < Flower
end

var0 = "문자열"
var1 = 2
var2 = 1.5
var3 = ["a", "b", "c"]
var4 = {a: "A", b: "B"}
var5 = true
var6 = false
var7 = nil
var8 = Flower.new
var9 = Freesia.new

puts "[var0] 값 : #{var0} / class : #{var0.class.name} / Type Check 예시 : #{var0.class.name == "String"}, #{var0.class.name == "Integer"}"
puts "[var1] 값 : #{var1} / class : #{var1.class.name} / Type Check 예시 : #{var1.class.name == "Integer"}, #{var1.class.name == "Float"}"
puts "[var2] 값 : #{var2} / class : #{var2.class.name} / Type Check 예시 : #{var2.class.name == "Float"}, #{var2.class.name == "Array"}"
puts "[var3] 값 : #{var3} / class : #{var3.class.name} / Type Check 예시 : #{var3.class.name == "Array"}, #{var3.class.name == "Hash"}"
puts "[var4] 값 : #{var4} / class : #{var4.class.name} / Type Check 예시 : #{var4.class.name == "Hash"}, #{var4.class.name == "TrueClass"}"
puts "[var5] 값 : #{var5} / class : #{var5.class.name} / Type Check 예시 : #{var5.class.name == "TrueClass"}, #{var5.class.name == "FalseClass"}"
puts "[var6] 값 : #{var6} / class : #{var6.class.name} / Type Check 예시 : #{var6.class.name == "FalseClass"}, #{var6.class.name == "NilClass"}"
puts "[var7] 값 : #{var7} / class : #{var7.class.name} / Type Check 예시 : #{var7.class.name == "NilClass"}, #{var7.class.name == "String"}"
puts "[var8] 값 : #{var8} / class : #{var8.class.name} / Type Check 예시 : #{var8.class.name == "Flower"}, #{var8.class.name == "Freesia"}"
puts "[var9] 값 : #{var9} / class : #{var9.class.name} / Type Check 예시 : #{var9.class.name == "Freesia"}, #{var9.class.name == "Flower"}"

# Output
# [var0] 값 : 문자열 / class : String / Type Check 예시 : true, false
# [var1] 값 : 2 / class : Integer / Type Check 예시 : true, false
# [var2] 값 : 1.5 / class : Float / Type Check 예시 : true, false
# [var3] 값 : ["a", "b", "c"] / class : Array / Type Check 예시 : true, false
# [var4] 값 : {:a=>"A", :b=>"B"} / class : Hash / Type Check 예시 : true, false
# [var5] 값 : true / class : TrueClass / Type Check 예시 : true, false
# [var6] 값 : false / class : FalseClass / Type Check 예시 : true, false
# [var7] 값 :  / class : NilClass / Type Check 예시 : true, false
# [var8] 값 : #<Flower:0x00007fd62b9bf8a8> / class : Flower / Type Check 예시 : true, false
# [var9] 값 : #<Freesia:0x00007fd62b9bf880> / class : Freesia / Type Check 예시 : true, false

앞서 말씀드린 [변수.class == Class] 방법과 비슷한 방식이긴 하지만 혹여나 싶어 소개하는 방법입니다.
[변수.class] 를 사용하여 얻은 클래스 자체를 비교하는 것이 아니라 한번 더 [.name]을 사용하여 클래스의 이름을 문자열로 얻어온 뒤,
비교할 클래스의 이름을 문자열로 입력하고 비교하는 방법입니다.
아무래도 [.name] 을 한번 더 사용해야 한다는 것과 클래스의 이름을 직접 문자열로 적을 때 실수로 잘못 적더라도 에러가 발생하지 않기 때문에 실수가 일어날 수 있기에 추천하는 방법은 아닙니다.


3. [변수.kind_of? Class] OR [변수.kind_of?(Class)] 방법

class Flower
end

class Freesia < Flower
end

var0 = "문자열"
var1 = 2
var2 = 1.5
var3 = ["a", "b", "c"]
var4 = {a: "A", b: "B"}
var5 = true
var6 = false
var7 = nil
var8 = Flower.new
var9 = Freesia.new

puts "[var0] 값 : #{var0} / class : #{var0.class} / Type Check 예시 : #{var0.kind_of? String}, #{var0.kind_of? Integer}"
puts "[var1] 값 : #{var1} / class : #{var1.class} / Type Check 예시 : #{var1.kind_of? Integer}, #{var1.kind_of? Float}"
puts "[var2] 값 : #{var2} / class : #{var2.class} / Type Check 예시 : #{var2.kind_of? Float}, #{var2.kind_of? Array}"
puts "[var3] 값 : #{var3} / class : #{var3.class} / Type Check 예시 : #{var3.kind_of? Array}, #{var3.kind_of? Hash}"
puts "[var4] 값 : #{var4} / class : #{var4.class} / Type Check 예시 : #{var4.kind_of? Hash}, #{var4.kind_of? TrueClass}"
puts "[var5] 값 : #{var5} / class : #{var5.class} / Type Check 예시 : #{var5.kind_of? TrueClass}, #{var5.kind_of? FalseClass}"
puts "[var6] 값 : #{var6} / class : #{var6.class} / Type Check 예시 : #{var6.kind_of? FalseClass}, #{var6.kind_of? NilClass}"
puts "[var7] 값 : #{var7} / class : #{var7.class} / Type Check 예시 : #{var7.kind_of? NilClass}, #{var7.kind_of? String}"
puts "[var8] 값 : #{var8} / class : #{var8.class} / Type Check 예시 : #{var8.kind_of? Flower}, #{var8.kind_of? Freesia}"
puts "[var9] 값 : #{var9} / class : #{var9.class} / Type Check 예시 : #{var9.kind_of? Freesia}, #{var9.kind_of? Flower}"


# Output
# [var0] 값 : 문자열 / class : String / Type Check 예시 : true, false
# [var1] 값 : 2 / class : Integer / Type Check 예시 : true, false
# [var2] 값 : 1.5 / class : Float / Type Check 예시 : true, false
# [var3] 값 : ["a", "b", "c"] / class : Array / Type Check 예시 : true, false
# [var4] 값 : {:a=>"A", :b=>"B"} / class : Hash / Type Check 예시 : true, false
# [var5] 값 : true / class : TrueClass / Type Check 예시 : true, false
# [var6] 값 : false / class : FalseClass / Type Check 예시 : true, false
# [var7] 값 :  / class : NilClass / Type Check 예시 : true, false
# [var8] 값 : #<Flower:0x00007f80fb8907f0> / class : Flower / Type Check 예시 : true, false
# [var9] 값 : #<Freesia:0x00007f80fb8907c8> / class : Freesia / Type Check 예시 : true, true

 

[변수.kind_of? Class] 혹은 [변수.kind_of?(Class)] 방법으로 타입을 비교 확인을 할 수 있습니다.



4. [변수.is_a? Class] OR [변수.is_a?(Class)] 방법

class Flower
end

class Freesia < Flower
end

var0 = "문자열"
var1 = 2
var2 = 1.5
var3 = ["a", "b", "c"]
var4 = {a: "A", b: "B"}
var5 = true
var6 = false
var7 = nil
var8 = Flower.new
var9 = Freesia.new

puts "[var0] 값 : #{var0} / class : #{var0.class} / Type Check 예시 : #{var0.is_a? String}, #{var0.is_a? Integer}"
puts "[var1] 값 : #{var1} / class : #{var1.class} / Type Check 예시 : #{var1.is_a? Integer}, #{var1.is_a? Float}"
puts "[var2] 값 : #{var2} / class : #{var2.class} / Type Check 예시 : #{var2.is_a? Float}, #{var2.is_a? Array}"
puts "[var3] 값 : #{var3} / class : #{var3.class} / Type Check 예시 : #{var3.is_a? Array}, #{var3.is_a? Hash}"
puts "[var4] 값 : #{var4} / class : #{var4.class} / Type Check 예시 : #{var4.is_a? Hash}, #{var4.is_a? TrueClass}"
puts "[var5] 값 : #{var5} / class : #{var5.class} / Type Check 예시 : #{var5.is_a? TrueClass}, #{var5.is_a? FalseClass}"
puts "[var6] 값 : #{var6} / class : #{var6.class} / Type Check 예시 : #{var6.is_a? FalseClass}, #{var6.is_a? NilClass}"
puts "[var7] 값 : #{var7} / class : #{var7.class} / Type Check 예시 : #{var7.is_a? NilClass}, #{var7.is_a? String}"
puts "[var8] 값 : #{var8} / class : #{var8.class} / Type Check 예시 : #{var8.is_a? Flower}, #{var8.is_a? Freesia}"
puts "[var9] 값 : #{var9} / class : #{var9.class} / Type Check 예시 : #{var9.is_a? Freesia}, #{var9.is_a? Flower}"


# Output
# [var0] 값 : 문자열 / class : String / Type Check 예시 : true, false
# [var1] 값 : 2 / class : Integer / Type Check 예시 : true, false
# [var2] 값 : 1.5 / class : Float / Type Check 예시 : true, false
# [var3] 값 : ["a", "b", "c"] / class : Array / Type Check 예시 : true, false
# [var4] 값 : {:a=>"A", :b=>"B"} / class : Hash / Type Check 예시 : true, false
# [var5] 값 : true / class : TrueClass / Type Check 예시 : true, false
# [var6] 값 : false / class : FalseClass / Type Check 예시 : true, false
# [var7] 값 :  / class : NilClass / Type Check 예시 : true, false
# [var8] 값 : #<Flower:0x00007fcc160c0730> / class : Flower / Type Check 예시 : true, false
# [var9] 값 : #<Freesia:0x00007fcc160c0708> / class : Freesia / Type Check 예시 : true, true

[변수.is_a? Class] 혹은 [변수.is_a?(Class)] 방법으로 타입을 비교 확인을 할 수 있습니다.

먼저 설명드린 방법인 [변수.kind_of? Class] 혹은 [변수.kind_of?(Class)] 방법과 차이가 없습니다.

 

혹시 눈치채졌을지 모르겠지만 여기서부터 제가 새로운 클래스 'Flower'와 'Flower' 클래스를 상속받은 'Freesia' 라는 클래스를 선언하여 해당 클래스에 대해서 인스턴스를 하나씩 생성하여 보여드린 이유가 나옵니다!
Freesia 인스턴스인 var9에 [kind_of?] 혹은 [is_a?] 를 사용하여 Freesia 클래스와 부모 클래스인 Flower 클래스에 해당하는지 확인하였을 때,
Freesia 클래스에 대한 확인도 true, Flower 클래스에 대한 확인도 true라는 결과를 얻게 됩니다.
var9는 Freesia 클래스로 만들어진 인스턴스이지만 해당 클래스의 부모 클래스와 [kind_of?] 혹은 [is_a?]를 사용할때도 true를 반환하는 것입니다.
만약 Freesia 클래스에만 true를 얻고, 부모클래스와 비교했을 때는 false를 얻고 싶다면 이제 설명드릴 [변수.instance_of? Class] 방식을 사용하셔야 합니다!

 

 

5. [변수.instance_of? Class] OR [변수.instance_of?(Class)] 방법

class Flower
end

class Freesia < Flower
end

var0 = "문자열"
var1 = 2
var2 = 1.5
var3 = ["a", "b", "c"]
var4 = {a: "A", b: "B"}
var5 = true
var6 = false
var7 = nil
var8 = Flower.new
var9 = Freesia.new

puts "[var0] 값 : #{var0} / class : #{var0.class} / Type Check 예시 : #{var0.instance_of? String}, #{var0.instance_of? Integer}"
puts "[var1] 값 : #{var1} / class : #{var1.class} / Type Check 예시 : #{var1.instance_of? Integer}, #{var1.instance_of? Float}"
puts "[var2] 값 : #{var2} / class : #{var2.class} / Type Check 예시 : #{var2.instance_of? Float}, #{var2.instance_of? Array}"
puts "[var3] 값 : #{var3} / class : #{var3.class} / Type Check 예시 : #{var3.instance_of? Array}, #{var3.instance_of? Hash}"
puts "[var4] 값 : #{var4} / class : #{var4.class} / Type Check 예시 : #{var4.instance_of? Hash}, #{var4.instance_of? TrueClass}"
puts "[var5] 값 : #{var5} / class : #{var5.class} / Type Check 예시 : #{var5.instance_of? TrueClass}, #{var5.instance_of? FalseClass}"
puts "[var6] 값 : #{var6} / class : #{var6.class} / Type Check 예시 : #{var6.instance_of? FalseClass}, #{var6.instance_of? NilClass}"
puts "[var7] 값 : #{var7} / class : #{var7.class} / Type Check 예시 : #{var7.instance_of? NilClass}, #{var7.instance_of? String}"
puts "[var8] 값 : #{var8} / class : #{var8.class} / Type Check 예시 : #{var8.instance_of? Flower}, #{var8.instance_of? Freesia}"
puts "[var9] 값 : #{var9} / class : #{var9.class} / Type Check 예시 : #{var9.instance_of? Freesia}, #{var9.instance_of? Flower}"

# Output
# [var0] 값 : 문자열 / class : String / Type Check 예시 : true, false
# [var1] 값 : 2 / class : Integer / Type Check 예시 : true, false
# [var2] 값 : 1.5 / class : Float / Type Check 예시 : true, false
# [var3] 값 : ["a", "b", "c"] / class : Array / Type Check 예시 : true, false
# [var4] 값 : {:a=>"A", :b=>"B"} / class : Hash / Type Check 예시 : true, false
# [var5] 값 : true / class : TrueClass / Type Check 예시 : true, false
# [var6] 값 : false / class : FalseClass / Type Check 예시 : true, false
# [var7] 값 :  / class : NilClass / Type Check 예시 : true, false
# [var8] 값 : #<Flower:0x00007f7abd8ac6d8> / class : Flower / Type Check 예시 : true, false
# [var9] 값 : #<Freesia:0x00007f7abd8ac6b0> / class : Freesia / Type Check 예시 : true, false

[변수.instance_of? Class] 혹은 [변수.instance_of?(Class)] 방법으로 타입을 비교 확인을 할 수 있습니다.

앞서 언급한 것 처럼 Freesia 인스턴스인 var9에 [kind_of?] 혹은 [is_a?]를 사용하여 부모 클래스인 Flower에 대한 확인을 했을 때는 true라는 결과를 얻었지만,

[instance_of?]를 사용하여 부모 클래스인 Flower에 대한 확인을 했을 때는 false라는 결과를 얻을 수 있습니다.

어떠한 결과를 얻어야하는지에 따라서 [kind_of?] 혹은 [is_a?] 를 사용하시거나 [instance_of?] 를 사용하시는 것을 선택하시면 되겠습니다!

 

 

 

이상으로 Ruby에서 타입을 체크하고 비교하여 확인하는 방법에 대한 설명을 마치도록 하겠습니다.

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청사항은 언제든지 말씀해주세요!

피드백도 언제나 환영입니다!

 

감사합니다.


댓글