본문 바로가기
개발 공부 Today I Learned

[국비 23일차 TIL] Wrapper, List, Set, Map

by 개발자신입 2023. 12. 21.
반응형

< Wrapper class >

  • 포장하는 것
  • 컬렉션에는 R타입만 들어갈 수 있음.
  • P타입을 R타입으로 감싸서 저장하면 가능. (p498)

 

기본 자료형의 값을 컬렉션에 담기 위해서는 랩퍼 클래스를 사용함.

기본 자료형에 대해서 그에 대응하는 랩퍼 클래스가 있음.

기본 자료형의 값을 멤버 변수의 값으로 저장하고 이 값 주위로 값을 가공하는 메소드들이 감싸고 있다고 해서 랩퍼(wrapper)클래스라고 부름.

 

    기본 자료형        랩퍼 클래스 (대문자)   
byte Byte
short Short
int * Integer
long Long
float Float
double Double
char * Character
boolean Boolean

 

public class WrapperEx {
	public static void main(String[] args) {
		
		int num = 100; 			// p타입
		Integer number = 100;   // wrapper R타입
		Integer number2 = new Integer(100); // 예전에 사용하던 방식
		
		num = number2;
		byte bNum = number2.byteValue();
		short sNum = number2.shortValue();
		double dNum = number2.doubleValue();
		
		Short number3 = 100;
		bNum = number3.byteValue();
		
		System.out.println(Integer.MAX_VALUE); // 정수 기본형의 최대값
		System.out.println(Integer.MIN_VALUE);

		int minValue = Integer.MIN_VALUE;
		System.out.println(minValue);
		
		System.out.println(Byte.MIN_VALUE);
        
        

// 박싱 언박싱

//  Boxing  : 기본 타입의 값을 포장 객체로 만드는 과정
// Unboxing : 포장 객체에서 기본 타입의 값을 꺼내는 과정

		Integer integer = 30;
		Integer integer1 = new Integer(30); // 오토박싱 : 기본 자료형이 참조형으로 변경됨
		Integer integer2 = new Integer("30");
		Integer integer3 = Integer.valueOf(30);
		
		if(integer == integer2) {
			System.out.println("같은 값입니다.");
		} else {
			System.out.println("다른 값입니다.");
		}
	}
}

 

public class Wrapper02 {
	public static void main(String[] args) {
    
		// 포장값 비교하기
		// 포장값 비교하기 위해서 ==, != 같은 연산자는 사용하지 않음
		
		Integer obj1 = 127;
		Integer obj2 = 127; 	// int값에 속하는 숫자라면 true
		
		System.out.println(obj1 == obj2);
		
		Integer obj3 = 300;
		Integer obj4 = 300;
		
		System.out.println(obj3 == obj4); // int값을 벗어나기 때문에 false
		
		// => == 기호는 아예 사용하지 말자.
		
		// 값 비교 compareTo()
		int result = obj1.compareTo(obj2);
		System.out.println(result); // 0
		
		if(result == 0) {
			System.out.println("값이 같습니다.");
		} else if(result < 0) { // -1
			System.out.println("값이 다릅니다. obj2가 클 때");
		} else { // 1
			System.out.println("값이 다릅니다. obj1이 클 때");
		}
		
		
		// 오토 언박싱
		// R -> P
		int iNum = obj1; // 앞에는 P, 뒤에는 R타입
		
		Object obj = 40;
		
		iNum = (int) obj;
		iNum = ((Integer) obj).intValue();
	}
}

 


 

 

 

 


< Collection >

 

R타입만 저장, P타입은 warraper로 감싸서 사용

List, Set, Map

클래스 선언부에 <E>, <T>, <K, V> 가 붙은 것들이 있음 = 제네릭

 

  • E 요소  = Element
  • T 타입  = Type
  • K,V 키, 값  = Key, Value

 

package com.coffee.wrapper;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Coll01 {
	public static void main(String[] args) {
		
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(20);
		list.add(0, 100); // 0번지에 100을 추가함
		
		list.set(2, 200); // 2번지 숫자를 변경함
		list.remove(0);   // index의 값 삭제
		list.remove(2);
		
		System.out.println(list); // [10, 200]
		System.out.println(list.get(0));
		System.out.println(list.get(1));
		System.out.println(list.get(2));
		System.out.println(list.size()); // list의 길이
		
		
		for (int i = 0; i < list.size(); i++) { // 리스트 길이 = size
			System.out.println(list.get(i));
		}
		
		for (Integer integer : list) {
			System.out.println(list);
		}
		
		
		list.clear();	  // list의 모든 값 삭제
		System.out.println(list.isEmpty()); // 비어있어?
		
		ArrayList<Integer> list2 = new ArrayList<Integer>();
		ArrayList<Integer> list3 = new ArrayList<>();
		List<Integer> list4 = new ArrayList<>(); // 상속

		
		========================================
		
		// 1~10
		ArrayList<Integer> list01 = new ArrayList<Integer>();		

		for (int i = 0; i <=10; i++) {
			list01.add(i);
		}
		System.out.println(list01); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
		
		
		// 짝수만 지우고 홀수만 출력하려면?
		for (int i = 0; i < list01.size(); i++) {
			list01.remove(i);
		}
		System.out.println(list01); // [1, 3, 5, 7, 9]		
		
		}	
}

 

 

