주말공부 or 복습

주말복습4(Collection(List,set,Map)

동곤일상 2025. 3. 1. 19:07
반응형

이제 복습은 개념보단 코드위주로 할 것 같다

 


1)컬렉션프레임워크

1-1) List

1-2) Set

1-3)Map

1-4) Iterator

(컬렉션프레임워크에 대해 이해가 어느정도 되어있으므로

살짝씩만 할것임)

 

 


1 )@@  컬렉션 프레임워크@@

 

컬렉션 프레임워크 에 대해서는 간단히만 말하고 

코드로 복습하겠음!!!

 

 

컬렉션프레임워크에는

List , Set , Map 존재

 

* Collection 인터페이스 : 객체를 여러개저장할 수 있는 객체]

 


1-1) List

* List : Collection 인터페이스의 하위

* 객체들 저장할 때 저장된 순서를 유지 -> 인덱스 사용 가능

* 구현클래스 : ArrayList , Vector , LinkedList..

* Vector : Collection프레임워크 이전의 클래스

* Collection프레임워크에서 제공되는 함수 기존에사용했던함수 혼합

 

내가직접 예제를 만들어

거기서 사용한 함수 , 방법들은 주석으로 간단히 달아놓겠음


Car 클래스

package ex1_List;

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

//Car클래스는 간단히 이름과가격만 멤버로가

class Car implements Comparable<Car>{
	String name;
	int price;
	public Car(String name, int price) {
		super();
		this.name = name;
		this.price = price;
	}
	@Override
	public int compareTo(Car c) {
		return name.compareTo(c.name);
		//이름기준 정렬
	}
	@Override
	public String toString() {
		return  name + ":" + price ;
		//toString 구현
	}
}

 

구동클래스

public class MyEx1 {
	public static void main(String[] args) {
		//Car객체만 들어올수있는 List 
		ArrayList<Car> cList = new ArrayList<>();


		cList.add(new Car("k5", 30));
		cList.add(new Car("k3", 25));
		cList.add(new Car("k7", 40));
		cList.add(new Car("g80", 60));
		cList.add(new Car("bmw7", 80));
		//정렬하지않고 일단출력
		System.out.println(cList);

		System.out.println("@ ObjectList @ ");
		ArrayList<Object> oList = new ArrayList<>(cList);
		oList.add(999);
		oList.addFirst("Object는 모두의 부모");
		//Object는 모두의 부모임(객체를 모두담을 수 있어)
		System.out.println(oList);
		System.out.println("-------------------");

		//이름순으로 출력해보자
		//구현해놓은 Comparable활용
		Collections.sort(cList);
		System.out.println(cList);

		//가격순으로 출력해보자
		Collections.sort(cList,(s1,s2)->s1.price-s2.price);
		//Comparator (람다식 이용)
		System.out.println(cList);


		//bmw의 인덱스를 추출 후 삭제해보자
		int index=0;
		for (Car car : cList) {
			//car의name에 bmw문자 포함 시
			if(car.name.contains("bmw")) {
				index = cList.indexOf(car);
				//List의 car객체의 인덱스반
				System.out.println("bmw는 "+index+"번에 존재");
			}
		}
		System.out.println("삭제 전 : "+cList);
		System.out.println("@@"+index+"번삭제 :"+cList.remove(index)+"@@");
		//해당인덱스 삭제
		System.out.println("삭제 후"+cList);

		System.out.println("---Object타입의 List에서도 가능!!!---");
		int index2=0;
		for(Object o : oList) {
            //o가 Car로 형변환이 가능하다면
			if(o instanceof Car) {
				if(((Car) o).name.contains("bmw")) {
					index2 = oList.indexOf(o);
					System.out.println("bmw는 "+index2+"번");
				}
			}
		}
		System.out.println("삭제 전 : "+oList);
		System.out.println(index2+"번 삭제 완료 ");
		oList.remove(index2);
		System.out.println(oList);
	}
}

[k5:30, k3:25, k7:40, g80:60, bmw7:80]

@ ObjectList @

[Object는 모두의 부모, k5:30, k3:25, k7:40, g80:60, bmw7:80, 999]

-------------------

[bmw7:80, g80:60, k3:25, k5:30, k7:40]

