본문 바로가기
java

[java] Generics(제네릭), Collection(컬렉션)-list, map

by CodeMango 2023. 2. 20.

 

1. Generic

블로그 참조 : 

 

Java - Generics(제네릭) 이해하기

Java의 Generics는 여러 타입을 지원하는 클래스를 정의하는, 추상화하는 방법입니다. 컴파일될 때 Type checking을 하기 때문에 형변환을 하지 않아도 되고, 버그를 줄일 수 있습니다.

codechacha.com

 

2. Collection

collection이란 데이터 또는 Object 수집을 의미한다.

블로그 참조 :  https://gangnam-americano.tistory.com/41

 

[JAVA] Java 컬렉션(Collection) 정리

[JAVA] Java 컬렉션(Collection) 정리 ■ Java Collections Framework(JCF) Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며 JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렌션과 이를 구

gangnam-americano.tistory.com

Collection에서 가장 중요한 것은 List와 Map이다.

 

1) List: 목록

🎈 ArrayList (배열 목록)

  • 크기를 동적으로 조정할 수 있는 배열과 같은 구조를 가진 목록입니다.
  • 배열처럼 index로 접근하고 관리합니다.
  • 추가 및 삭제가 자주 일어나는 경우에 유용합니다.
  • 선형(라인)구조로 데이터가 연속적으로 저장됩니다.
  • 데이터의 검색 속도가 빠르지만, 추가/삭제가 느리다는 단점이 있습니다.

* 동적 : 길이가 늘어났다 줄어들았다 할 수 있다.


다음과 같이 Java의 List는 Object 형태로 데이터를 저장하기 때문에 어떤 타입이든 저장할 수 있습니다.

List list = new ArrayList();
list.add("Hello world");

List는 Object 형태로 저장하기 때문에 어떤 타입의 데이터가 저장되어있는지 알 수 없습니다. 그렇기 때문에 get()을 호출하면 Object가 리턴됩니다.

따라서, List에서 데이터를 가져올 때는 다음과 같이 형변환을 해줘야 합니다. 형변환을 하지 않으면 컴파일 에러가 발생합니다.

이때, generic을 통해 원하는대로 자료형을 바꿀 수 있습니다.

 ✨list <추가>

	ArrayList<String> arrlist = new ArrayList<String>();
	//제네릭만 빼면 일반 클래스와 동일하다.

	//추가
		arrlist.add("Tigers");
		arrlist.add("eagles");
		arrlist.add("Bears");

		//리스트의 길이값 출력하기
		System.out.println(arrlist.size());	//3반환
		
		//리스트의 모든 데이터 출력하기
		for(int i = 0; i<arrlist.size(); i++ ) {
			System.out.println(i + ":" + arrlist.get(i));	
		} 
		//콘솔값 : 0:Tigers  1:eagles  2:Bears
		
		System.out.println(); //개행
	
		//추가하는방법은 1. 맨뒤에 추가 2. 중간에 추가 하는 방법이 있다.
		
		//1.맨뒤에 추가
		arrlist.add("Lions");	
		//콘솔값 : 0:Tigers  1:eagles  2:Bears  3:Lions
	
		//2.중간에 추가도 : 2번지에 추가
		arrlist.add(2, "Giants");
		
		for(int i = 0; i<arrlist.size(); i++ ) {
			System.out.println(i + ":" + arrlist.get(i));	
		} 
		//콘솔값 : 0:Tigers  1:eagles  2: Giants  3:Bears  4:Lions
		
		System.out.println(); //개행

✨list <삭제>

	//삭제 :지우고싶은 인덱스넘버를 알아야한다.
		ArrayList<String> arrlist = new ArrayList<String>();
		arrlist.remove(1);	//1번지를 삭제
		//콘솔값 : 0:Tigers  1: Giants  2:Bears  3:Lions

 

