IT/JAVA

[DAY 14] 컬렉션 프레임워크

_KH_ 2025. 1. 21. 00:36

□ 프레임 워크 -> 뼈대, 틀

□ 종류 : 리스트(list), 집합(set), 맵(map)

 

1. 리스트 - ArrayList

ArrayList : 배열의 값을 마음대로 넣었다가 뺼 수 있음

- new를 사용해도 주소값이 출력되지 않는데 이는 이미 toString()이 오버라이딩 되어있기에 값이 출력되는 것이다.

-

□ ArrayList 장점

1) 개발자가 개발에 활용하기 용이

2) 프로그램 동작 중에서도 메모리(크기)를 늘리거나 줄일 수 있다.

    (= 배열의 3요소 중 하나인 크기를 몰라도 된다. (크기 미정 ok))

3) 자료형과 무관하게 넣을 수 있음. 배열 3요소 중 관련있는 것만 넣는다는 규칙 1가지만 지키면 리스트에 넣을 수 있다.

     (다만 웹개발에서는 자료형을 섞어쓰지 않고 "제네릭"을 이용한다.)

 

□ ArrayList 메서드

1) add() : 값 넣기 

    - ex. add(0,11); -> 0번 인덱스에 11을 넣어줌

2) clear() : 배열을 비워준다.

3) contains() : 해당 요소가 있는지 확인해준다. true,false 반환

4) get() : 인덱스에 해당하는 값을 가져온다.

5) isEmpty() : 배열이 비어있는지 확인

6) size() : 전체크기를 물어봄

7) set() : 설정

    - set(0,123); -> 0번 인덱스를 123으로 바꿔줌

8) remove() : 해당 인덱스 제거

 

 ■ 제네릭 : 저장할 데이터의 타입을 '강제' 

ArrayList<Integer> al2 = new ArrayList<>();

- 제네릭 자리에는 클래스, 자료형 모두 가능

- 자료형이 섞이면 효율성이 떨어진다.

 

+ ) 제네릭 안에 <> int가 아닌 Integer(클래스)를 넣는 이유 -> 컬렉션 프레임워크에서는 자바에서 원래 사용하던 자료형을 넣어주야 한다.

 

[iterator 복사체] // c 포인터 원리로 작동

Iterator<Integer> itr = al.iterator();
			while(itr.hasNext()) {
				// itr에게 다음 데이터가 있는지 물어봄
				System.out.println(itr.next());		
			} // hasNext()는 복사체만 가진다??

 

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

public class Test01 {
	// iterator 복사체
	public static void main(String[] args) {
		
		ArrayList<Integer> al = new ArrayList<>();
		al.add(10);
		al.add(20);
		al.add(30);
		al.add(40);
		al.add(50);
		System.out.println(al);
		
			Iterator<Integer> itr = al.iterator();
			while(itr.hasNext()) {
				// itr에게 다음 데이터가 있는지 물어봄
				System.out.println(itr.next());		
			} // 포인터(↑)가 이동하는 원리
			
		
		for(int v : al) {
			System.out.println(v);
		}
		
	}

 

 

■ 형 변환을 클래스에서 하면 캐스팅.

   - 형 변환(캐스팅), 다운 캐스팅(강제 형변환)

package class05;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

class Circle {
   private String name;
   private int radius;
   private double area;
   static final double PI=3.14;
   
