일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ANR이란
- 플러터 설치 2022
- 스택 자바 코드
- 안드로이드 유닛 테스트
- 클래스
- 안드로이드 라이선스 종류
- android ar 개발
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 os 구조
- 2022 플러터 설치
- 안드로이드 레트로핏 crud
- 안드로이드 레트로핏 사용법
- 큐 자바 코드
- jvm 작동 원리
- android retrofit login
- 자바 다형성
- 서비스 vs 쓰레드
- 서비스 쓰레드 차이
- 객체
- 안드로이드 유닛테스트란
- jvm이란
- Rxjava Observable
- 안드로이드 라이선스
- rxjava cold observable
- 멤버변수
- ar vr 차이
- 스택 큐 차이
- 안드로이드 유닛 테스트 예시
- rxjava disposable
- rxjava hot observable
- Today
- Total
나만을 위한 블로그
[JAVA] HashTable이란? 본문
이번 포스팅에선 HashTable(이하 해시테이블)에 대해서 정리하려고 한다.
먼저 해시테이블이 뭔지부터 알아보자.
해시란? 단방향 암호화 기법이다. 해시함수(알고리즘)을 써서 고정된 길이의 암호화된 문자열로 바꾸는 걸 의미
해시함수란? 임의의 길이를 가진 데이터를 고정된 길이의 데이터로 매핑하는 함수. 이 때 매핑하기 전의 원래 데이터 값을 키, 매핑 후 데이터의 값을 해시값(hash value), 매핑하는 과정을 해싱(hashing)이라고 한다.
뉘앙스로는 해시함수의 뜻이 더 가깝다. 해시테이블의 기능 자체가 해시함수와 같은 맥락의 기능이기 때문이다.
그럼 테이블은 뭘까? DB를 공부했다면 알겠지만 모른다면 엑셀을 생각하면 된다.
정리하면 테이블 형태로 키와 값을 매핑하는 걸 해시테이블이라고 하는 것 같다.
구글에 검색해서 해시테이블 자체를 검색하면 아래 결과가 나온다.
- 컴퓨팅에서 해시 테이블(해시 맵)은 키를 값에 매핑할 수 있는 구조인 연관 배열 추상 데이터 유형을 구현하는 데이터 구조다
대충 키밸류를 서로 엮은 자료구조라는 뜻이다. 파이썬의 딕셔너리 자료형이 이와 비슷한 형태다.
그럼 자바에서 해시테이블을 어떻게 쓰는지 보자.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
}
}
선언은 ArrayList와 비슷하게 한다. 하지만 제네릭 안에 들어가는 타입이 2개다.
해시테이블에 값을 넣을 때는 put()을 쓰며 1번 인자로 키를 넣고, 2번 인자로 밸류를 넣으면 된다.
이 상태에서 println()으로 hashtable을 출력하면 아래와 같은 결과가 나온다.
0부터 나오는 게 아니라 마지막에 넣은 3부터 키와 밸류가 나오는 걸 볼 수 있다.
그럼 1번째 키부터 나오게 하려면 어떻게 해야 할까? for문으로 뽑아내면 된다.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
System.out.println(hashtable);
for (int i = 0; i < hashtable.size(); i++)
{
System.out.println(hashtable.get(i));
}
}
}
이렇게 value만 나오는 걸 볼 수 있다.
for문을 쓰지 않고 하나의 키에 담긴 value만 보고 싶다면 getOrDefault()를 쓰면 된다.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
System.out.println(hashtable.getOrDefault(0, ""));
}
}
이 메서드는 0이라는 키에 매핑된 value를 불러오는데, 없을 경우 value의 자료형에 맞는 기본값을 반환한다.
이 예제에선 0이란 키에 첫번째 값이란 문자열이 매핑돼 있으니 첫번째 값을 리턴하지만, 만약 없다면 공백이 출력된다.
다음은 해시테이블 안에 특정 값이 있는지 찾아보는 메서드 2개를 확인해보자.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
System.out.println(hashtable.containsKey(2));
System.out.println(hashtable.containsValue("다섯번째 값"));
}
}
containsKey()는 2라는 숫자 키가 있는지 확인한 후 T/F를 리턴하고, containsValue()는 안의 value값이 있는지 확인한 후 T/F를 리턴한다.
containsKey()의 경우는 2라는 키가 있으니 true를 리턴하고, containsValue()는 다섯번째 값이란 문자열이 해시테이블에 없으니 false를 리턴한다.
다음은 해시테이블의 크기를 확인하는 메서드다. ArrayList와 똑같이 size()로 크기를 확인할 수 있다.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
System.out.println("HashTable의 크기 = " + hashtable.size());
}
}
다음은 해시테이블이 비었는지를 확인해서 T/F를 리턴하는 isEmpty() 메서드다.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
System.out.println(hashtable.isEmpty());
}
}
해시테이블 안에 값들이 있으니 println()는 false를 출력한다.
다음은 해시테이블 안의 모든 키, 밸류값들을 확인하는 메서드다.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
System.out.println("전체 Key 확인 = " + hashtable.keySet());
System.out.println("전체 Value 확인 = " + hashtable.values());
}
}
이 메서드들을 써도 역순으로 출력되는 것을 확인할 수 있다.
다음은 해시테이블에 저장된 하나의 키에 매핑된 value를 바꾸는 메서드다.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
System.out.println(hashtable.getOrDefault(0, ""));
hashtable.replace(0, "수정된 첫번째 값");
System.out.println(hashtable.getOrDefault(0, ""));
}
}
0이란 키에는 첫번째 값이란 문자열이 매핑돼 있었지만, replace()로 키 0에 매핑된 값을 "수정된 첫번째 값"으로 바꾼 뒤, 0을 다시 출력하니 value가 바뀌어 있는 걸 볼 수 있다.
해시테이블의 크기는 ArrayList와 마찬가지로 size()로 구할 수 있다.
해시테이블의 값 중 하나의 값을 삭제하는 건 remove()로, 모든 값을 삭제하는 것 또한 ArrayList와 마찬가지로 clear()로 수행할 수 있다.
단 해시테이블은 선언할 때부터 제네릭 안에 2개의 타입을 넣어주기 때문에 remove()는 2가지 형태로 사용할 수 있다.
import java.util.Hashtable;
public class Test
{
public static void main(String[] args)
{
Hashtable<Integer, String> hashtable = new Hashtable<>();
hashtable.put(0, "첫번째 값");
hashtable.put(1, "두번째 값");
hashtable.put(2, "세번째 값");
hashtable.put(3, "네번째 값");
hashtable.remove(2);
hashtable.remove(3, "네번째 값");
System.out.println(hashtable);
}
}
remove()의 인자로 키만 넣어주거나, 키와 밸류를 모두 넣는 것 중 선택해서 해시테이블 안의 값을 삭제할 수 있다.
이 코드를 실행하면 아래의 결과가 나온다.
'JAVA' 카테고리의 다른 글
[JAVA] 이클립스에서 폴더 프로젝트를 임포트하는 방법 (0) | 2020.12.09 |
---|---|
[JAVA] 쓰레드의 동기화 (synchronized) (0) | 2020.10.25 |
[JAVA] ArrayList 사용법 정리 (0) | 2020.10.24 |
[Intellij] 자바 프로젝트 빌드 시 Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. 에러 해결 (0) | 2020.10.23 |
[JAVA] 생성자란? (0) | 2020.10.07 |