생각을 개발하자, 박진형

[ruby] 루비 기초편 - Hash 본문

Likelion/ruby

[ruby] 루비 기초편 - Hash

imjinbro imjinbro 2017.02.17 02:51

[Hash란?]

- key-value 구조로 이뤄진 데이터타입

- 우리들이 흔히 알고 있는 사전이라고 생각하면 됨 : 안녕 이라는 단어의 뜻을 찾는다, 안녕은 key / 안녕의 뜻이 value다.


[Hash 선언]

1) jinbro = Hash.new{ "name" => "jinbro", "age" => 25 }    - key를 일반 데이터타입(string, integer 등)으로 저장하는 경우, value는 상관없음

2) jinbro = Hash.new { :name => "jinbro", :age => 25 }     - key를 symbol형태로 저장하는 경우, value는 상관없음

2-1) jinbro = Hash.new {name: "jinbro", age: 25 }             - 2번과 같음, 표현방식이 루비 버젼에 따라 간편해진 것, key를 integer로 저장할 때는 사용 못함

3) jinbro = Hash.new("기본값") - 1번 2번 방법과는 상관없음, key에 대한 value 기본값을 정해주는 선언문, key에 대한 value를 지정해줬으면 상관없지만, key-value가 지정되지 않은 값에는 기본값이 들어가있음(아마 nil? 오류를 막기위해 사용하는 것으로 판단)


- symbol과 string의 차이는 별개로 포스팅할 것

- value로 array를 저장할 수 있음


[Hash key - value 추가하기]

1) jinbro["key"] = value

2) jinbro[:key] = value

3) store 메서드 사용 (메서드 설명 참고)


[Hash 참조 - string / symbol 참조]

1) jinbro["name"] - "jinbro"를 리턴함

2) jinbro[:age] - 25를 리턴함


[Hash 메서드]

전제)

1번 해시 : h1 = { a: 1, b: 2}

2번 해시 : h2 = { a; 1, b: 2, c: 3}


1) h1 < h2 - true를 리턴함, 서로의 관계를 리턴해주는 메서드로 h1 > h2의 경우 false를 리턴함, 부등호는 >, <, <=, >=, == 를 사용할 수 있음

2) h2.store(:d, 4) - 해시에 추가 key-value를 저장하는 메서드

3) h2.freeze 혹은 h2[:a].freeze - 해시 전체 혹은 해시의 특정 key의 value가 변경되지 못하도록 명령하는 메서드(전체에 frozen할 경우 추가 조차 못함)

4) h2.key(1) - :a를 리턴함, value를 통해서 hash의 key를 리턴 받음

5) h2.any? - true를 리턴함, 해시에 저장된 key-value가 있는지 없는지 체크하는 메서드

6) h2.assoc(:a) - [:a, 1]를 리턴함, assoc의 파라미터로 전달한 key와 key에 대한 value를 배열형태로 묶어서 리턴을 해주는 메서드, 없을 경우 nil을 리턴함

7) h2.clear - 해시에 저장되어 있는 key-value를 모두 없애는 메서드

8) h2.defalut(값) - 해시에 아직 저장되지 않은 key에 대한 기본 value를 정해주는 메서드, Hash 선언하기 3번째 방법과 동일함

9) h2.each do |k, v| { puts #{k}에 대한 값은 #{v}이다. }

10) h2.delete(:a) - h2 해시에서 :a key와 key에 대한 value를 삭제하는 메서드, 삭제할 것이 없을 경우 nil을 리턴함

11) h2.delete_if { |key, value| value >= 1 } - {}(빈 해시)를 리턴, 어떤 특정 조건에 맞았을 때 삭제를 하는 메서드(해시의 key, value를  하나씩 가져와서)

12) h2.each { |k, v| puts "key : #{k}, value : #{v}" } - key : a, value : 1 key: b, value :2 처럼 해시에 포함된 key와 value를 리턴시킴(배열 요소를 꺼내듯)

13) h2.each_pair { |k, v| } - 12번과 동일한 메서드

14) h2.each_key { |k| k } - 12번과 동일한 방식이지만 key만 리턴받는 메서드

15) h2.each_value { |v| v } - 14번과 동일하지만 value만 리턴받는 메서드

16) h2.empty? - false를 리턴함, 해시가 비었는지 안비었는지 체크하는 메서드

17) h1[:a].eql? h2[:a]  혹은 h1.eql? h2 - 전자) true를 리턴함, 후자) false를 리턴함, 해시의 특정 key에 대한 value나 해시 자체가 동일한지 따지는 메서드

18) h2.fetch(:a) - 1을 리턴함, 특정 key에 대한 value를 리턴함

19) h2.fetch_values(:a, :b) - [1, 2]를 리턴함, 파라미터로 넘기는 key의 value들을 배열로 묶어서 리턴하는 메서드

20) h2.flatten - 해시에 저장되어 있는 key-value를 배열형태로 뽑아주는 메서드

21) h2.has_key(:d) - false를 리턴함, 해시에 해당 key가 있는지 체크하는 메서드

22) h2.has_value(2) - true를 리턴함, 해시에 해당 value가 있는지 체크하는 메서드

23) h2.to_s - 해시 전체를 string으로 리턴함, 모든 key-value가 { }에 포함되어 나오며 이것을 string("")으로 변환해줌

24) h2.invert - { 1: a, 2: b, 3: c } 를 리턴함, 해시에 저장되어있는 key-value 관계를 뒤집음, 해시 전체에만 사용가능(특정 key-value x)

25) h2.keys - 14번과 동일한 기능이지만 h2에 저장되어있는 key들을 배열 형태로 리턴해주는 메서드

26) h2.length - 3을 리턴함, 해시에 저장되어있는 key-value 쌍이 몇개인지 체크하는 메서드

27) h1.merge(h2) - h1을 기준으로 h2에 있는 멤버 key-value를 합침, 서로 중복되는 key가 있다면 h1의 value로 저장됨

28) h2.reject { |k, v| v >= 100 } - h2에 저장되어있는 value  중에 100보다 크거나 같은 key-value쌍을 리턴해줌, 1번보다 더 진화한 형태랄까...?

29) h2.replace({ a: 100}) - h2에 저장된 모든 key-value 쌍을 지우고 replace() 메서드의 파라미터로 전달하는 해시를 저장함

30) h2.select { |k, v| } - 특정 key, 특정 value를 선택할 때 어떠한 조건을 사용하려고 한다면 쓰는 메서드

31) h2.shift - {b: 2, c: 3} 을 리턴함, 해시에서 첫번째 key-value 쌍을 지움, 첫번째로 대처할 뒤 해시 쌍이 없다면 nil을 리턴함

32) h2.to_a - [[:a, 1], [:b, 2], [:c, 3]]을 리턴함, 해시의 key-value 쌍을 배열로 만들어주는 메서드


[Hash 레퍼런스]

루비 공식 api : http://ruby-doc.org/core-2.3.0/Hash.html