Java

Java Collections class

승모근뭉치 2023. 2. 21. 16:48

프로젝트 내 src 내 javabasic 패키지 내 ScoreDTO.java

package javabasic;

public class ScoreDTO {

	// 멤버 선언
	private int kor, eng, math, total;
	private float avg;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getTotal() {
		total = getKor() + getEng() + getMath();
		return total;
	}

	public float getAvg() {
		avg = getTotal() / 3.0f;
		return avg;
	}
}

프로젝트 내 src 내 javabasic 패키지 내 ScoreDAO.java

package javabasic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

//데이터 액세스를 하기위한 전용 클래스
//컬렉션에 데이터를 입출력 하는 클래스

public class ScoreDAO {

	private ArrayList<ScoreDTO> lists = new ArrayList<ScoreDTO>();

	public int stu_cnt() {
		return this.lists.size();
	}

	// 학생을 list에 insert하는 메소드
	public void setStudent(ScoreDTO dto) {
		lists.add(dto);
	}

	// 컬렉션의 이름을 기준으로 정렬하는 메소드
	public void sort() {
		// 익명클래스로 처리 왜냐면 Comparator 가 인터페이스이기 때문이다
		// Comparator 는 정렬기준 ( cmp 기준으로 정렬해서~ )
		Comparator<ScoreDTO> cmp = new Comparator<ScoreDTO>() {

			// sdto1이 우선이면 -1, 서로같으면 0, sdto2 뒤에있는놈이 우선이면 1값을 리턴
			public int compare(ScoreDTO sdto1, ScoreDTO sdto2) {
				return sdto1.getName().compareTo(sdto2.getName());
			}
		};

		// 정렬하는 lists, 정렬기준 Comparator
		Collections.sort(lists, cmp);
	}// sort()

	public ArrayList<ScoreDTO> getLists() {
		return lists;
	}

	// Overloading
	public ArrayList<ScoreDTO> getLists(String name) {
		ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
		for (ScoreDTO sdto : lists) {
			if (sdto.getName().equals(name)) {
				result.add(sdto);
			}
		} // for문

		return result;
	}
}

 

 

java.util.Collections

요 클래스는 Java Collections Framework(틀 구조, 뼈대, 골조) 의 구성원이다.

Java platform 은 하나의 collections framework(틀 구조, 뼈대, 골조) 를 포함한다.

collection 은 객체들의 모임한개를 나타내는 한개의 객체이다 (고전적인 Vector 클래스 처럼 말이다).

 

collections framework(틀 구조, 뼈대, 골조) 는 다음과 같이 구성된다:

- Collection interfaces(규격) 는 sets, lists, 그리고 maps 같은 collections 의 다른 형태들을 나타낸다. 이런 intefaces(규격) 는 framework(뼈대) 의 기초를 형성한다.

- 일반적-목적으로 된 구현들. collection interfaces(규격) 의 주요한 구현들이다.

- 낡은(Legacy) 구현들. 초창기에 발표된 collection 클래스들인 Vector 그리고 Hashtable 은 collection interfaces(규격) 를구현하기 위해서 개장(개조)되었다.

- 특별한-목적으로 된 구현들은 특별한 상황에서 사용하기 위해 만들어진 구현들이다. 이러한 구현들은 비표준적 성능 특징, 사용 제한, 또는 행동을 보여준다.

- 동시 발생의 (Concurrent) 구현들. 고도로 동기적인(동시 발생하는) 사용에 맞게 만들어진 구현들.

- Wrapper 구현들은 동기화와 같은 기능을 다른 구현들에 추가한다.

- 편의 구현들은 collection interfaces(규격) 의 고성능 "소형-구현체들" 이다.

- 추상적 구현들은 맞춤(custom) 구현이나 자기 입맛에 맞게 만든 구현들을 가능하게 하는 collection interfaces (규격) 의 부분적인 구현들이다. 

- 알고리즘들은 list 를 특정한 순서에 따라 분류하고 정리하는 것과 같이, collections 에 유용한 기능들을 수행하는 정적인(static) 메서드들이다.

