⭐ 실제 프로그램의 data는 scala data는 거의 없다고 봐도 좋다.
⭐ 자료구조는 모두 generic이 적용되어있다고 생각해도 좋다.
List
어제에 이어서 남은 List들 정리하였다.
1) Stack : Last In First out. (LIFO)
- top에서만 넣고 뺼수 있다. (일종의 제한을 가한것임)
- data 삽입 : push
- data 가져오기: pop (top의 위치의 data를 삭제하면서 가지고 오게 된다. (실제 삭제X, top 포인터만 이동))
- underflow : data가 없는데 pop을 시도. (예외가 발생하게 된다.)
- overflow : 더이상 저장할 공간이 없는데 push 시도.
- 용도 : 함수의 data를 저장.

➰ stack에 객체 push & pop
package com.eb.stack;
import java.util.Date;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
//PersonVO 클래스의 인스턴스를 저장할 수 있는 stack을 생성
Stack <PersonVO> stack = new Stack<>();
stack.push(new PersonVO(1, "사쿠라", new Date(100, 3, 11), "01033339999", "39saku", "르세라핌 입니다."));
stack.push(new PersonVO(2, "김채원", new Date(104, 5, 7), "01055555555", "cheachea", "르세라핌 입니다."));
//PersonVO p = new PersonVO();
//stack이므로 pop시 2번 -> 1번 순서로 나온다.
System.out.println(stack.pop());
System.out.println(stack.pop());
//data가 2개 존재, 2번 pop하면 모두 제거된 상태로 빈stack의 상태인데 꺼낼것이 없어서 underflow 발생
//System.out.println(stack.pop());
}
}
2) Que : First in First out (FIFO)
- FIFO(first in first out , 선입선출) 먼저 삽입한 데이터가 먼저 출력된다.
- 삽입되는 위치와 삭제되는 위치가 반대이다. (위치를 rear와 front라고 한다.)
- 스케줄링에 주로 시용한다.
- java에서는 인터페이스 형태로 제공한다.
- List가 존재하기 때문에 ArrayList나 LinkedList로 Queue의 역할을 수행한다.
- Queue 인터페이스를 implements한 priority Queue 클래스를 제공한다.
- 이 클래스는 데이터를 정렬해서 순서대로 찾아갈 수 있도록 해주는 클래스이다.
- 정렬해서 저장하기 때문에 삽입되는 객체는 비교할 수 있는 method가 존재하거나 비교방법을 제공해야한다.
- data 삽입 : offer
- data 가져오기: poll

| 💡 List 구조들의 정렬 List 구조에 저장되는 데이터가 정렬을 수행하기 위해서는 비교할 수 있는 방법이 제공되어야 한다. |
➰ PriorityQueue Class 사용 offer & poll
package com.eb.queue;
import java.util.Comparator;
import java.util.Date;
import java.util.PriorityQueue;
import com.eb.stack.PersonVO;
public class Main {
public static void main(String[] args) {
//PriorityQueue는 데이터를 정렬된 순서대로 꺼낼 수 있도록 해주는 클래스
//List는 sort를 해주어야 하는데 알아서 정리를 해주니까 편함, 저장 속도는 조금 느릴수 있겠다. (내부적으로 비교를 하면서 정렬하여 저장하니까)
//정수를 저장하는 PriorityQueue를 만들어서 출력
PriorityQueue<Integer> intQueue = new PriorityQueue<>();
//데이터 저장
intQueue.offer(100);
intQueue.offer(70);
intQueue.offer(90);
intQueue.offer(20);
//데이터꺼내기
System.out.println(intQueue.poll());
System.out.println(intQueue.poll());
System.out.println(intQueue.poll());
System.out.println(intQueue.poll());
System.out.println(intQueue.poll()); // 없으니 null (예외발생)
//PersonVO 클래스를 저장하는 우선순위 Queue - 객체를 주면 항상 크기를 어떤것을 기준으로 할지 정해주어야 한다. 따라서 예외가 발생한다.
/* 객체의 정렬은 크기 비교가 필수이다 */
//PriorityQueue<PersonVO> persons = new PriorityQueue<>();
/* 위의 예외를 해결하는 방법 2가지 */
//방법1 - 위험한 방법
//PersonVO 클래스에 Comparable 인터페이스를 implements하고
//compareTo라는 method를 재정의해서 해결할 수 있고
//방법2 - 선호하는 방법
//Comparator 인터페이스를 대입받을 수 있는 경우에는 Comparator 인터페이스를 구현한 클래스의 인스턴스를 이용해서 생성해도 된다.
PriorityQueue<PersonVO> persons = new PriorityQueue<>(new Comparator<PersonVO>() {
@Override
public int compare(PersonVO o1, PersonVO o2) {
return o1.getBirthday().compareTo(o2.getBirthday());
}
});
persons.offer(new PersonVO(1, "사쿠라", new Date(100, 3, 11), "01033339999", "39saku", "르세라핌 입니다."));
persons.offer(new PersonVO(2, "김채원", new Date(104, 5, 7), "01055555555", "cheachea", "르세라핌 입니다."));
persons.offer(new PersonVO(3, "홍은채", new Date(97, 1, 3), "01088889999", "echea", "르세라핌 입니다."));
System.out.println(persons.poll());
System.out.println(persons.poll());
System.out.println(persons.poll());
}
}
6) Deque : 양쪽에서 삽입과 삭제 가능.
- 양쪽에서 삽입과 삭제가 가능한 자료구조
- 스크롤이 가능한 뷰들이 Deque를 이용해 구현되어있다.
- java에서는 인터페이스로 제공, ArrayDeque라고 하는 클래스에 구현을 해두었다.

