본문 바로가기
수업(국비지원)/Java

[Java] chap13 : 컬렉션 프레임워크 - Collection(List)

by byeolsub 2023. 4. 17.
  • List 예제
List 예제
  
  프레임워크 : 기능 수행하기 위한 클래스와 인터페이스의 모임.
  
  Collection 프레임워크 : 객체들의 집합 구현하기 위한 클래스와 인터페이스들의 모임
                       java.util 패키지에 속함
                       
  Collection 인터페이스 : 객체들의 집합
  하위인터페이스
   1. List 인터페이스 : 객체를 저장한 순서를 유지. 중복가능.
                     인덱스(첨자) 사용가능. 0부터 시작
      구현클래스 : ArrayList, Vector, LinkedList
                Vector : Collect 프레임워크이전에 사용되던 클래스
                         이전의 메서드와 Collection 프레임워크의 메서드
                         모두 사용가능
   2. Set 인터페이스 : 객체를 저장한 순서 모름. 중복불가
      구현클래스 : HashSet, TreeSet
      
  Map 인터페이스 : (Key,Value) 쌍인 객체들의 집합    
      구현클래스 : HashMap, TreeMap
                Hashtable <- Properties

 

📌

package chap13;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListEx1 {
	public static void main(String[] args) {
		//<Integer> : 제네릭설정. 요소로 저장되는 객체의 자료형 설정
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);list.add(2);list.add(5);
		list.add(4);list.add(3);list.add(0);
//		list.add("a"); //Integer 객체가 아니므로 list 객체에 추가불가
		System.out.println(list);
		//첨자를 사용하여 데이터 출력
		for(int i=0;i < list.size();i++) {
			System.out.println(i + ":" + list.get(i));
		}
		//개선된 for 구문으로 데이터 출력 
		for (Integer i : list) {
			System.out.println(i);
		}
		System.out.println("list2 : ");
		//jdk8 이후부터 같은자료형인 경우 자료형을 생략가능 
		//subList(1, 4) : list의 1번인덱스 부터 3번인덱스 까지의 부분리스트
		List<Integer> list2 = new ArrayList<>(list.subList(1, 4));
		for (Integer i : list2) {
			System.out.println(i);
		}
		//정렬하기
		//Collection 인터페이스
		//Collections 클래스 : Collection 객체의 기능을 수행할 수 있는 클래스
		//list 객체의 요소들을 정렬하기
		Collections.sort(list);
		System.out.println(list);
	}
}

📌 Collection(List) Exam1.

package chap13;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/*
 * 화면에서 홀수개의 정수를 입력받아 입력받은 숫자의 평균과 중간값 출력하기
 * 999 숫자 입력된경우 입력 종료
 * 평균 : 총합/갯수
 * 중간값 : 숫자를 정렬하여 일렬 배치. 가운데 값
 * 정렬 : Collections.sort(List) 
 * 10 40 30 60 30
 * 평균 : (10+40+30+60+30)/5
 * 중간값 : 10 30 30 40 60 => 30
 * [결과]
 * 홀수개의 숫자를 입력하세요(종료:999)
 * 10 40 30 60 30 
 * 총합 : 000
 * 평균 : 000.0
 * 중간값 : 30
 */
public class Exam1 {
	public static void main(String[] args) {
		System.out.println("홀수개의 숫자를 입력하세요(종료:999)");
		Scanner scan = new Scanner(System.in);
		double sum = 0;
		List<Integer> list = new ArrayList<>();
		while(true) {
			int num = scan.nextInt();
			if(num == 999) break;
			list.add(num);
			sum += num;
		}
		if(list.size() % 2 == 0) {
			System.out.println("한개 숫자를 더 입력하세요");
			int num = scan.nextInt();
			list.add(num);
			sum += num;
		}
		Collections.sort(list);
		System.out.println("평균값:" + sum/list.size());
		System.out.println("중간값:" + list.get(list.size()/2));
	}
}

  • Collections 클래스
Collections  클래스
  sort 메서드 : 정렬기능
              요소의 자료형이 Comparable 인터페이스 객체여야함.
              => 요소객체가 Comparable 인터페이스 구현 클래스 객체여야함
              => Data 클래스가 Comparable 인터페이스를 구현해야함.
  Comparable 인터페이스 : compareTo() 추상메서드를 가짐     
  • 정렬관련 인터페이스
정렬관련 인터페이스
   1. Comparable : 클래스가 구현하여, 클래스의 객체의 기본 정렬방식 설정에 사용됨 
                   int compareTo(Object o) 추상메서드를 가짐
   2. Comparator : 기본정렬방식과 상관없이 실행 중 정렬방식을 설정시 사용됨.
                   Collections.sort(List, Comparator 객체)
                   int compare(Object o1, Object o2)                

 

📌

package chap13;

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

class Data implements Comparable<Data> {
	int value;
	Data(int value) {
		this.value = value;
	}
	public String toString() {
		return value+"";
	}
	@Override
	public int compareTo(Data d) {
		return (value - d.value) ;
	}
}
class Data2 {
	int value2;
	Data2(int value) {
		this.value2 = value;
	}
	public String toString() {
		return value2+"";
	}
}

