원지의 개발
article thumbnail
728x90

 

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());
		}
		
	}
}

오늘 하루

더보기

기억에 남는 부분

 

어려운 부분

 

문제 해결 부분

 

728x90
profile

원지의 개발

@원지다

250x250