   Circle(String name,int radius){
      this.name=name;
      this.radius=radius;
      this.area=this.radius*this.radius*Circle.PI;
   }
   
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getRadius() {
      return radius;
   }
   public void setRadius(int radius) {
      this.radius = radius;
   }
   public double getArea() {
      return area;
   }
   public void setArea(double area) {
      this.area = area;
   }
   @Override
   public boolean equals(Object obj) {
      if(!(obj instanceof Circle)) {
         return false;
      }
      Circle circle=(Circle)obj; // 형변환(캐스팅), 다운캐스팅(강제형변환)
      return this.name.equals(circle.name);
   }
   @Override
   public String toString() {
      return "Circle [name=" + name + ", radius=" + radius + ", area=" + area + "]";
   }
}
public class Test01_T {
   public static void main(String[] args) {      
      ArrayList<Circle> al=new ArrayList<>();
      al.add(new Circle("도넛",1));
      al.add(new Circle("피자",10));
      al.add(new Circle("도넛",10)); // 무명 객체
      
      double max=al.get(0).getArea();
      int maxIndex=0;
      for(int i=1;i<al.size();i++) {
         if(max <= al.get(i).getArea()) {
            max=al.get(i).getArea();
            maxIndex=i;
         }
      }
      System.out.println(al.get(maxIndex));
      
      Scanner sc=new Scanner(System.in);
      System.out.print("이름 입력 >> ");
      String name=sc.next();
          
      Circle circle = new Circle("도넛", 2);
      int cnt=0;
      for(Circle v:al) {
         if(v.equals(circle)) { // 비교대상은 "원 객체"!!!!!
            System.out.println(v);
            cnt++;
         }
      }
      System.out.println("cnt = "+cnt);
      
   }
}

■ instanceof는 equals 매커니즘에 주로 사용한다. (캐스팅하려고 할 때)

 => 객체 구분

 

<예시>

for(int a = 0; a < 2; a++) {
			for(int i = 0; i< datas.length; i++) {
				if(datas[i].getName().equals("피카츄")) {
					// 사용자가 속성을 바꿀 수 있으므로 객체 식별은 속성으로 할 수 없다.
					if(datas[i] instanceof Pika) { // instanceof 연산자
						datas[i].hello(); // 이 객체가 이 클래스의 인스턴스니?
					}
				}
			}
		}

 

2. Set (집합)

- 추상 클래스로, 객체화가 불가능함.

 

□ 집합의 특징

1. 중복 허용 X

2. 인덱스 개념이 없어서 순서라도 개념은 X (중복없는 랜덤수 할 때 굳굳)

3. 제네릭 넣을 수 있음 (집합에서는 조건을 넣어도 오름차순/내림차순 불가능하다)

Set set = new Set();
// 에러 발생 이유 : 추상 클래스라서
		
//	포켓몬 p = new 피카츄();  앞에 있는 애가 추상 클래스라고 생각

 

3. Map (맵)

- 추상 클래스.

- "HashMap" : Key와 Value가 한 쌍. 인덱스가 없는 대신 key값으로 검색한다.

- key 값은 중복되면 안되며, value는 괜찮다.

Map<Integer,String> map = new HashMap<>();
	// 키값은 integer, value값이 string 
	// 키값은 중복 X (PK / DATA) == > 유일한 값(PK, 주요 키)

- add() 없고 put(key, value) 있음. get도 있는데 키값으로 조회가능. replace(키값, 변경할값) 도 있고..
키값은 replace로 바꿀 수 없다 (지울 수는 있음)

 

package class06;

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

public class Test03 {
	// 맵 Map
	public static void main(String[] args) {
	
	Map<Integer,String> map = new HashMap<>();
	// 키값은 integer, value값이 string 
	// 키값은 중복 X (PK / DATA)
	
	map.put(101, "사과");
	map.put(102,  "바나나");
	map.put(103,  "키위");
	
	System.out.println(map.get(101));
	System.out.println(map.replace(101,"딸기"));
	System.out.println(map);
	}

}

'IT > JAVA' 카테고리의 다른 글

Java Section 15 : 기본 API 클래스  (1) 2025.01.22
Java Section 14 : 예외처리  (1) 2025.01.21
[DAY 14] 예외처리  (0) 2025.01.21
Java Section 13 : 내부 클래스  (0) 2025.01.20
Java Section 12 : 추상 클래스와 인터페이스  (1) 2025.01.19