class Main {
public static void main(String[] args) {
// 여기서 `저장소<>` 는 `저장소<Integer>` 가 생략된 표현이다.
저장소<Integer> a정수저장소 = new 저장소<>();
a정수저장소.set(10);
System.out.println(a정수저장소.get() * a정수저장소.get());
// 출력 => 100
저장소<Boolean> a논리저장소 = new 저장소<>();
a논리저장소.set(false);
if ( a논리저장소.get() ) {
System.out.println("참 : " + a논리저장소.get());
}
else {
System.out.println("거짓 : " + a논리저장소.get());
}
}
}
위의 문제를 제네릭을 사용해서 푼다고 했을 때 아래와 같이 풀 수 있다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
// 여기서 `저장소<>` 는 `저장소<Integer>` 가 생략된 표현이다.
저장소<Integer> a정수저장소 = new 저장소<>();
a정수저장소.set(10);
System.out.println(a정수저장소.get() * a정수저장소.get());
// 출력 => 100
저장소<Boolean> a논리저장소 = new 저장소<>();
a논리저장소.set(false);
if ( a논리저장소.get() ) {
System.out.println("참 : " + a논리저장소.get());
}
else {
System.out.println("거짓 : " + a논리저장소.get());
}
}
}
class 저장소<T> {
private T value;
void set (T value) {
this.value = value;
}
T get () {
return (T)value;
}
}
위와 같이 T로 하는게 중요하다 받는 값인 get을 T로 해서 받아야한다.
왜냐하면 기본적으로 Object는 기본적으로 Object 끼리 더하기,빼기,곱셈 등 사칙연산이 되지 않는다
게다가 Object가 int인지 boolean 인지 뭔지 모르기 때문에 못한다.
그래서 Object를 T로 해서 사용을 해서 구분을 지어준다.
Hashmap
Haspmap은 기본적으로 key값과 value 값이 있는데 key 값은 중복되지 않는다.
큰 예로 자바스크립트로 name : aaa와 name : bbb를 하고 출력을 하게 되면
bbb만 나오게 된다 이게 바로 key값은 중복이 되지 않는다는 뜻이다.
하지만 value 값은 중복이 가능한데 나이를 예를 들어서 설명한다고 한다면 나이가 80 인데
평균 수명도 80인 경우가 있을 수 있다 여기에서 나이와 평균 수명이 key 값이고 80이 value 이다.
key값은 중복을 안했지만 value 값은 중복이 되었다 하지만 정상적으로 실행이 된다 이게 key 값은 중복은 안되지만
value 값은 중복이 된다는 뜻과 같다고 보면 된다.
class Main {
public static void main(String[] args) {
HashMap aMap = new HashMap();
aMap.put(1, "안녕");
aMap.put("A", false);
}
}
위와 같이 할 때에는 간단하게 표현을 할 수 있다.
class Main {
public static void main(String[] args) {
HashMap aMap = new HashMap();
aMap.put(1, "안녕");
aMap.put("A", false);
}
}
class HashMap {
void put (Object key, Object value){
}
}
이런식으로 하면 출력은 된다.
근데 여기에서 만약 출력을 한다고 했을 때에는 for문을 사용해서 내가 원하는 key 의 값을 출력을 할 수 있다.
package com.example.MyJavaProject;
class Main {
public static void main(String[] args) {
HashMap aMap = new HashMap();
aMap.put(1, "안녕");
aMap.put("A", false);
System.out.println(aMap.get("A"));
// 출력 : false
}
}
class HashMap {
int size;
Object[] keys;
Object[] values;
HashMap () {
int arraySize = 3;
size = 0;
keys = new Object[arraySize];
values = new Object[arraySize];
}
void put (Object key, Object value) {
keys[size] = key;
values[size] = value;
size++;
}
private int getIndexOfKey(Object key){
for (int i = 0; i < size; i++){
if (keys[i].equals(key)){
return i;
}
}
return -1;
}
Object get (Object key) {
int index = getIndexOfKey(key);
if(index != -1) {
return values[index];
}
return null;
}
}
생각보다 for문을 되게 많이 사용하고 뭔가 되게 많이 있는데 좀 놀랬다.
그냥 생각을 어떻게 get에 있는 키 값인 value를 뽑을까만 생각을 했었는데 이런 for문을 활용해서
출력을 할 수 있었는데 간단하게 해석을 하면 private int getIndexOfKey 라는 함수에 마지막 return -1 을 했는데
이건 그냥 확인을 하기 위함이라서 참고만 하면 되고 equals 를 활용해서 값을 뽑아내는 것과 같다.
equals 의 경우에는 값을 비교하는데 사용을 하는 함수가 아닌 메소드이다.
값을 비교하기 위해서 Object get에 index 안에 getIndexOfKey를 만들어놨고 for문과 if문을 통해서
비교를 하며 그 외에는 크게 다른 건 없다 그래서 System.out.println(aMap.get("A"));
를 했을 때에는 false 값이 나오고 만약 1을 넣으면 안녕 이라는 String 이 나오게 된다.
get에 없는 값을 넣으면 null 이 나올 수 있도록 해놨기 때문에 null 이 출력이 되게 된다.
'Java' 카테고리의 다른 글
| 2022-09-13 자바 수업 (interface,implements) (0) | 2022.09.13 |
|---|---|
| 2022-09-08 자바 (0) | 2022.09.08 |
| 2022-09-06 자바 (배열의 길이, 배열 삭제, 제네릭) (0) | 2022.09.06 |
| 자바 배열 (array) 알아보기 from 점프 투 자바 (0) | 2022.09.06 |
| 2022-08-31 자바 수업 (static, final) (0) | 2022.09.01 |
댓글