ejyoo's 개발 노트

[Map, enum] 의식의 흐름이랄까? 본문

공통

[Map, enum] 의식의 흐름이랄까?

ejyoovV 2021. 3. 8. 21:26

📌 Map의 Key와 Value를 묶어서 Entry라고 한다.

📌 Entry를 단위로 묶어 데이터를 넣고 빼고 수정을 한다.

📌 데이터가 Entry 단위로 움직인다.

📌 Map에서 Key만 추출하는 경우 Set과 동일하다.(중복을 허용하지 않는 데이터 이므로)

📌 Map에서 Value는 List처럼 중복이여도 상관없다.

 

📌 map을 배운 이유는? CRUD 를 하기 위해서이다.

 

📌 C -> put(K,V)

📌 U -> put(K,V) => 덮어쓰기와 같다.

📌 R -> get(K) = > 리스트는 인덱스값을 사용하여 가져오고 map은 키값을 사용하여 가져온다.

📌 D -> remove(K)

 

📌 우리가 Key 값을 알고 있을 때, 상관없지만. Collection에 의해 여러개의 데이터를 가져오기 위해서는 4가지 방법이 존재한다.

📌 이때, 키값을 알아야 데이터를 꺼내올 수 있다.

📌 Map 집합에서 Key값만 추출해야할 때, 그 때 사용하는 메서드는 keySet() 이다.

📌 keySet 메서드 : 키 객체를 묶어서 Set에 저장한다.

📌 Set에 있는 데이터를 하나하나 접근하여 꺼내오려면 Iterator라는 메서드를 사용하여 접근해야한다.

📌 Set 객체라면 iterator가 존재한다고 보면된다.

📌 iterator 객체를 생성하면 hasNext(), next()메서드를 사용하여 데이터를 (키묶음으로) 꺼내올 수 있다.

📌 key 값만 있으면 value는 가져올 수 있다.

📌 Set도 반복을 허용하게 해주는 Iterable 를 구현한 객체이기 때문에 Set 객체도 향상된 for문을 쓸 수 있다.

 

📌 value 값만 가져오고 싶으면 values메서드를 호출한다.

📌 values 메서드를 호출하면 value만 따로 모아서 컬렉션 객체로 던져준다. 그것을 하나하나 출력하면 된다. (키값이 필요없는 경우에만 사용)

 

📌 가장 map스럽게 갖고오는 방법은 entry 묶음으로 가져오는 것이다. (map.entrySet()으로 호출)

📌 key와 value 를 묶으면 entry가 유일해진다. 그래서 set으로 묶을 수 있는 것이다.

📌 이렇게 묶은 Entry는 유일한 값이므로 엔트리 객체를 담은 집합을 Set에 담을 수 있는 것이다.

 

📌 Iterator 또는 향상된 for문으로 가져오면 Entry(k,V가 담겨져 있는)를 가져올 수 있다.

📌 Entry 내에는 getKey(), getValue() 가 있으므로 꺼내올 수 있다.

 

📌 이런식으로 map을 가지고 CRUD 작업을 할 수 있다.

 

📌 Map은 key,value 데이터 타입이 Object가 올 수 있었다.

📌 properties 객체는 모양 자체가 K,V 처럼 다룰 수 있으나 String만 올 수 있다.

📌 K,V 관리하기 편하고 저장할 때 store, load를 사용하여 properties 파일로 따로 뺄 수 있다.(txt 파일로)

📌 데이터 삽입할 때,setProperties(k,v)

📌 데이터 읽어올 때, getProperties(k)

📌 이 properties는 후에 JDBC연결 시 반복되는 Connection, userId, UserPw을 관리한다.

 

📌 여기까지 list, set, map 인터페이스로 구성되어있는 Collections 프레임워크를 보았다.

 

 

📌 enum

📌 enumeration, enumerate 나열한다. 라는 의미.

📌 즉... 1,2,3,4,5,6,7,8 ...?

📌 데이터를 상수화 시켜주는 기능이라고 한다.

📌 상수 정의를 좀 더 효율적으로 상수를 정의하는 방법을 제공받을 수 있다.

📌 JAVA 1.5 이상만 지원됨. (JDK 1.5)