- 기반 시설, 기반 장치는 collection interfaces (규격) 를 위해서 필수적인 지원을 제공하는 인터페이스들(규격) 이다.

- 배열 지원 프로그램들. 

 

collections framework(틀 구조, 뼈대, 골조)

>>>

1. Collection Interfaces(규격)

collection interfaces(규격) 는 두 그룹으로 나뉘어진다. 

가장 기본의 interface(규격) 인 java.util.Collection 은 다음의 자손들을 가진다.

- java.util.Set

- java.util.SortedSet

- java.util.NavigableSet

- java.util.Queue

- java.util.concurrent.BlockingQueue

- java.util.concurrent.TransferQueue

- java.util.Deque

- java.util.concurrent.BlockingDeque

 

다른 collection interfaces(규격) 는 java.util.Map 에 기반하고 진정한 collections 는 아니다.

그러나 이러한 interfaces(규격) 는 collection-view 작업을 포함한다. 그래서 java.util.Map 에 기반한 collection interfaces(규격) 가 collections 로써 잘 처리되어질 수 있게 만든다. Map 은 다음의 자식을 갖는다.

- java.util.SortedMap

- java.util.NavigableMap

- java.util.concurrent.ConcurrentMap

- java.util.concurrent.ConcurrentNavigableMap

 


 

java.util.Comparator

 

@FunctionalInterface >>> FunctionalInterface 주석 type(형)

java.lang.FunctionalInterface 클래스

>>

Java 언어 명세서에 의해서 정의된 대로 한개의 interface (규격) 형태(type) 선언은 함수의(기능의, 기능 본위의) interface (규격) 가 되게 하려고 한다는 것을 나타내기 위해 사용되어지는 하나의 정보를 주는 주석 형태 이다.

개념적으로, 한개의 기능 본위의(functional) interface (규격) 은 정확하게 추상 메서드 한개를 갖는다.

기본 메서드들은 구현이 되었으므로, 그것들은 추상적이지 않다.

 

컴파일러는 interface (규격) 선언에서 FunctionalInterface 주석이 나타나든지 나타나지않던지 간에 상관없이

functional interface (함수형의 규격, 함수 규격, 기능형의 규격, 기능 본위의 규격) 의 정의에 필요한 조건에 응하는 아무 interface (규격) 를 functional interface (기능 본위의 규격) 로써 취급할 것이다.

즉, @FunctionalInterface 라고 주석을 쓰지 않더라도 그 인터페이스 (규격) 자체를 선언한 모양이 functional interface (기능 본위의 규격) 를 정의할 때 필요한 조건들에 맞을 때 그 인터페이스 (규격) 자체는 주석없이도 functional interface (함수형의 규격) 로 인식한다는 것 이다.

 

java.util.Comparator 클래스는

어떤 객체들의 collection(수집물) 에 총체적인 순서를 매기는 작업을 집행하는 비교 함수 이다.

일정한 조건에 따라 자료의 순서를 분류하고 구분하는 작업에 대한 정밀한 통제를 허용하기 위해서

Collections.sort 나 Arrays.sort 와 같은 sort(일정한 조건에 따라 자료 따위를 분류하고 구분하는 것) 메서드에 Comparator들이 전달될 수 있다.

 

https://devlog-wjdrbs96.tistory.com/268

 

[Java] 직렬화(Serialization)란 무엇일까?

Serializable에 대해서 알아보기 직렬화라는 용어에 대해서 들어만 보고 공부해본 적은 없는데 이번 기회에 정리를 하게 되었습니다,, 이번 글에서는 직렬화에 대해서 알아보겠습니다. public interface

devlog-wjdrbs96.tistory.com

 

int javabasic.ScoreDAO.sort().new Comparator() {...}.compare(ScoreDTO sdto1, ScoreDTO sdto2)