✨list <검색>

	//검색
		ArrayList<String> arrlist = new ArrayList<String>();
		//제네릭만 빼면 일반 클래스와 동일하다.
		
		int index = arrlist.indexOf("Giants"); //indexOf에 찾고싶은 문자열 입력
		//index넘버로 리턴값 얻어올 수 있다.
		System.out.println("데이터가 있습니다" + index);
		//콘솔값 : 데이터가 있습니다 1		// index가 1: 1번지가 Giants라는뜻
		
		//없는값을 검색하면 -1이 나온다.
		int index = arrlist.indexOf("Twins"); //indexOf에 찾고싶은 문자열 입력
		//index넘버로 리턴값 얻어올 수 있다.
		System.out.println("데이터가 있습니다" + index);
		//콘솔값 : 데이터가 있습니다 -1		// index가 -1: Twins데이터가 없다는뜻
		
		for(int i = 0; i< arrlist.size(); i++) {
			String s = arrlist.get(i);  //arrlist에서 하나씩 꺼내오기
			if("Giants".equals(s)) { //arrlist에서 꺼내온 s와 Giants를 비교하기
				index = i;
				break;
			}
		}
		System.out.println("데이터가 있습니다" + index);

 

✨list <수정>

	//수정
		ArrayList<String> arrlist = new ArrayList<String>();
		
		//수정할 데이터를 준비한다.
		String updateStr = "Twins";
		
		arrlist.set(2, updateStr); //2번지를 updateStr 즉, Twins로 바꾼다(수정한다)
		
		for(int i = 0; i< arrlist.size(); i++) {
			String s = arrlist.get(i);  //arrlist에서 하나씩 꺼내오기
		}
		//콘솔값 : 0:Tigers  1: Giants  2:Twins  3:Lions

 

🎃List를 사용한 실전예제

package sample37;

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

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	//List는 interface
	List<Human> list = new ArrayList<Human>();
	
//추가 : 3명
	//일단 Human class의 객체(인스턴스)생성, 인스턴스 참조변수 hman 선언
	//hman 변수는 이름이 "홍길동"이고 나이가 24인 새로운 Human 객체를 참조
	Human hman = new Human("홍길동", 24); ////Human 객체를 생성
		list.add(hman);
		
		//Human 객체를 계속 생성할 수 있다. 대신 human변수만 쓴다.
		hman = new Human("성춘향", 16); //Human 객체를 생성
		list.add(hman);	//객체를 list에 추가
		
		//위 방법을 한줄로 하는방법. Human객체 생성 + list에 추가
		list.add(new Human("일지매", 22));
	
		//리스트의 길이값 출력하기
			System.out.println(list.size());	//3 반환
				
		//리스트의 모든 데이터 출력하기
		for(int i = 0; i<list.size(); i++ ) {
			Human h = list.get(i);	// list에 들어있는게 하나씩 h에 담긴다.
			System.out.println(h.toString());
				} 
/*		//위의 코드를 foreach문으로 사용하기
		for(Human h : list) {	// list에 들어있는게 하나씩 h에 담긴다.
			System.out.println(h.toString());
			
		}
*/
/*		콘솔값 : 
		Human [name=홍길동, age=24]
		Human [name=성춘향, age=16]
		Human [name=일지매, age=22]
*/
	//중간에 추가하기 : 위의 human 변수를 다시 쓴다.
		hman = new Human("홍두께", 23);	//Human객체 생성
		list.add(1, hman);		//list에 추가 : 1번지에 변수 hman을 추가
/*		콘솔값 : 
		Human [name=홍길동, age=24]
		Human [name=홍두께, age=23]
		Human [name=성춘향, age=16]
		Human [name=일지매, age=22]
*/
		

//삭제 : 일지매 지우기 (인덱스 번호 모름)
		String name = "일지매";
		
		//인덱스 번호 찾기
		int findindex = -1; // -1로 초기화 : 인덱스를 찾지 못했을 때로 초기화
		for (int i = 0; i < list.size(); i++) {
			Human h = list.get(i); //list에 들어있는게 하나씩 h에 담긴다.
			if(name.equals(h.getName())) {
				findindex = i;	//찾았으면 loop그만돌고 i리턴하고 빠져나감.
				break;
			}
		}
		list.remove(findindex);
		
		//리스트의 모든 데이터 출력하기
		for(Human h : list) {	// list에 들어있는게 하나씩 h에 담긴다.
			System.out.println(h.toString());
/*		콘솔값 : 
			Human [name=홍길동, age=24]
			Human [name=홍두께, age=23]
			Human [name=성춘향, age=16]
*/					
		}
		System.out.println(); //개행
		