< List >

배열과 유사하지만, 크기를 동적으로 조절할 수 있고 다양한 기능을 제공

 

리스트의 특징

  1. 순서가 있음 : List는 데이터의 순서를 유지합니다.
  2. 크기 동적 조절 : 배열과 달리 크기를 동적으로 조절할 수 있습니다.
  3. 다양한 구현체 : ArrayList, LinkedList 등 다양한 형태로 구현할 수 있습니다.
  4. 인덱스로 접근 : 각 요소에 인덱스를 사용하여 쉽게 접근 가능합니다.
  5. 다양한 기능 제공 : 정렬, 검색, 일부분 추출 등 다양한 작업을 지원합니다.
  6. 유연한 데이터 관리 : 여러 데이터를 한 곳에 모아 관리하기 용이합니다.
  7. 효율적인 코드 작성 : List를 사용하면 코드를 간결하게 작성할 수 있습니다.

 

List 순서 있음 / 중복 허용
Set 순서 없음 / 중복 불가
Map key와 value를 쌍으로 저장 / key 중복 불가, value 중복 가능

 

 

package com.coffee.coll;

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

public class List01 {
	public static void main(String[] args) {
		
		// 1~45 숫자 6개 뽑아서 저장. (중복 상관없음)
		
		ArrayList<Integer> list1 = new ArrayList<Integer>();
		
		for (int i = 0; i < 6; i++) {
			list1.add((int)(Math.random()*45)+1);
			}
			System.out.println(list1);
			
			Collections.sort(list1); 	// list 정렬하기 Collections.sort()
			System.out.println(list1);
			
			Collections.sort(list1, Collections.reverseOrder()); // list 역순 정렬
			System.out.println(list1);
		}
}
package com.coffee.coll;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class List02 {
	public static void main(String[] args) {
		
		// 문자열 저장하는 list1 만들기
		
		ArrayList<String> list1 = new ArrayList<String>();
		list1.add("홍길동");
		list1.add("김길동");
		list1.add("이길동");
		list1.add("박길동");
		list1.add("최길동");
		list1.add("홍길동");
		System.out.println(list1.size()); // 6
		System.out.println(list1);
		
		list1.remove("홍길동"); // 1개만 삭제함
		System.out.println(list1.size()); // 5
		
		list1.remove("홍길동"); // 2번 지우면 두개 다 지워줌
		System.out.println(list1.size()); // 4
		System.out.println(list1);
		
		list1.remove("남길동"); // 없는 문자열은 결과가 변하지 않음
		System.out.println(list1.size()); // 4
		System.out.println(list1);
	}

}

 

 

List 순서 있음 / 중복 허용
Set 순서 없음 / 중복 불가
Map key와 value를 쌍으로 저장 / key 중복 불가, value 중복 가능

 

 

package com.coffee.coll;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;


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

		Set<String> set = new HashSet<String>();
		set.add("홍길동");
		set.add("김길동");
		set.add("이길동");
		set.add("박길동");
		set.add("최길동");
		set.add("홍길동");

		System.out.println(set); 		// 중복 불가
		System.out.println(set.size()); // 중복 불가 5

		System.out.println(); // 출력 불가 + 중복 불가 = 로또 번호 뽑기

		
		Set<Integer> lotto = new HashSet<Integer>();
		while (lotto.size() < 6) {
			lotto.add((int) (Math.random()45) + 1);
		}
		System.out.println(lotto); // 정렬이 되어있지 않음
		
		
		// set을 list로 만들어서 출력하기
		
		List<Integer> list2 = new ArrayList<>(lotto);
		System.out.println(list2);
		
		System.out.println("----------------------");

		Collections.sort(list2); // 정렬하기
		
		for (Integer integer : list2) {
			System.out.println(integer);
		}

 



반복자 (Iterator)

컬렉션 인터페이스의 iterator() 메소드는 Iterator를 리턴함
Iterator는 Enumeration 인터페이스와 비슷하나 Enumeration 보다 나중에 만들어짐

		// Iterator (반복자)
		Iterator<Integer> iter = lotto.iterator();
		while (iter.hasNext()) {
			Integer integer = (Integer) iter.next();
			System.out.println(integer);
		}
		
		System.out.println("----------------------");
		List<String> names = new ArrayList<String>();
		names.add("홍길동");
		names.add("김길동");
		names.add("최길동");
		names.add("홍길동");
		names.add("홍길동");
		names.add("홍길동");
		names.add("이길동");
		names.add("홍길동");
		names.add("홍길동");
		
		System.out.println(names.size());  // 중복 포함 9개
		Set<String> names2 = new HashSet<String>(names);
		System.out.println(names2.size()); // 중복 제외 4개
		System.out.println(names2);        // [김길동, 홍길동, 최길동, 이길동]
		
	}
}