위에서 ScoreDAO.java 파일에서 보면 sort() 메서드 안에 인터페이스(규격) 인 Comparator 를 구현해서 함수한개를 사용하기 위해서 익명 내부 지역 클래스를 선언하고 생성해 할당해 놓는다.  functional 인터페이스(규격) 인 Comparator 인터페이스(규격) 의 함수 한개를 구현한 선언 블록 내부에는 compare(ScoreDTO sdto1, ScoreDTO sdto2) 메서드가 있다.

 

compare(ScoreDTO sdto1, ScoreDTO sdto2) 메서드는

메서드의 두 arguments 를 순서를 매기기 위해 비교한다.

compare(ScoreDTO sdto1, ScoreDTO sdto2) 메서드는

음수, 영, 또는 양수를 반환하는데 차례차례로 첫번째 argument(전달할 값) 가 두번째 전달하는 값보다 작거나, 같거나, 또는 클 때 그렇게 반환한다.

 

<T> void java.util.Collections.sort(List<T> list, Comparator<? super T> c)

<ScoreDTO> void java.util.Collections.sort(List<ScoreDTO> list, Comparator<? super ScoreDTO> c)

Collections 클래스의 sort(List<T> list, Comparator<? super T> c) 메서드는

지정된 비교자(comparator) 에 의해서 유도된 순서에 따라서 지정된 리스트를 그 유도된 순서라는 조건에 따라 순서를 매긴다.

List<T> list 파라메터는 일정한 조건(순서)에 따라 순서를 정하여 정리하고 분류하게 될 리스트를 말한다.

Comparator<? super T> c 파라메터는 리스트의 순서를 결정할 비교자이다. 비교자의 argument(실제 들어갈 값) 가 널 값이라면 그것은 곧 리스트 요소들의 자연 정렬(알파벳 순 정렬)이 사용되어져야만 한다는 것을 나타낸다.


프로젝트 내 src 내 javabasic 패키지 내 Score_prc.java

package javabasic;

import java.util.Scanner;

public class Score_prc {

	Scanner sc = new Scanner(System.in);
	ScoreDAO dao = new ScoreDAO();

	public void insert() {

		int cnt = dao.stu_cnt();

		do {
			System.out.println("입력 예 --> 홍길동 90 80 80");
			System.out.printf("%d번 학생 성적 입력 [이름 국어 영어 수학] --->", ++cnt);
			String name = sc.next();
			if (name.equals("-1")) {
				break;
			}

			int kor = sc.nextInt();
			int eng = sc.nextInt();
			int math = sc.nextInt();

			ScoreDTO obj = new ScoreDTO();
			obj.setName(name);
			obj.setKor(kor);
			obj.setEng(eng);
			obj.setMath(math);

			dao.setStudent(obj);

		} while (true);
	}// insert

	public void printScore() {
		dao.sort();
		System.out.println("--------------------------------------");
		System.out.println("전체 학생수: " + dao.stu_cnt() + "명");
		System.out.println("--------------------------------------");
		System.out.println(" 이름      국어      영어      수학      총점      평균");
		System.out.println("--------------------------------------");

		for (ScoreDTO obj : dao.getLists()) {
			System.out.printf("%4s %5d %5d %5d %5d %.1f\n", obj.getName(), obj.getKor(), obj.getEng(), obj.getMath(),
					obj.getTotal(), obj.getAvg());
		}
		System.out.println("--------------------------------------");
	}// printScore()

	public void search() {
		System.out.print("학생이름을 입력하시오 ----> ");
		String name = sc.next();

		System.out.println("--------------------------------------");
		System.out.println(" 이름     국어     영어     수학     총점     평균");
		System.out.println("--------------------------------------");

		StringBuilder sb = new StringBuilder();// 스트링버퍼 혹은 일반 스트링객체보다 빠른속도로 값가져올수있다

		for (ScoreDTO obj : dao.getLists(name)) {
			sb.append(String.format("%4s %5d %5d %5d %5d %.1f\n", obj.getName(), obj.getKor(), obj.getEng(),
					obj.getMath(), obj.getTotal(), obj.getAvg()));
		}

		if (sb.length() > 0) {
			System.out.print(sb.toString());
		} else {
			System.out.println("학생이 존재하지 않습니다... ...");
		}
		System.out.println("--------------------------------------");
	}
}

 