[k3:25, k5:30, k7:40, g80:60, bmw7:80]

bmw는 4번에 존재

삭제 전 : [k3:25, k5:30, k7:40, g80:60, bmw7:80]

@@4번삭제 :bmw7:80@@

삭제 후[k3:25, k5:30, k7:40, g80:60]

---Object타입의 List에서도 가능!!!---

bmw는 5번

삭제 전 : [Object는 모두의 부모, k5:30, k3:25, k7:40, g80:60, bmw7:80, 999]

5번 삭제 완료

[Object는 모두의 부모, k5:30, k3:25, k7:40, g80:60, 999]

 

List의 제네릭타입은 오직 객체여야함!!! 

기본형은 불가능(boolean , int , long 등)

래퍼타입으로 넣자!!!

 


1-2) Set

 

* set 인터페이스 : 중복객체저장안함

 

* boolean add(Object) :

true : 추가성공

false : 추가실패

 

* 구현클래스

* HashSet : 중복불가 순서뒤죽박죽

* TreeSet : 중복불가 , 정렬됨

* LinkedHashSet : 중복불가 . 순서유지

 

HashSet , TreeSet 등 사용 예시

package ex2_set;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.NavigableSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;


public class MyEx {
	public static void main(String[] args) {
		HashSet<Integer> set = new HashSet<>();
		set.add(56);set.add(23);set.add(11);set.add(2);set.add(3);
		set.add(4);set.add(6);set.add(5);
		set.add(12);set.add(8);set.add(1);set.add(1);
		//set은 중복값을 저장하지않음
		System.out.println("Hashset : "+set);
		
		//set을 list에 넣어 정렬시도
		
		ArrayList<Integer> list = new ArrayList<>(set);
		Collections.sort(list);
		System.out.println("ArrayList<>(set) : "+list);
		
		System.out.println("TreeSet로 변경");
		SortedSet<Integer> treeSet = new TreeSet<>(set);
		System.out.println("treeSet : "+treeSet);
		//subSet : SortedSet의 메서드
		SortedSet<Integer> set2 = treeSet.subSet(2, 5);
		System.out.println("treeSet.subSet(2, 5) : " +set2);
		


	}
}

Hashset : [1, 2, 3, 4, 5, 6, 23, 56, 8, 11, 12]

ArrayList<>(set) : [1, 2, 3, 4, 5, 6, 8, 11, 12, 23, 56]

TreeSet로 변경

treeSet : [1, 2, 3, 4, 5, 6, 8, 11, 12, 23, 56]

treeSet.subSet(2, 5) : [2, 3, 4]  //  2번째요소~~5번째요소 전까지 반환

 

 

 *  * 1 ~ 99까지의 정수를 입력받아서 TreeSet에 저장하고, 0 을 입력하면 입력을 종료한다. 
 * 입력된 값을 정렬하여 출력하기.
   1 ~ 99 까지의 숫자가 아닌 경우 TreeSet에서 저장하지 말것.

 

		Scanner scan = new Scanner(System.in);
		TreeSet<Integer> tSet = new TreeSet<>();
		TreeSet<Integer> tSet2 = new TreeSet<>(Comparator.reverseOrder());
		System.out.println("1부터 99까지의 숫자입력 , (종료 0 )");
		while(true) {
			int num= scan.nextInt();
			if(num==0) {
				break;
			}
			else if(0<num && num<100) {
				tSet.add(num);
				tSet2.add(num);
			}
		}
		System.out.println("오름차순"+tSet);
		System.out.println("내림차순"+tSet2);

1부터 99까지의 숫자입력 , (종료 0 )

-4 5 1023 105 999 99 10 3 2 1 1 67 32 0

오름차순[1, 2, 3, 5, 10, 32, 67, 99]

내림차순[99, 67, 32, 10, 5, 3, 2, 1]


1-3) Map

 * Map인터페이스 : (key,객체) 쌍인 객체들의 모임

 

map의 주요 메서드들


 * put(key,value) : map에 데이터 추가


 * get(key)   :  value값을 리턴


 * Set keySet() : map객체중 key 목록 조회


 * Set values() : map 객체중 values 목록조회
  
 * Set<Map,Entry> entrySet() : (키,값)쌍 목록 조회


 *  Map.Entry 객체 : 키,객체(value) 쌍인 객체1개
   key : getKey()  
   value : getValue()
 
 * value remove(key) : key 에 해당하는 객체 제거  후 value값 리턴
  존재하지않는 key 객체라면 null 반환
 