Set

  1. 고유한 요소 : Set은 중복된 요소를 허용하지 않음
  2. 순서 없음 : 데이터가 입력된 순서대로 저장되지 않음
  3. 인덱스 없음 : List와는 달리 인덱스를 사용하여 접근 불가
  4. 구현체 다양 : HashSet, TreeSet 등 다양한 Set 구현체가 있습니다.
  5. 데이터 집합 연산 : 교집합, 합집합, 차집합 등의 집합 연산을 제공합니다.
  6. 중복 방지 : 중복된 데이터를 효과적으로 방지하여 고유한 데이터 유지 가능.
  7. 컬렉션 프레임워크 일부 : Java의 컬렉션 프레임워크의 일부로 제공되어 사용이 편리합니다.
  8. NULL 요소 한 개만 허용 : 일반적으로 Set은 한 번에 한 개의 null 요소만을 허용합니다.

 

package com.coffee.coll;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Set02 {
	public static void main(String[] args) {
		
		Set<String> set1 = new HashSet<>();
		set1.add("홍길동");
		set1.add("홍길동");
		set1.add("홍길동");
		set1.add("홍길동");
		set1.add("홍길동");
		
		String name = new String("홍길동");
		System.out.println(System.identityHashCode(name));
		set1.add(name);

		name = new String("박길동");
		System.out.println(System.identityHashCode(name));
		set1.add(name);
		
		System.out.println(set1.size());
		
		// class를 만들어서 static 변수로 값을 변경시켜서 저장
		Set<Human> humans = new HashSet<Human>();
		Human n = new Human();
		
		humans.add(n);
		n.ssn = 10;
		humans.add(n);
		n.ssn = 20;
		humans.add(n);
		n.ssn = 30;
		humans.add(n); // 하나의 주소값을 가진 객체를 이용
		n.ssn = 40;
		
		System.out.println(humans.size()); // 1
		System.out.println(humans.iterator()); // java.util.HashMap$KeyIterator@606d8acf
		
		List<Human> humanList = new ArrayList<>(humans);
		Human listget = humanList.get(0);
		System.out.println(listget.ssn); // 40
		
	}
}

class Human {
	int ssn;
	static int number;
	
	public Human() {
		this.ssn = ++number;
	}
}

 

Map

  1. 키-값 쌍 : Map은 키와 값의 쌍으로 데이터를 저장합니다.
  2. 중복된 키 불가 : 각 키는 고유해야 하며, 중복된 키는 허용되지 않습니다.
  3. 값 중복 허용 : 값은 중복되어도 상관없습니다.
  4. 해시맵, 트리맵 등 구현체 다양 : HashMap, TreeMap 등 다양한 Map 구현체가 있습니다.
  5. 순서 없음 : 데이터가 입력된 순서대로 저장되지 않습니다.
  6. 인덱스 대신 키로 접근 : List처럼 인덱스가 없으며, 키를 사용하여 데이터에 접근합니다.
  7. NULL 허용 : 키와 값 모두 null을 허용합니다.
  8. 효율적인 데이터 검색 : 키를 사용하여 데이터를 빠르게 검색할 수 있습니다.
  9. 컬렉션 프레임워크 일부 : Java의 컬렉션 프레임워크의 일부로 제공되어 사용이 편리합니다.

 

List 순서 있음 / 중복 허용
Set 순서 없음 / 중복 불가
Map key와 value를 쌍으로 저장 / key 중복 불가, value 중복 가능

 

package com.coffee.coll;

import java.util.HashMap;
import java.util.Map;

public class Map01 {
	public static void main(String[] args) {
		
		Map<String, String> map = new HashMap<>();
//		HashMap<String, String> map2 = new HashMap<String, String>(); 이렇게도 가능.
		
		map.put("청송", "사과"); // key 청송, value 사과
		map.put("수원", "왕갈비");
		map.put("춘천", "닭갈비");
		map.put("수원", "반도체");
		
		System.out.println(map.size()); // key 기준 개수 (key 중복 저장 불가)
		System.out.println(map); // 새로운 객체 저장 (출력 시 순서 랜덤)
	
		// 하나만 출력 = key를 알아야 value 출력 가능
		map.get("수원");
		System.out.println(map.get("수원"));
		
		// key가 있는지 물어보기
		boolean key = map.containsKey("수원");
		System.out.println(key); // true
		
		key = map.containsKey("경기");
		System.out.println(key); // false
		
		// value 있는지 물어보기
		boolean value = map.containsValue("사과");
		System.out.println(value); // true
		
	}
}

 

반응형

댓글