//검색 -> 일지매 찾기 (위에서 이미 지워놨음)
		name = "성춘향";
			
		//인덱스 번호 찾기
		findindex = -1; // -1로 초기화 : 인덱스를 찾지 못했을 때로 초기화
		for (int i = 0; i < list.size(); i++) {
			Human h = list.get(i); //list에 들어있는게 하나씩 h에 담긴다.
			if(name.equals(h.getName())) {
				findindex = i;	//찾았으면 loop그만돌고 i리턴하고 빠져나감.
				break;
			}
		}	
		if(findindex != -1) { // 성춘향을 찾았을때
//			System.out.println(list.get(findindex)); // 객체 출력이니까 "성춘향, 16" 출력
			System.out.println(list.get(findindex).toString());
		//Human.java의 toString문장이 출력됨. "Human [name=" + name + ", age=" + age + "]";
			// 콘솔값 : Human [name=성춘향, age=16]
			
		}else {
			System.out.println("데이터가 없습니다");
		}
		System.out.println(); //개행
		
//수정 -> 1명
		Human updateHman = new Human("이몽룡", 17);
		list.set(1, updateHman);	//1번지 데이터를 이몽룡, 17로 수정하기
/*		콘솔값 : 
		Human [name=홍길동, age=24]
		Human [name=이몽룡, age=23]
		Human [name=성춘향, age=16]
*/					

}}

🎉배열을 List로 수정해보기

[배열]

private HumanDto humanArr[] = new HumanDto[100];

-> list

private List<HumanDto> list = new ArrayList<HumanDto>();

[배열]

humanArr[count] = new HumanDto(name, age, phone, address, memo);
count++;

->list

Human dto = new HumanDto(name, age, phone, address, memo);	-> 객체생성
list.add(dto);  -> count가 늘려줄 필요 없이, list가 알아서 늘린다.

[배열]

humanArr[index].setPhone(phone);
humanArr[index].setAddress(address);

->list

이 코드만의 특성때문에 객체를 새로 생성하지 않고 get으로 먼저 얻어왔다.

//방법1.
list.get(index).setPhone(phone);
list.get(index).setAddress(address);

//방법2.
HumanDto h = list.get(index);
h.setAddress(address);
h.setPhone(phone);

[배열]

String split[] = datas[i].split(":");
humanArr[i] = new HumanDto( split[0]
                			integer.parseInt(split[1]),
                            split[2]
                            split[3]
                            split[4] );

->list

 // h로 객체 생성
HumanDto h = new HumanDto( split[0]
                			integer.parseInt(split[1]),
                            split[2]
                            split[3]
                            split[4] );
list.add(h);

 

  🎈  LinkedList (연결 목록)

  • 노드(Node)가 연결된 구조를 가지는 목록입니다.
  • 데이터를 삽입/삭제하는 경우에 유용합니다.
  • 데이터의 검색 속도가 느리지만, 추가/삭제가 빠르다는 장점이 있습니다.

 

2) Map: 사전

  🎈 HashMap (해시 맵)

  • 키-값 쌍으로 데이터를 저장하는 목록입니다.
  • 데이터를 검색하는 경우에 유용합니다.
  • 내부적으로 해시 함수를 사용하여 데이터를 저장하므로, 검색 속도가 빠릅니다.
  • 순서가 보장되지 않습니다.

 🎈 TreeMap (트리 맵)

  • 키-값 쌍으로 데이터를 저장하는 목록입니다.
  • 데이터를 정렬하여 저장하므로, 정렬된 데이터를 검색하는 경우에 유용합니다.
  • 내부적으로 트리 구조를 사용하여 데이터를 저장하므로, 검색 속도가 빠릅니다.
  • 데이터의 순서가 보장됩니다.

 

댓글