public class ListEx2 {
	public static void main(String[] args) {
		List<String> list1= new ArrayList<>();
		list1.add("9");list1.add("8");list1.add("7");
		list1.add("6");list1.add("5");list1.add("0");
		System.out.println(list1);
		Collections.sort(list1);
		System.out.println(list1);
		List<Data> list2= new ArrayList<>();
		list2.add(new Data(10));
		list2.add(new Data(1));
		list2.add(new Data(5));
		list2.add(new Data(3));
		list2.add(new Data(0));
		list2.add(new Data(0));
		System.out.println(list2);		
		Collections.sort(list2); //기본 정렬방식대로 정렬
		System.out.println(list2);
		 //역순으로 정렬
		Collections.sort(list2,Comparator.reverseOrder());
		System.out.println(list2);
		
		List<Data2> list3= new ArrayList<>();
		list3.add(new Data2(10));
		list3.add(new Data2(1));
		list3.add(new Data2(5));
		list3.add(new Data2(3));
		list3.add(new Data2(0));
		list3.add(new Data2(0));
		System.out.println("list3:" + list3);		
//		Collections.sort(list3,(d1,d2)->d1.value2 - d2.value2);

		//Comparator 인터페이스 객체 : FunctionalInterface임
		//FunctionalInterface 인터페이스 : 추상메서드가 한개만 존재하는 인터페이스
		//                               : 람다방식이 가능 
		Collections.sort(list3,new Comparator<Data2>() {
			public int compare(Data2 d1, Data2 d2) {
				return d1.value2 - d2.value2; //양수 : 순서 d2->d1
				                              //음수 : 순서 d1->d2
			}
		});
		System.out.println(list3);
	}
}

  • Shape 추상 클래스
Shape 추상 클래스 구현하기
    추상메서드 : double area()
              double length()
    Comparable 인터페이스 구현
     기본정렬방식 : 넓이의 오름차순으로 설정                 
  
 Circle 클래스 구현.  Shape 클래스 상속
    멤버변수 : r
    생성자 : 멤버변수 초기화
    추상메서드구현하기  
    
 Rectangle 클래스 구현.  Shape 클래스 상속
    멤버변수 : w,h
    생성자 : 멤버변수 초기화
    추상메서드구현하기  

 

📌

package chap13;

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

abstract class Shape implements Comparable<Shape> {
	abstract double area();
	abstract double length();
	
	public int compareTo(Shape s) {
		return (int)(area() - s.area());
	}
}
class Circle extends Shape {
	int r;
	Circle(int r) {
		this.r = r;
	}
	@Override
	double area() {
		return r*r*Math.PI;
	}
	@Override
	double length() {
		return 2*r*Math.PI;
	}
	public String toString() {
		return "반지름:"+r + ",면적:"+area() + ",둘레:"+length();
	}
}
class Rectangle extends Shape {
	int w,h;
	Rectangle(int w, int h) {
		this.w = w;
		this.h = h;
	}
	@Override
	double area() {
		return w*h;
	}
	@Override
	double length() {
		return 2*(w+h);
	}
	public String toString() {
		return "("+w +","+h+ "),면적:"+area() + ",둘레:"+length();
	}
}
public class ListEx3 {
	public static void main(String[] args) {
    //<Shape> : list 객체는 Shape 객체의 모임
		List<Shape> list = new ArrayList<>();
    //Circle 객체는 Shape 객체다.
		list.add(new Circle(5)); //list의 요소로 Shapre 객체로 저장
		list.add(new Circle(1));
		list.add(new Circle(10));
		list.add(new Rectangle(6,10));
		list.add(new Rectangle(1,2));
		for(Shape s: list) System.out.println(s);
//sort메서드에서 list 객체의 각 요소 compareTo 메서드 호출
//   Comparable 객체여야함.
		Collections.sort(list);
		System.out.println("기본 정렬 후:");
		for(Shape s: list) System.out.println(s);
		System.out.println("면적의 역순으로 정렬 :");
//Comparator 인터페이스 : 실행 중 정렬방식을 변경할 때 사용되는 인터페이스
//reverseOrder() : Comparator 인터페이스 static 메서드 기본정렬방식의 역순으로 정렬할 때 사용.
		Collections.sort(list,Comparator.reverseOrder());
		for(Shape s: list) System.out.println(s);
		System.out.println("둘레 순으로 정렬 :");
/* jdk8 이전 방식		
		Collections.sort(list,new Comparator<Shape> () {
			@Override
			public int compare(Shape s1, Shape s2) {
				return (int)(s1.length() - s2.length());
			}
		});
*/
		//jdk8 부터 가능 방식
		Collections.sort
		   (list,(s1,s2)->(int)(s1.length() - s2.length()));
		for(Shape s: list) System.out.println(s);
		System.out.println("둘레 역순으로 정렬 :");
		Collections.sort
		(list,(s1,s2)->
(int)(Math.round(s1.length()) - Math.round(s2.length())) * -1);
		for(Shape s: list) System.out.println(s);
	}
}