회원관리 Map객체를 만들어보겠다

key 는 회원의 아이디 (중복 불가능)

value는 이름 , 전화번호 , 주소 , 우편번호 등이 되겠음.

 

 

User클래스

package ex3_map;

import java.util.Objects;

public class MyEx_User {
	private String name;
	private String address;
	private String phoneNum;
	private int zipCode;
	public MyEx_User(String name, String address, String phoneNum, int zipCode) {
		this.name = name;
		this.address = address;
		this.phoneNum = phoneNum;
		this.zipCode = zipCode;
	}
	
	public String getName() {
		return name;
	}

	public String getAddress() {
		return address;
	}

	public String getPhoneNum() {
		return phoneNum;
	}

	public int getZipCode() {
		return zipCode;
	}

	@Override
	public String toString() {
		return "["+name + "," + address + ", " + phoneNum + ", " + zipCode+"]";
	}
	
	@Override
	public int hashCode() {
		return Objects.hash(address, name, phoneNum, zipCode);
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MyEx_User other = (MyEx_User) obj;
		return Objects.equals(address, other.address) && Objects.equals(name, other.name)
				&& Objects.equals(phoneNum, other.phoneNum) && zipCode == other.zipCode;
	}

}

 

 

구동클래스

package ex3_map;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class MyEx {
	public static void main(String[] args) {
		HashMap<String, MyEx_User> map = new HashMap<>();
		map.put("ddkk1120", (new MyEx_User("동곤1","서울시 금천" , "010-1234-2442", 24504)));
		map.put("ddkk1234", (new MyEx_User("동곤2","서울시 성동" , "010-1234-1243", 21244)));
		map.put("ddkk1000", (new MyEx_User("동곤3","서울시 강북" , "010-1234-8974", 24214)));
		map.put("ddkk1024", (new MyEx_User("동곤4","서울시 강서" , "010-1234-4284", 24524)));
		
		System.out.println(map);
//		Set<Entry<String, MyEx_User>> entrySet = map.entrySet();
		System.out.println("entry이용( key,value쌍)");
		for (Entry<String, MyEx_User> entry : map.entrySet()) {
			System.out.println("key :"+entry.getKey()+" value:"+entry.getValue());
		}
		Set<String> keySet = map.keySet();
		System.out.println("아이디목록 : "+keySet);
		
		
		System.out.println("@@map.get()이용해서 key로 전화번호(value의 멤버) 찾기@@");
		String key = "ddkk1120";
		String phoneNum = map.get(key).getPhoneNum();
		System.out.println("map.get("+key+")의 전화번호 : "+phoneNum);

	}
}

{ddkk1234=[동곤2,서울시 성동, 010-1234-1243, 21244], ddkk1024=[동곤4,서울시 강서, 010-1234-4284, 24524], ddkk1120=[동곤1,서울시 금천, 010-1234-2442, 24504], ddkk1000=[동곤3,서울시 강북, 010-1234-8974, 24214]}

 

entry이용( key,value쌍)

key :ddkk1234 value:[동곤2,서울시 성동, 010-1234-1243, 21244]

key :ddkk1024 value:[동곤4,서울시 강서, 010-1234-4284, 24524]

key :ddkk1120 value:[동곤1,서울시 금천, 010-1234-2442, 24504]

key :ddkk1000 value:[동곤3,서울시 강북, 010-1234-8974, 24214]

 

아이디목록 : [ddkk1234, ddkk1024, ddkk1120, ddkk1000]

 

@@map.get()이용해서 key로 전화번호(value의 멤버) 찾기@@

map.get(ddkk1120)의 전화번호 : 010-1234-2442


1-4) Iterator  ( 반복자 )

 * Iterator 인터페이스 : 반복자
 * ITerator() : Collection 객체(List,Set)는 Iterator 객체로 변환이 가능함
 

주요메서드
  boolean HasNext() : 조회할요소가있는가
 Object next();  ㅣ 조회대상 객체리턴
  void remove(); : 조회된 객체를 제거 . next() 실행 이후에가능

 

