JAVA API
: application programming interface
- 미리 만들어진 기능인 라이브러리
- API안에 많은 패키지들이 존재 (lang, util, IO 등)
메서드 모형 읽는 법
접근제어자 + (매개변수) + ;(결과) 반환 유형 - 클래스가 선언된 위치
접근제어자 구분
public private default protected
Collection Framework
- 컬렉션 클래스 - 다수의 객체를 저장할 수 있는 클래스
Collection 인터페이스
Collections 클래스 - 컬렉션데이터 그룹은 List, Set, Map의 3가지 타입이 존재
List
- 순서가 있는 데이터들의 집합
- 중복 허용
List 구현된 클래스
- ArrayList
- LinkedList
- Stack
2022.10.26 - [프로그래밍 언어/Java] - [Java] API_ java.util (Generic, 지네릭)(컬렉션 프레임워크), ArrayList
Stack
- Last In First Out 구조(후입 선출)
- op 이라고 하는 위치에서 데이터를 삽입하고 꺼내는 자료구조
- 데이터를 삽입하는 동작을 push 라고 하고 꺼내는 동작을 pop 이라고 함
- 변수 선언은 사용하기 직전에 주는게 좋음
- ArrayList 같은 배열 기반의 컬렉션 클래스 적합
PersonVO
package _api.util.stack;
import java.util.Date;
//여러 개의 값을 묶어서 표현하지 위한 클래스 - Value Object(VO)
//getter 와 constructor는 만들지만 setter는 만들지 않는 경우가 많음
//서버나 누군가가 제공해 주는 데이터를 읽을 목적으로 사용하기 때문
public class PersonVO {
//번호, 이름, 생일, 전화번호, 이메일을 저장
private long num;
private String name;
private Date birthday;
private String phone;
private String email;
//매개변수가 없는 생성자 - default constructor
//NoArgsConstructo
public PersonVO() {
super();
}
//매개변수가 전부 있는 생정자는 데이터를 가져올 때, 따로따로 하면 5번이나 불러야 함
//AllArgsConstructor
public PersonVO(long num, String name, Date birthday, String phone, String email) {
super();
this.num = num;
this.name = name;
this.birthday = birthday;
this.phone = phone;
this.email = email;
}
public long getNum() {
return num;
}
public String getName() {
return name;
}
public Date getBirthday() {
return birthday;
}
public String getPhone() {
return phone;
}
public String getEmail() {
return email;
}
//값을 빠르게 확인하기 위한 메서드
//디버깅을 위한 메서드 - 개발 과정 중 값을 확인하기 위한 목적 == 개발이 끝나면 불필요한 메서드
@Override
public String toString() {
return "PersonVO [num=" + num + ", name=" + name + ", birthday=" + birthday + ", phone=" + phone + ", email="
+ email + "]";
}
}
MainClass
package _api.util.stack;
import java.util.Date;
import java.util.Stack;
public class MainClass {
public static void main(String[] args) {
//PersonVO 클래스의 인스턴스를 저장할 수 있는 Stack을 생성
Stack<PersonVO> stack = new Stack<>();
//Stack에 데이터 저장 - push
stack.push(new PersonVO(1, "제니", new Date(95,5,5), "010-1234-5678", "jennie@gmail.com"));
stack.push(new PersonVO(2, "로제", new Date(98,6,7), "010-8765-4321", "rose@gmail.com"));
//Stack에서 데이터 꺼내기, 순서 확인
System.out.println(stack.pop()); //로제
System.out.println(stack.pop()); //제니
System.out.println(stack.pop()); //Underflow 발생
//데이터가 2개 존재해서 2번 pop을 하면 모두 제거된 상태인데
//pop을 수행해서 Underflow 발생 - 프로그램에서는 예외 발생
//System.out.println(stack.pop());
}
}
Queue
한 방향 혈관
- FIFO(First In First Out - 선입선출): 먼저 삽입한 데이터가 먼저 출력됨
- 삽입되는 위치 와 삭제되는 위치가 반대
이 위치를 rear, front - 스케줄링, 음식서빙로봇 등에 이용
- java 에서는 인터페이스 형태로 제공
List 가 존재하기 때문에 ArrayList 나 LinkedList로 Queue의 역할 수행 - Queue 인터페이스를 implements 한 PriorityQueue 클래스를 제공
이 클래스는 데이터를 정렬해서 순서대로 찾아갈 수 있도록 해주는 클래스
정렬해서 저장하기 때문에 삽입되는 객체는 비교할 수 있는 메서드가 존재하거나 비교 방법을 제공을 해주어야 함
트리 형태로 보관하면 하나씩 추가될 때 배치만 가능
나머지는 하나씩 추가될 때 정렬을 다시 다 해줘야함
Exception : 예외, 특수한 상황을 만나면 빵 터지는 것
Exception 안에서 문제 발생
Assertion : 일부러 죽이는 것
ex) 아이폰에서 탈옥하면 보안 때문에 신한앱 자체를 꺼버림
List 구조들의 정렬
→ List 구조에 저장되는 데이터가 정렬을 수행하기 위해서는 비교할 수 있는 방법이 제공되야 함
MainClass
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Integer> que = new LinkedList<>();
que.offer(10);
int item = que.poll();
int frontItem = que.peek();
boolean isEmpty = que.isEmpty();
int size = que.size();
}
}
MainClass
package _api.util.queue;
import java.util.Comparator;
import java.util.Date;
import java.util.PriorityQueue;
import _api.util.stack.PersonVO; // 연결확인
public class MainClass {
public static void main(String[] args) {
//PrioirtyQueue는 데이터를 정렬된 순서대로 꺼낼 수 있도록 해주는 클래스
//정수를 저장하는 PrioirtyQueue를 만들어서 출력
PriorityQueue<Integer> intQueue = new PriorityQueue<>();
//데이터 저장
intQueue.offer(100);
intQueue.offer(50);
intQueue.offer(80);
//데이터 꺼내기 - 실제로는 정렬을 하면서 저장하는게 아닌 트리형식으로 진행됨(정렬한 것처럼 보임), 컴퓨터가 옮기면서 진행하니 저장하는 속도는 느려짐
//tree형식으로 데이터가 들어가면 실제로 어떤 형태로 나올지는 우리가 예측하기 어려움
//poll하면 크기 순서대로 나옴
System.out.println(intQueue.poll()); //50
System.out.println(intQueue.poll()); //80
System.out.println(intQueue.poll()); //100
System.out.println(intQueue.poll()); //Overflow 발생, null 출력
//PersonVO 클래스를 저장하는 우선순위 큐
//이 상태에서 만들면 PesonVO의 크기 비교를 할 수 없기 때문(정렬이 안되어 있음)에 예외 발생
//PriorityQueue<PersonVO> persons = new PriorityQueue<>();
//PersonVO 클래스에 Comparable 인터페이스를 implements하고
//compareTo 라는 메서드를 재정의해서 해결할 수 있고
//이 방법 추천
//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(3, "지수", new Date(94,11,6), "010-0000-0000", "jisoo@gmail.com"));
persons.offer(new PersonVO(4, "리사", new Date(96,10,3), "010-1111-1111", "lisa@gmail.com"));
persons.offer(new PersonVO(5, "비비", new Date(92,8,25), "010-2222-3333", "bibi@gmail.com"));
System.out.println(persons.poll());
System.out.println(persons.poll());
System.out.println(persons.poll());
}
}
2023.06.12 - [프로그래밍 언어/Java] - [Heap] Priority Queue(우선 순위 큐)
Deque
양 방향 혈관
- 양쪽에서 삽입 과 삭제가 가능한 자료구조
- 스크롤이 가능한 뷰들이 이 Deque를 이용해서 구현되어 있음
- java에서는 인터페이스로 제공하고 ArrayDeque 라고 하는 클래스에 구현을 해두었음
- LRU 알고리즘에서 사용
2023.05.07 - [Study/Data Structure&Algorithm] - [자료구조&알고리즘] stack(스택), queue(큐)
Set
- 데이터를 중복없이 저장하는 자료구조 인터페이스
- 해싱을 이용하기 때문에 데이터의 저장 순서도 기본적으로는 알 수 없음
- 저장 순서를 알 수 없기 때문에 하나의 요소를 가져오는 메서드를 제공하지 않음 = 인덱스X, 이름저장X
Set 구현된 메서드
- iterator 가 있어서 데이터를 하나씩 가져오지는 못하지만 순서대로 하나씩 접근하는 것은 가능
- 추가, 삭제 등을 위한 메서드도 제공
Set 구현된 클래스
- HashSet: 기본이 되는 Set을 구현한 클래스, 보통의 경우 Set 이라고 하면 HashSet을 의미합니다.
- LinkedHahsSet: 데이터가 저장된 순서를 기억하는 Set
- TreeSet: 이진 탐색 트리라는 자료구조의 형태로 데이터 저장
오름차순 정렬한 순서를 기억하는 Set, 크기 비교하는 방법을 제공하는 클래스의 데이터만 저장 가능
크기 비교를 통해 데이터를 정렬하고 저장된 순서를 유지하는 것이지 데이터를 저장하는 것이 X
순서대로 저장하려면 자리 바꿈이 너무 많이 일어나서 시간이 많이 걸림.
그냥 등수만 저장하고 나중에 뺄 때 그 등수를 찾는 것
2023.07.01 - [Study/Data Structure&Algorithm] - [자료구조&알고리즘] 해시, 해시법(체인법, 오픈주소법)
2023.06.25 - [Study/Data Structure&Algorithm] - [자료구조&알고리즘] 트리, 이진 트리, 이진 검색 트리
실습
SetClassCompare
package _api.util.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> linkedHashSet = new LinkedHashSet<>();
Set<String> treeSet = new TreeSet<>();
//샘플 데이터 삽입
hashSet.add("Samsung");
linkedHashSet.add("Samsung");
treeSet.add("Samsung");
hashSet.add("LG");
linkedHashSet.add("LG");
treeSet.add("LG");
hashSet.add("Apple");
linkedHashSet.add("Apple");
treeSet.add("Apple");
hashSet.add("motorola");
linkedHashSet.add("motorola");
treeSet.add("motorola");
hashSet.add("42");
linkedHashSet.add("42");
treeSet.add("42");
//절대로 중복저장 하지 않음
hashSet.add("motorola");
linkedHashSet.add("motorola");
treeSet.add("motorola");
//데이터 출력
//HashSet - 규칙X
for(String company : hashSet) {
System.out.print(company + "\t\t");
}
System.out.println();
//LinkedHashSet - 저장된 순서대로
for(String company : linkedHashSet) {
System.out.print(company + "\t\t");
}
System.out.println();
//TreeSet - 정렬순서대로
for(String company : treeSet) {
System.out.print(company + "\t\t");
}
System.out.println();
}
}
1. Lotto → ArrayList 와 HashSet을 사용했을 때의 차이
1-45까지의 랜덤한 숫자를 중복없이 6개를 저장하고 순서대로 출력하기
ArrayListTest_Lotto
package _api.util.set;
import java.util.ArrayList;
import java.util.Random;
public class ArrayListTest_Lotto {
public static void main(String[] args) {
//랜덤한 숫자를 추출하지 위한 인스턴스 생성
Random r = new Random();
//ArrayList 활용
ArrayList<Integer> al = new ArrayList<>();
//ArrayList의 size가 6보다 작을 때까지
while(al.size() < 6) {
//1~45 까지의 숫자를 랜덤하게 추출
int su = r.nextInt(45) + 1;
//중복 검사를 해서 통과하면 add 하고 통과하지 못하면 add 수행하지 않음
if(al.contains(su)) {
continue; //포함되어 있으면 add하지 않음
}
al.add(su);
}
//출력하기 전에 정렬
al.sort(null);
System.out.println(al);
}
}
TreeSetTest_Lotto
package _api.util.set;
import java.util.Random;
import java.util.TreeSet;
public class TreeSetTest_Lotto {
public static void main(String[] args) {
//랜덤한 숫자를 추출하지 위한 인스턴스 생성
Random r = new Random();
//TreeSet: 중복된 데이터를 저장하지 않고 저장된 순서를 기억합니다.
TreeSet<Integer> treeSet = new TreeSet<>();
while(treeSet.size() < 6) {
//1~45 까지의 숫자를 랜덤하게 추출
int su = r.nextInt(45) + 1;
treeSet.add(su);
}
for(Integer i : treeSet) {
System.out.print(i + "\t");
}
}
}
- ArrayList를 사용하면 중복 검사하는 조건 + 정렬을 넣어줘야 하고
- HashSet(treeSet 사용)을 사용하면 중복x, 저장된 순서를 기억하기 때문에 간결해짐
2. 같은 인스턴스인지 확인 → HashSet
- Person 클래스의 이름과 나이가 같으면 같은 인스턴스로 인식하게 하기
- hashSet의 add 메서드는 새로운 요소를 추가하기 전에 기존에 저장된 요소와 같은 것인지 판별하기 위해 equals, hashCode 메서드를 호출하기 때문에 목적에 맞게 오버라이딩 해야 함
package collectionTest;
import java.util.HashSet;
import java.util.Objects;
public class hashSet {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David", 10));
set.add(new Person("David", 10));
System.out.println(set);
}
}
class Person {
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)) //Person의 인스턴스인지 확인
return false;
Person p = (Person)obj;
return name.equals(p.name) && age == p.age;
}
@Override
public String toString() {
return name + " : " + age;
}
}
-------------------------------------------------------------------
[David : 10, abc]
//오버라이딩 안 했을 경우
//[David : 10, abc, David : 10]
3. 문자열의 해시코드 → HashSet
- 때로는 equals만 오버라이딩 해줘도 되지만, 해시 알고리즘을 사용하는 HashSet에 담을때는 반드시 hashCoe()로 오버라이딩 해줘야 함
- String 클래스의 hashCode()는 객체 주소가 아닌 문자열의 내용을 기반으로 해시코드를 생성하므로
문자열의 내용이 같으면 항상 같은 값의 해시코드 반환
2022.10.18 - [프로그래밍 언어/Java] - [Java] API_ java.lang (문자열, Math 등)
package collectionTest;
import java.util.*;
class SutdaCard {
int num;
boolean isKwang;
public SutdaCard() {
this(1, true);
}
public SutdaCard(int num, boolean isKwang) {
super();
this.num = num;
this.isKwang = isKwang;
}
//hashSet에서는 필수
@Override
public int hashCode() {
return Objects.hash(num, isKwang); //혹은 return toString().hashCode(); String클래스의 hashCode()를 호출
}
public boolean equals(Object obj) {
if(obj instanceof SutdaCard) {
SutdaCard c = (SutdaCard)obj;
return num == c.num && isKwang == c.isKwang;
} else {
return false;
}
}
@Override
public String toString() {
return num + (isKwang ? "K" : "");
}
} //end SutdaCard
public class Ex11_5 {
public static void main(String[] args) {
SutdaCard c1 = new SutdaCard(3, true);
SutdaCard c2 = new SutdaCard(3, true);
SutdaCard c3 = new SutdaCard(1, true);
HashSet set = new HashSet();
set.add(c1);
set.add(c2);
set.add(c3); //중복X, 순서X
System.out.println(set);
}
}
--------------------------------------------------
[3K, 1K]
- SutdaCard의 toString()이 num과 isKwang의 값으로 문자열을 만들어 반환하므로
toString()을 호출한 결과에 hashCode()를 호출함으로써 hashCode()를 간단히 구현 가능
4. 빙고 → HashSet + ArrayList
package collectionTest;
import java.util.*;
public class Ex11_6 {
public static void main(String[] args) {
Set set = new HashSet(); //순서X, 중복X
int[][] board = new int[5][5];
for(int i = 0; set.size() < 25 ; i++) {
set.add((int) (Math.random() * 30) + 1 + "");
}
ArrayList list = new ArrayList(set);
Collections.shuffle(list);
Iterator it = list.iterator();
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[i].length; j++) {
board[i][j] = Integer.parseInt((String) it.next());
System.out.print((board[i][j] < 10 ? " " : " ") + board[i][j] );
}
System.out.println();
}
}
}
-----------------------------------------------------------------------------------
랜덤값
12 19 11 14 15
20 24 26 4 18
30 2 7 6 21
22 23 28 3 29
13 16 17 8 10
- 중복값을 허용하지 않는 특성을 이용하여 HashSet에 저장
- 문제! 해싱 알고리즘의 특성 상 같은 값은 같은 자리에 저장되기 때문에 빙고판의 숫자들이 잘 섞이지 않음
- 해결! 저장 순서를 유지하는 ArrayList에 HashSet의 데이터를 옮겨 담고, 데이터들의 순서를 뒤섞음
대부분 컬렉션 클래스들은 다른 컬렉션으로 데이터를 쉽게 옮길 수 있게 설계
매개변수 타입이 Collection 인터페이스이므로
자손인 List, Set 인터페이스를 구현한 모든 클래스의 인스턴스가 매개변수로 가능
Map
- Key 와 Value를 한꺼번에 저장하는 자료구조 인터페이스
- 순서 유지X
- Key는 중복 불가, Value는 중복 허용
- 인스턴스를 생성할 때 Key 와 Value 의 자료형 2개를 설정해야 함
(특별한 경우가 아니면) Key 의 자료형은 String
Value 의 자료형은 모든 종류의 데이터를 저장하고자 하는 경우는 Object 로 하고 그렇지 않은 경우는 저장하고자 하는 데이터의 자료형을 설정하면 됨
Map<Key 의 자료형, Value 의 자료형> 변수명 =
Map 구현된 메서드
- Value put(key, value): Map 에 데이터를 저장하는 메서드인데 이미 존재하는 key를 사용하면 추가되는 것이 아니고 수정됨
Key X = 삽입
Key O = 수정 - Value get(key): key에 해당하는 value를 리턴, java 에서는 없는 key를 사용하면 null을 리턴
- Value remove(key): key에 해당하는 데이터 삭제
- Set<Key> keySet(): key 들을 Set으로 리턴, Map 에 저장된 모든 데이터를 순회하고자 하는 경우 이용
Map 구현된 클래스
- HashMap: key을 HashSet 형태로 보관
- LinkedHashMap: key를 LinkedHashSet 형태로 보관
- TreeMap: key를 TreeSet 형태로 보관
- HashTable(배열과 링크드 리스트가 조합된 형태), Properties 등
용도
- 여러 데이터를 하나로 묶어서 표현하기 위한 용도로 사용
- 최근에는 되도록이면 Map 대신에 VO(DTO 나 Entity) 클래스를 만들어서 사용하는 것을 권장
- 응용프로그램 개발자 : Map을 만들어서 데이터를 저장하고 가져오는 것만 할 수 있으면 됨
가져올 때는 없는 Key를 사용했을 때 어떤 데이터가 리턴되는지 또는 에러가 발생하는지 확인 할 수 있어야 함 - 프레임워크나 솔루션 : 개발자를 도와주는 프로그램으로 Map의 많은 메서드를 사용해보고 이를 활용할 수 있어야 함
Map 학습 방법
- 응용 프로그램 개발자가 될 거라면 Map을 만들어서 데이터를 저장하고 가져오는 것만 할 수 있으면 됨
가져올 때는 없는 key를 사용했을 때 어떤 데이터가 리턴되는지 또는 에러가 발생하는지 확인할 수 있어야 함 - 프레임워크 나 솔루션을 만드는 개발자가 되려고 하면 Map의 많은 메서드를 사용해보고 이를 활용할 수 있어야 함
MainClass
package _api.util.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MainClass {
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에 데이터를 저장하면 이전 데이터가 삭제되고 수정됨, key가 set으로 되어 있음
map.put("job", "Singer & SongWriter");
//전체 데이터 확인
System.out.println(map);
//Map에서 데이터 가져오기
System.out.println(map.get("name"));
//존재하지 않는 Key를 사용하면 자바는 null을 리턴 !!!! 중요 꼭 기억 !!!!
System.out.println(map.get("age"));
//Map의 데이터 삭제 - remove
map.remove("num");
System.out.println(map);
//Map을 이용하면 Key의 이용을 몰라도 모든 데이터에 접근하는 것이 가능 - Map의 최대 장점
//모든 Key에 접근할 수 있는 Set을 가져오기
Set<String> keys = map.keySet();
//Set을 순회
for(String key : keys) {
//Key를 순회하면서 key에 저장된 value를 확인
System.out.println(key + ": " + map.get(key));
}
}
}
실습
1. login
package collectionTest;
import java.util.HashMap;
import java.util.Scanner;
public class HashMapLogin {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap();
map.put("myId", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234"); //존재하는 키 추가 가능
Scanner scan = new Scanner(System.in);
while(true) {
System.out.println("id와 password를 입력하세요.");
System.out.print("id : ");
String id = scan.nextLine().trim();
System.out.print("password : ");
String password = scan.nextLine().trim();
System.out.println();
if(!map.containsKey(id)) {
System.out.println("입력하신 id가 존재하지 않습니다. 다시 입력해주세요.");
continue;
}
if(!(map.get(id).equals(password))) {
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
} else {
System.out.println("login 성공!");
break;
}
} //end while
} //end main
}
2. 점수
package collectionTest;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapScoreCalc {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("김자바", 90);
map.put("김자바", 100);
map.put("이자바", 100);
map.put("강자바", 80);
map.put("안자바", 90);
Set set = map.entrySet(); //key-value = entry
Iterator it = set.iterator();
while(it.hasNext()) {
Map.Entry<String, Integer> e = (Map.Entry<String, Integer>)it.next();
System.out.println("이름: " + e.getKey() + ", 점수 : " + e.getValue());
}
set = map.keySet();
System.out.println("참가자 명단: " + set);
Collection values = map.values();
it = values.iterator();
int total = 0;
while(it.hasNext()) {
int i = (int)it.next();
total += i;
}
System.out.println("총점 : " + total);
System.out.println("평균 : " + (float)total/set.size());
System.out.println("최고점수 : " + Collections.max(values));
System.out.println("최저점수 : " + Collections.min(values));
}
}
-----------------------------------------------------------------------
이름: 안자바, 점수 : 90
이름: 김자바, 점수 : 100
이름: 강자바, 점수 : 80
이름: 이자바, 점수 : 100
참가자 명단: [안자바, 김자바, 강자바, 이자바]
총점 : 370
평균 : 92.5
최고점수 : 100
최저점수 : 80
- Map.Entry<String, Integer> entry
Map - 인터페이스
Entry - map의 내부 인터페이스
3. 개수
package collectionTest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapCount {
public static void main(String[] args) {
String[] data = {"A", "K", "A", "K", "D", "K", "A", "K", "K", "K", "Z", "D"};
HashMap<String, Integer> map = new HashMap<>();
for(int i = 0; i < data.length; i++) {
if(map.containsKey(data[i])) {
int value = (int)map.get(data[i]);
map.put(data[i], value + 1);
} else { //기존에 없으면
map.put(data[i], 1);
}
}
Iterator it = map.entrySet().iterator();
String hash = "#";
while(it.hasNext()) {
Map.Entry<String, Integer> entry = (Map.Entry<String, Integer>)it.next();
int value = (int)entry.getValue();
System.out.println(entry.getKey() + " : " + hash.repeat(value) + " " + value);
}
}
}
------------------------------------------------------------------------------------------
A : ### 3
D : ## 2
Z : # 1
K : ###### 6
Properties
- Map 과 유사한데 Key 의 자료형 과 Value 의 자료형이 String 만 가능
- 확장자 반드시 기억! properties / xml / json / yml
- 환경 설정을 할 때 사용
- 예전에는 환경 설정을 할 때 대부분 텍스트 파일에 key 와 value 형태로 작성을 해두고 이를 읽어서 사용하는 경우가 많았습니다. 그 시절에 사용하던 클래스입니다.
- 최근에는 XML 이나 YAML을 많이 사용하기 때문에 사용빈도는 많이 줄어들었지만 아직도 이 형태로 설정하는 경우가 있습니다. Spring 의 지역화 나 Spring Boot Project 의 기본 환경 설정(최근에는 YAML 로도 가능)이 대표적
Properties 구현된 메서드
- String getProperty(String key)
- String setProperty(String key, String value)
- void store(OutputStream out, String comment): 파일이나 외부 서버에 저장
- void storeToXML(OutputStream out, String comment): 파일이나 외부 서버에 저장
MainClass
package _api.util.properties;
import java.io.FileOutputStream;
import java.util.Properties;
public class MainClass {
public static void main(String[] args) {
//프로퍼티스 인스턴스 생성
Properties properties = new Properties();
//없는 Key를 사용하면 null이 리턴
System.out.println(properties.getProperty("name"));
//프로퍼티스에 프로퍼티를 저장
properties.setProperty("엔플라잉", "보이밴드");
properties.setProperty("동방신기", "남자아이돌");
properties.setProperty("뉴진스", "여자아이돌");
//텍스트 파일로 저장
try {
//현재 작업 디렉토리에 파일로 저장
//git에 연결되신 분은 workspace가 아니고
//c 드라이브의 사용자 디렉토리 안에 자신의 계정 안에 git 디렉토리에 있습니다.
//properties.store(new FileOutputStream("./myproject.properties"),"텍스트로 저장");
properties.storeToXML(new FileOutputStream("./myproject.xml"),"xml로 저장");
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
오늘 하루
기억에 남는 부분
-
-
어려운 부분
-
-
문제 해결 부분
-
-
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] Nested Class, Lambda, Stream API, Optional (0) | 2022.10.28 |
---|---|
[Java] API_ java.io (file, stream, buffer) / Input & Output (0) | 2022.10.27 |
[Java] API_ java.util (Generic, 제네릭)(컬렉션 프레임워크), ArrayList (0) | 2022.10.26 |
[Java] API_ java.util (Arrays 클래스 - search, date, calendar, random) (0) | 2022.10.25 |
[Java] API_ java.lang (문자열, Math 등) (0) | 2022.10.18 |