String java.util.Scanner.next()

next() 메서드는

이 scanner 로부터 완전한 다음 토큰(말뭉치의 최소 단위)을 찾아서 반환해 준다.

한개의 완전한 토큰(말뭉치의 최소 단위)은 구분 문자의 패턴(일정한 형식)에 일치하는 입력보다 앞서게 되고 구분 문자의 패턴에 일치하는 입력이 한개의 완전한 토큰 뒤에 따라 나온다.

 

java.lang.StringBuilder

StringBuilder 클래스는 잘 변할 수 있는 문자열이다.

이 클래스는 StringBuffer 와 호환가능한 API 를 제공하지만, 동기화를 보장해주지는 않는다.

이 클래스는 문자열 버퍼가 한개의 스레드에 의해 사용되어지는 중인 위치에서 StringBuffer 를 대신하는 drop-in 대체제로써 사용하기 위해 고안되었다 (as is generally the case, 일반적인 경우).

여기서 drop-in 대체제(replacement) 란 아주 조금의 노력으로 A에서 B로 바꾸어서 성능을 향상시킨다는 것으로 어떤 부품이나 프로그램을 대체했을 때 다른 설정을 바꿀 필요가 없고 성능 저하도 없으며 오히려 속도, 안정성, 용량 등의 성능이 올라가는 대체제를 의미한다고 한다.

가능한 상황에서라면, 요 StringBuilder 클래스를 StringBuffer 클래스보다 우선적으로 사용하는 것이 권장되는데 왜냐하면 그렇게 하는 것이 대부분의 구현 아래에서 속도가 더 빨라지기 때문이다.

 

Java Application 에서 동기화가 이루어지는 상황이 아니라면 

StringBuilder 클래스를 사용하자.

동기화가 있는 상황이라면 thread-safe 한 StringBuffer 를 쓰면 된다.

 

 


프로젝트 내 src 내 javabasic 패키지 내 MenuScore.java

package javabasic;

import java.util.Scanner;

public class MenuScore {
	// 콘솔 화면에 메뉴를 출력하는 메소드

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		Score_prc prc = new Score_prc();

		do {
			System.out.println();
			System.out.println("--------------성적 처리--------------");
			System.out.println("1.성적 입력");
			System.out.println("2.성적 출력");
			System.out.println("3.이름 검색");
			System.out.println("종료는 -1을 누르세요!!!");
			int no = sc.nextInt();
			if (no == -1) {
				System.out.println("프로그램을 종료합니다!!!");
				break;
			}
			switch (no) {
			case 1:
				prc.insert();
				break;
			case 2:
				prc.printScore();
				break;
			case 3:
				prc.search();
				break;
			}
		} while (true);

		sc.close();
	}

}

실행 결과

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
2
--------------------------------------
전체 학생수: 0명
--------------------------------------
 이름      국어      영어      수학      총점      평균
--------------------------------------
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
3
학생이름을 입력하시오 ----> 김말똥
--------------------------------------
 이름     국어     영어     수학     총점     평균