Set
- 데이터를 중복없이 저장하는 자료구조 인터페이스
- 해싱을 이용하기 때문에 데이터의 저장 순서도 기본적으로는 알 수 없다.
- 저장 순서를 알 수 없기 때문에 하나의 요소를 가져오는 method를 제공하지 않음.
🔹구현된 method
Iterator가 있어서 데이터를 하나씩 가져오지는 못하지만 순서대로 하나씩 접근하는 것은 가능.
추가, 삭제 등을 위한 메서드도 제공한다.
🔹구현된 class
1. HashSet : 기본이 되는 Set을 구현한 class.
보통의 경우 set이라고 하면 HashSet을 의미한다.
2. LinkedHashSet : 데이터가 저장된 순서를 기억하는 Set
3. TreeSet : 오름차순 정렬한 순서를 기억하는 Set, 크기 비교하는 방법을 제공하는 클래스의 데이터만 저장가능.
➰ 1 - 45까지의 랜덤한 숫자를 중복없이 6개를 저장하고 순서대로 출력하기
- ArrayList와 TreeSet을 사용했을 때의 차이.
package com.eb.set;
import java.util.ArrayList;
import java.util.Random;
import java.util.TreeSet;
public class Lotto {
public static void main(String[] args) {
//랜덤한 숫자를 추출하기 위한 인스턴스 생성
Random r = new Random();
//ArrayList 활용
ArrayList <Integer> al = new ArrayList<>();
//ArrayList의 사이즈가 6보다 작을 때 까지.
while(al.size() < 6) {
//1~45까지의 숫자를 랜덤하게 추출
int su = r.nextInt(45) + 1;
//중복 검사를 해서 통과하면 add하고 통과하지 못하면 add를 수행하지 않음.
if(al.contains(su)) {
continue;
}
al.add(su);
}
//출력전에 정렬
al.sort(null);
System.out.println(al);
/* TreeSet으로 구현 */
TreeSet <Integer> ts = new TreeSet<>();
while(ts.size() < 6) {
int num = r.nextInt(45) + 1;
ts.add(num);
}
System.out.println(ts);
}
}
➰ Set class 사용해보기
package com.eb.set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetClassCompare {
public static void main(String[] args) {
//문자열을 저장하는 Set 인스턴스를 3개 생성
Set<String> hashSet = new HashSet<>();
Set<String> likedHashSet = new LinkedHashSet<>();
Set<String> treeSet = new TreeSet<>();
hashSet.add("LG EDS");
likedHashSet.add("LG EDS");
treeSet.add("LG EDS");
hashSet.add("ebsoft");
likedHashSet.add("ebsoft");
treeSet.add("ebsoft");
hashSet.add("kairosoft");
likedHashSet.add("kairosoft");
treeSet.add("kairosoft");
hashSet.add("SM");
likedHashSet.add("SM");
treeSet.add("SM");
hashSet.add("Hybe");
likedHashSet.add("Hybe");
treeSet.add("Hybe");
/* 중복된 내용을 add 해도 저장이 안됨. */
hashSet.add("Hybe");
likedHashSet.add("Hybe");
treeSet.add("Hybe");
hashSet.add("Hybe");
likedHashSet.add("Hybe");
treeSet.add("Hybe");
//데이터출력
//HashSet
System.out.println("## HashSet : 무슨 순서로 나오는지 알수 없다.");
for(String company : hashSet) {
System.out.println(company + "\t");
}
System.out.println();
//LinkedHashSet
System.out.println("## LinkedHashSet : 저장한 순서를 기억하고 있다. (저장한 순서대로 출력)");
for(String company : likedHashSet) {
System.out.println(company + "\t");
}
System.out.println();
//TreeSet
System.out.println("## TreeSet : 아스키코드로 정렬된 순서이다 (숫자>대문자>소문자 순으로)");
for(String company : treeSet) {
System.out.println(company + "\t");
}
System.out.println();
}
}
Map
- Key와 Value를 한꺼번에 저장하는 자료구조 인터페이스
- 인스턴스를 생성할 떄 Key와 value의 자료형 2개를 설정해야 한다.
- key의 자료형은 String(특별한 경우가 아니면)
- Values의 자료형은
- 모든 종류의 데이터를 저장하고자 하는 경우 Object
- 그렇지 않은 경우는 저장하고자 하는 자료형을 설정.
Map<key의 자료형, value의 자료형> 변수명 =
🔹 구현된 method
value put (key, value)
map에 데이터를 저장하는 메서드인데 이미 존재하는 key를 사용하면 추가되는 것이 아니고 수정된다.
Value get(key)
key에 해당하는 value를 리턴, java에서는 없는 key를 사용하면 null을 리턴
Value remove(key)
key에 해당하는 데이터 삭제
Set<key> keySet()
key들을 Set으로 리턴, Map에 저장된 모든 데이터를 순회하고자 하는 경우 이용
🔹 구현된 class
- HashMap : key를 HashSet형태로 보관
- LinkedHashMap : key를 LinkedHashSet 형태로 보관
- TreeMap : key를 TreeSet 형태로 보관
🔹 용도
여러 데이터를 하나로 묶어서 표현하기 위한 용도로 사용.
최근에는 되도록이면 Map 대신에 VO(DTO나 Entity) 클래스를 만들어서 사용하는 것을 권장.
➰ Map class 사용
package com.eb.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Main {
public static void main(String[] args) {
//HashMap으로 인스턴스 생성
Map<String, Object> map = new HashMap<>();
//Map에 데이터 저장 - put
map.put("num", 1);
map.put("name", "아담");
map.put("job", "Singer");
//동일한 key에 데이터를 저장하면 이전 데이터가 삭제되고 수정됨
map.put("job", "Cyber Singer");
System.out.println(map);
//map에서 데이터 가져오기
System.out.println(map.get("name"));
//존재하지 않는 key를 사용하면 자바는 null을 리턴
System.out.println(map.get("age"));
//Map을 이용하면 key의 이름을 몰라도 모든 데이터를 접근하는 것이 가능
Set<String> keys = map.keySet();
//Set을 순회
for(String key : keys) {
System.out.println(key + ":" + map.get(key));
}
}
}
❓ map 학습법
응용 프로그램 개발자가 될 거라면 map을 만들어서 데이터를 저장하고 가져오는 것만 할 수 있으면 됨. 가져올 때는 없는 key를 사용했을 때 어떤 데이터가 return 되는지 또는 에러가 발생하는지를 확인할 수 있어야 함.
프레임워크나 솔루션을 만드는 개발자가 되려고 하면 Map의 많은 메서드를 사용해보고 이를 활용할 수 있어야 합니다.
Properties
- Map과 유사한데 Key의 자료형과 Value의 자료형이 String만 가능하다.
- 환경 설정을 할 때 사용한다.
- 예전에는 환경 설정을 할 떄 대부분 텍스트 파일에 key와 vlaue형태로 작성을 해두고 이를 읽어서 사용하는 경우가 많았다. 그 시절에 사용하던 클래스
- 최근에는 XML이나 YAML을 많이 사용하기 때문에 사용빈도는 많이 줄었지만 아직도 이형태로 설정하는 경우가 있다.
- Spring의 지역화나 Spring Boot Project의 기본 환경 설정이 대표적이다 (최근에는 YAML로도 가능하다)
➰ Properties 사용
package com.eb.properties;
import java.io.FileOutputStream;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
//프로퍼티스 인스턴스 생성
Properties properties = new Properties();
//없는 key를 사용하면 null return
System.out.println(properties.getProperty(""));
properties.setProperty("아담", "한국 최초의 사이버 가수");
properties.setProperty("강진축구", "세계 최초의 온라인 축구 게임");
properties.setProperty("프리스톤테일", "한국 최초의 자체 3D 엔진 MMORPG");
//텍스트 파일로 저장
//다른 언어는 예외처리는 개발자 마음대로 해도 된다.
//java는 java가 만들지 않은 것들은 무조건 예외처리를 하도록 강제하고 있다.
// 1) DB작업 / 2) 파일작업 3) 다른 server와의 통신 (try catch를 사용해주면 좋다)
try {
//현재 작업 디렉토리에 파일로 저장
//git을 연결한 경우 C 드라이브 > user > git dir > 파일 디렉토리 안에 있다.
//properties.store(new FileOutputStream("./myproject.properties"), "텍스트로 저장");
properties.storeToXML(new FileOutputStream("./myxml.xml"), "xml로 저장");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
❓ Project를 3개정도 하는 경우
- Spring Legacy Project?
- ⭐Spring Boot + JPA를 이용해서 Rest API Server를 구축하고 react나 vue를 이용해서 Client Application을 구축
- Google의 Firebase 나 AWS의 람다를 이용한 ServerLess나 AWS의 S3를 이용한 별도의 파일 업로드 서버를 구축
'국비지원 > JAVA' 카테고리의 다른 글
| [JAVA] 23. Nested Class / Anonymous / Lambda / Stream API / Thread (0) | 2022.10.28 |
|---|---|
| [JAVA] 22. API - I/O (InputStream/OutputStream) (0) | 2022.10.27 |
| [JAVA] 21-2. API - java.util pkg (컬렉션 프레임워크) (0) | 2022.10.25 |
| [JAVA] 21-1. API - java.util pkg (Array, Date, Calendar, Random) (0) | 2022.10.25 |
| [JAVA] 20. Wrapper class와 API - java.util pkg (java.util(API) Arrays와 sort, 객체 배열의 정렬 방법 까G) (0) | 2022.10.24 |