[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
'기타 > 멋쟁이사자처럼' 카테고리의 다른 글
[rails] 레일즈 모델 - 쿼리메서드 (0) | 2017.02.21 |
---|---|
[github] github 협업 flow (0) | 2017.02.17 |
[ruby] 루비 기초편 - String (0) | 2017.02.12 |
[ruby] 루비 기초편 - 변수, 연산자 (0) | 2017.02.07 |
[ruby] 프로그래밍을 배우는 이유 / OOP 개념 / 루비를! (0) | 2017.02.05 |
댓글