--------------------------------------
학생이 존재하지 않습니다... ...
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
1
입력 예 --> 홍길동 90 80 80
1번 학생 성적 입력 [이름 국어 영어 수학] --->금미진
100
90
89
입력 예 --> 홍길동 90 80 80
2번 학생 성적 입력 [이름 국어 영어 수학] --->나영준	90	99	89
입력 예 --> 홍길동 90 80 80
3번 학생 성적 입력 [이름 국어 영어 수학] --->동수민 90	99	20
입력 예 --> 홍길동 90 80 80
4번 학생 성적 입력 [이름 국어 영어 수학] --->라선미	79 82	62
입력 예 --> 홍길동 90 80 80
5번 학생 성적 입력 [이름 국어 영어 수학] --->마수리 50 45 88
입력 예 --> 홍길동 90 80 80
6번 학생 성적 입력 [이름 국어 영어 수학] --->박선영 92 94 86
입력 예 --> 홍길동 90 80 80
7번 학생 성적 입력 [이름 국어 영어 수학] --->사미자 59 39 42
입력 예 --> 홍길동 90 80 80
8번 학생 성적 입력 [이름 국어 영어 수학] --->안혜인 92 96 89
입력 예 --> 홍길동 90 80 80
9번 학생 성적 입력 [이름 국어 영어 수학] --->장지은 89 90 95
입력 예 --> 홍길동 90 80 80
10번 학생 성적 입력 [이름 국어 영어 수학] --->차지선 77 77 77
입력 예 --> 홍길동 90 80 80
11번 학생 성적 입력 [이름 국어 영어 수학] --->Kanye 0 100 1
입력 예 --> 홍길동 90 80 80
12번 학생 성적 입력 [이름 국어 영어 수학] --->탁영석 90 80 91
입력 예 --> 홍길동 90 80 80
13번 학생 성적 입력 [이름 국어 영어 수학] --->판주상 58 68 88
입력 예 --> 홍길동 90 80 80
14번 학생 성적 입력 [이름 국어 영어 수학] --->하한걸 90 90 90
입력 예 --> 홍길동 90 80 80
15번 학생 성적 입력 [이름 국어 영어 수학] --->-1

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
2
--------------------------------------
전체 학생수: 14명
--------------------------------------
 이름      국어      영어      수학      총점      평균
--------------------------------------
Kanye     0   100     1   101 33.7
 금미진   100    90    89   279 93.0
 나영준    90    99    89   278 92.7
 동수민    90    99    20   209 69.7
 라선미    79    82    62   223 74.3
 마수리    50    45    88   183 61.0
 박선영    92    94    86   272 90.7
 사미자    59    39    42   140 46.7
 안혜인    92    96    89   277 92.3
 장지은    89    90    95   274 91.3
 차지선    77    77    77   231 77.0
 탁영석    90    80    91   261 87.0
 판주상    58    68    88   214 71.3
 하한걸    90    90    90   270 90.0
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
3
학생이름을 입력하시오 ----> 김말순
--------------------------------------
 이름     국어     영어     수학     총점     평균
--------------------------------------
학생이 존재하지 않습니다... ...
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
3
학생이름을 입력하시오 ----> 김말똥
--------------------------------------
 이름     국어     영어     수학     총점     평균
--------------------------------------
학생이 존재하지 않습니다... ...
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
3
학생이름을 입력하시오 ----> 하한걸
--------------------------------------
 이름     국어     영어     수학     총점     평균
--------------------------------------
 하한걸    90    90    90   270 90.0
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
1
입력 예 --> 홍길동 90 80 80
15번 학생 성적 입력 [이름 국어 영어 수학] --->금미진 82 81 83
입력 예 --> 홍길동 90 80 80
16번 학생 성적 입력 [이름 국어 영어 수학] --->-1

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
2
--------------------------------------
전체 학생수: 15명
--------------------------------------
 이름      국어      영어      수학      총점      평균
--------------------------------------
Kanye     0   100     1   101 33.7
 금미진   100    90    89   279 93.0
 금미진    82    81    83   246 82.0
 나영준    90    99    89   278 92.7
 동수민    90    99    20   209 69.7
 라선미    79    82    62   223 74.3
 마수리    50    45    88   183 61.0
 박선영    92    94    86   272 90.7
 사미자    59    39    42   140 46.7
 안혜인    92    96    89   277 92.3
 장지은    89    90    95   274 91.3
 차지선    77    77    77   231 77.0
 탁영석    90    80    91   261 87.0
 판주상    58    68    88   214 71.3
 하한걸    90    90    90   270 90.0
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
3
학생이름을 입력하시오 ----> 금미진
--------------------------------------
 이름     국어     영어     수학     총점     평균
--------------------------------------
 금미진   100    90    89   279 93.0
 금미진    82    81    83   246 82.0
--------------------------------------

--------------성적 처리--------------
1.성적 입력
2.성적 출력
3.이름 검색
종료는 -1을 누르세요!!!
-1
프로그램을 종료합니다!!!