package ex4_Iterator;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class IterartorEx1 {
	public static void main(String[] args) {
		Iterator<Object> it = null;
		ArrayList<Object> list = new ArrayList<Object>();
		HashSet<Object> set = new HashSet<Object>();
		for (int i = 1; i <= 5; i++) {
			list.add(i+10);//11~16 저장
			set.add(i*10);
		}
		System.out.println("print 이전의 list : "+list);
		System.out.println("print 이전의 set : "+set);
		
		it = list.iterator(); //Collection의 하위만 사용가능 
		print(it);
		it = set.iterator();
		print(it);
		System.out.println("print 이후의 list : "+list);
		System.out.println("print 이후의 set : "+set);
	}
//--------------------------------------------------------------------------
	private static void print(Iterator<Object> e ) {
		//다음 조회 할 대상이 있니?
		while(e.hasNext()) {
			//조회대상 객체반환 
			System.out.print(e.next()+"(삭제),");
			//조회된 객체 삭제
			e.remove();
		}System.out.println();
	}

}

104,103,102,101,

pirnt. 이후의 students 객체 : {}

Alice,bob,Charlie,David,

pirnt. 이후의 students 객체 : {}

 

단순히 조회용으로 사용하는것을 추천함

 


Collection활용 예제

 

내가  소상공인이 되어 가게를 운영한다고 해보자

주말마다 휴일이라는것을 명시해줘야 한다.

 

DayofWeek의 요일은

1~~ 7  : 월~~일 이다

달력출력을 편하게 하기위해

%7 +1 연산을 해서

1~7 : 일 ~~월 로 바꾸자

package test_setMap;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Scanner;



public class MyEx {
	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);
		System.out.println("년도 입력 : ");
		int year = scan.nextInt();
		System.out.println("월 입력 : ");
		int month = scan.nextInt();

		LocalDate of = LocalDate.of(year, month, 1);//입력받은 년도와 월의 첫번쨰날 세팅
		int fisrtWeek = (of.getDayOfWeek().getValue()%7)+1;
		int dayOfMonth = of.getDayOfMonth();
		//1~7  일~월

		LocalDate with = of.with(TemporalAdjusters.lastDayOfMonth());//이번달의 마지막날짜
		int last= with.getDayOfMonth();//이번달의마지막 일


		ArrayList<LocalDate> list = new ArrayList<>();
		for (int first=1; first <= last; first++) {
			list.add(of);
			of= of.plusDays(1);//날짜리스트 생성
		}
		System.out.println(list);
		
//-------달력출력----------------------------------------------
		System.out.println("\t"+year + "년 " + month + "월");
		System.out.printf("%-6c %-7c %-6c%-7c %-7c %-7c %-6c",'일','월','화','수','목','금','토');
		System.out.println();
		for(int i=1; dayOfMonth<=last;i++) {
			
			if(i <fisrtWeek) {
				System.out.printf("%-8s"," ");
				}
			else {
				if(list.get(dayOfMonth-1).getDayOfWeek().getValue()==7/*일요일휴무*/) {
					System.out.printf("%-6s",(dayOfMonth++ + "(휴무)"));
					}
				else {
					System.out.printf("%-8d",dayOfMonth++);
					}
				}
			
	    if(i%7==0)System.out.println();
		}System.out.println();
	}
}

년도 입력 :

2025

월 입력 :

3

[2025-03-01, 2025-03-02, 2025-03-03, 2025-03-04, 2025-03-05, 2025-03-06, 2025-03-07, 2025-03-08, 2025-03-09, 2025-03-10, 2025-03-11, 2025-03-12, 2025-03-13, 2025-03-14, 2025-03-15, 2025-03-16, 2025-03-17, 2025-03-18, 2025-03-19, 2025-03-20, 2025-03-21, 2025-03-22, 2025-03-23, 2025-03-24, 2025-03-25, 2025-03-26, 2025-03-27, 2025-03-28, 2025-03-29, 2025-03-30, 2025-03-31]

깔끔하진못하지만 일요일에 휴무라는 사실을 알수있다!!!!

코드를 조금만수정해주면 원하는요일에 추가로 휴무를 할 수 있음