📌 타입 세이프. 타입이 안전한 코드라고 할 수 있다.

📌 enum을 사용하지 않고 일반적인 상수 방식을 사용하는경우.

📌 내가 현재 작성하는 클래스 파일 말고 다른 곳에도 값이 같은 변수명은 다르지만 같은 상수값를 정의한 경우가 있을 수 있다.

📌 이때, 비교하는 문구에서 문제가 되어 디버깅이 어렵기 때문에 enum을 사용한다. (상수를 잘못 정의한 경우를 막을 수 잇는 것이 enum임.)

 

📌 enum의 장점

📌 타입 안전한 코드 작성할 수 있게 한다.

📌 enum이 없을 때 상수를 쓸 때 자바에서 static final int로 상수인것처럼 사용하곤 했다.

📌 상수명이 다른데 내부 값은 동일할 수 있는 여지가 있다.

📌 이런 경우를 막아보자 하고 나온 문법이 enum이다.

 

📌 enum 선언하는 방법.

📌 enum 키워드가 있다. enum 뒤에 타입 이름을 정해준다.(열거형 변수 정의)

📌 내가 사용할 상수 명을 쭈욱 나열하면 된다. 하나의 상수처럼 사용할 수 있도록 존재하게 된다.

 

📌 enum 상수 정의할 때, 계절을 예로 들면 봄, 여름, 가을, 겨울 이 있다.

📌 enum을 선언하는 방식이 두가지가 있다.

📌 이 둘의 차이점은 enum은 클래스를 만드는 느낌과 비슷하다.

📌 enum 상수 정의 시 괄호가 의미하는 것은 enum 상수 만들때 생성자 파라미터를 만들어서 파라미터를 1개 넘겨준다는 의미이다.

📌 enum의 생성자는 필수로 생성해야한다.

📌 enum의 생성자는 private 타입이다. private인 경우 다른 클래스에서 사용할 수 없다. 생성자의 타입을 명시하지 않았지만 private가 디폴트이다.

즉 외부에서 enum 상수 객체를 만들어 낼 수 없다. 내부적으로 생성해서 쓰는 객체이다

굳이 같은 객체를 여러개 찍을 의미가 없으므로 내부적으로 객체가 사용하는 시점에 하나만 만들어 줄 수 있도록 한다.

일종의 enum에 있는 것들은 실제 타입이 된다.

📌 enum은 상수를 정의하기 위한것이고 타입까지 구분해서 정의할 수 있도록 문법을 만든것이다.

📌 서울이라는 상수는 City 타입의 상수이다. 따라서 타입까지 있다는 것이다. (enum 관련 포스팅을 참고한다.)

 

📌 Season이라는 타입의 상수가 4개가 만들어진 것이다.

📌 클래스 선언한 것처럼 멤버변수(필드)값도 가질 수 있다.

📌 enum 상수도 하나의 객체이기때문에 가능한 것이다.

📌 enum 타입의 객체를 만들고 객체 내부에 필요한 정보를 담기위해서 내부 필드값을 정의할 수 있다.

📌 객체 내부에 정보를 담을 수 있음.

📌 enum을 클래스라고 생각하면 비슷한 점이 많음

📌 멤버변수를 저장하고 필요할때 꺼내쓸 수 있는데. 그럴때 getStr getter를 메서드 정의할 수 잇다.

📌 이렇게 정의하면 생성자에서 생성하는 시점에 자기가 갖고있는 멤버변수에 저장하고 getStr 호출하면 가져올 수 잇다. 객체 다루듯이 상수를 다룰 수 있다.

📌 enum이라는 문법을 사용하여 객체를 생성하지만 특이한점이 하나만 만들 수 있고 자기만의 타입이 존재하기 때문에 enum 상수를 비교할 때 비교할 때 다름. City.대전 Season.대전 이런식으로 되기에 다름을 알 수 있다.

📌 개발자가 실수할 위험을 줄여주는 type Safety이고, enum이라는 문법을 제공한다는 것이다.

 

 

'공통' 카테고리의 다른 글

요청에 대한 응답 코드 목록  (0) 2023.05.27
[JSP] 윈도우 웹소켓 내 IP 설정  (0) 2021.05.03
mutable 과 immutable  (0) 2021.04.13