organize/자바

Java 24

001cloudid 2024. 5. 9. 23:13
728x90

Iterator, ListIterator, Enumeration

  • 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스(읽어오기)
  • Enumeration은 Iterator의 구버전(≒ Iterator)
  • ListIterator는 Iterator의 접근성을 향상시킨 것(단방향에서 양방향으로)
메서드 설명
boolean hasNext() 읽어올 요소가 남아있는지 확인. 있으면 true, 없으면 false 반환(확인)
Object next() 다음 요소를 읽어옴. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전(읽기)
void remove() next()로 읽어온 요소를 삭제. next()를 호출한 다음에 remove()를 호출해야함(선택적 기능)
void forEachRemaining(Consumer<? super E> action) 컬렉션에 남아있는 요소들에 대해 지정된 작업(action)을 수행. 람다식을 사용하는 디폴트 메서드

Iterator 인터페이스의 메서드

메서드 설명
boolean hasMoreElements() 읽어 올 요소가 남아있는지 확인. 있으면 true, 없으면 false 반환.
Iterator의 hasNext()와 같음
Object nextElement() 다음 요소를 읽어옴. nextElement()를 호출하기 전 hasMoreElements()를 호출해서 읽어올 요소가 남아있는지 확인하는 것이 안정
Iterator의 next()와 같음

Enumeration 인터페이스 메서드

 

  • 컬렉션(List, Set, Map)에 저장된 요소들을 읽어오는 방법을 표준화한 것. Iterator로 hasNext()로 확인 후 Object next()로 읽기
  • 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
		List list = new ArrayList(); //다른 컬렉션으로 변경할 때 이 부분만 고치면 됨
		Iterator it = list.iterator();
		while (it.hasNext()) { //읽어 올 요소가 있는지 확인
			System.out.println(it.next()); //다음 요소를 읽어옴
		}

 

package chapter11;

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

public class Study06Ex1 {

	public static void main(String[] args) {
		
		ArrayList list = new ArrayList();

		list.add("1");
		list.add("2");
		list.add("3");
		list.add("4");
		list.add("5");
		
		//iterator는 1회용임
		Iterator iterator = list.iterator(); 
		
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
//		==
//		while(iterator.hasNext()) {
//			Object obj = iterator.next();
//			System.out.println(obj);
//		}
		
		
		//재사용하고자 할 때 다시 얻어와야함
		iterator = list.iterator();
		
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
		
		System.out.println("for문으로");
		
		for(int i = 0 ; i < list.size();i++) {
			Object obj = list.get(i);
			System.out.println(obj);
		}
	}

}

 

package chapter11;

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

public class Study06Ex1_1 {

	public static void main(String[] args) {
		
		HashSet list = new HashSet(); //Set은 Collection의 자손 

		list.add("1");
		list.add("2");
		list.add("3");
		list.add("4");
		list.add("5");
		
		Iterator iterator = list.iterator(); 
		
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
//		==
//		while(iterator.hasNext()) {
//			Object obj = iterator.next();
//			System.out.println(obj);
//		}
		

//		HashSet으로 변경 시 get() 메소드가 없어서 사용할 수 없음
//		System.out.println("for문으로");
//		
//		for(int i = 0 ; i < list.size();i++) {
//			Object obj = list.get(i);
//			System.out.println(obj);
//		}
	}

}

 

package chapter11;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class Study06Ex1_2 {

	public static void main(String[] args) {
		
		Collection collection = new HashSet();  
//		Collection collection = new TreeSet();  

		collection.add("1");
		collection.add("2");
		collection.add("3");
		collection.add("4");
		collection.add("5");
		
		Iterator iterator = collection.iterator(); 
		
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
//		==
//		while(iterator.hasNext()) {
//			Object obj = iterator.next();
//			System.out.println(obj);
//		}
		

//		HashSet으로 변경 시 get() 메소드가 없어서 사용할 수 없음
//		System.out.println("for문으로");
//		
//		for(int i = 0 ; i < list.size();i++) {
//			Object obj = list.get(i);
//			System.out.println(obj);
//		}
	}

}

 

Map

Map에는 iterator()가 없음. keySet(), entrySet(), values()를 호출해야함

Map map = new HashMap();
(...생략...)
Iterator iterator = map.entrySet().iterator();
//Set eSet = map.entrySet(); Iterator it = eSet.iterator();

 

Arrays

배열을 다루기 편리한 메서드(static) 제공

  • 배열의 출력 toString()
  • 배열의 복사 copyOf(), copyOfRange() 새로운 배열 생성해서 반환
		int[] arr = {0,1,2,3,4};
		int[] arr2 = Arrays.copyOf(arr, arr.length); //arr2 = [0,1,2,3,4]
		int[] arr3 = Arrays.copyOf(arr, 4); //arr3 = [0,1,2,3]
		int[] arr4 = Arrays.copyOf(arr, 7); //arr4 = [0,1,2,3,4,0,0]
		int[] arr5 = Arrays.copyOfRange(arr4, 1, 4); //arr5 = [1,2,3]
		int[] arr6 = Arrays.copyOfRange(arr, 0, 7); //arr6 = [0,1,2,3,4,0,0]

 

  • 배열 채우기 fill(), setAll()
		int[] arr = new int[5];
		Arrays.fill(arr, 9); //arr=[9,9,9,9,9]
		Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1); //람다식, arr=[1,4,5,3,1](임의의 1~5사이의 정수값)
  • 배열의 정렬과 검색 sort(), binarySearch()
		int[] arr = {3,2,1,0,4};
//		int idx = Arrays.binarySearch(arr, 2); //idx = -5 잘못된 결과, 이진 탐색은 정렬된 배열에만 가능
		Arrays.sort(arr); //arr를 정렬
		System.out.println(Arrays.toString(arr)); //[0,1,2,3,4]
		int idx = Arrays.binarySearch(arr, 2); //idx = 2 올바른 결과

 

※순차 검색, 이진 검색

순차 검색 => 순서대로 처음부터 하나하나 찾고자하는 값을 탐색함.

이진 검색 => 정렬한 후 비교값을 반으로 나눔 => 반으로 나눔

이진(이분) 검색이 순차 검색보다 검색하는 것이 더 빠름

 

  • 다차원 배열의 출력 deepToString()
		int[] arr = {0,1,2,3,4};
		int[][] arr2D = {{11,12},{21,22}};
		System.out.println(Arrays.toString(arr)); //[0,1,2,3,4]
		System.out.println(Arrays.deepToString(arr2D)); //[[11,12],[21,22]]
  • 다차원 배열의 비교 deepEquals()
		String[][] str2D = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
		String[][] str2D2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
		System.out.println(Arrays.equals(str2D, str2D2)); //false
		System.out.println(Arrays.deepEquals(str2D, str2D2)); //true
  • 배열을 List로 변환 asList(Object... a)
		//asList(Object... a)가변 매개변수(개수가 정해지지 않음)
		List list = Arrays.asList(new Integer[] {1,2,3,4,5}); //list=[1,2,3,4,5]
		List list = Arrays.asList(1,2,3,4,5);
		list.add(6); //List는 읽기 전용 UnsupportedOperationException 예외 발생
		List list = new ArrayList(Arrays.asList(1,2,3,4,5)); //새로운 ArrayList. 변경가능
  • 람다와 스트림 parallelXXX(), spliterator(), stream()

 

package chapter11;

import java.util.Arrays;

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

		int[] arr = {0,1,2,3,4};
		int[][] arr2D = {{11,12,13},{21,22,23}};
		
		System.out.println("arr = " + Arrays.toString(arr)); //arr = [0,1,2,3,4]
		System.out.println("arr2D = " + Arrays.deepToString(arr2D)); //arr2D = [[11,12,13],[21,22,23]]
		
		int[] arr2 = Arrays.copyOf(arr, arr.length); 
		int[] arr3 = Arrays.copyOf(arr, 4); 
		int[] arr4 = Arrays.copyOf(arr, 7); 
		int[] arr5 = Arrays.copyOfRange(arr4, 1, 4);
		int[] arr6 = Arrays.copyOfRange(arr, 0, 7); 
		
		System.out.println("arr2 = " + Arrays.toString(arr2)); //arr2 = [0,1,2,3,4]
		System.out.println("arr3 = " + Arrays.toString(arr3)); //arr3 = [0,1,2,3]
		System.out.println("arr4 = " + Arrays.toString(arr4)); //arr4 = [0,1,2,3,4,0,0]
		System.out.println("arr5 = " + Arrays.toString(arr5)); //arr5 = [1,2,3]
		System.out.println("arr6 = " + Arrays.toString(arr6)); //arr6 = [0,1,2,3,4,0,0]
		
		int[] arr7 = new int[5];
		Arrays.fill(arr7, 9); 
		System.out.println("fill(arr7) = " + Arrays.toString(arr7)); //arr=[9,9,9,9,9]
		Arrays.setAll(arr7, (i) -> (int)(Math.random()*5)+1); 
		System.out.println("setAll(arr7)" + Arrays.toString(arr7)); //arr=[임의의 1~5사이의 정수값 5개]
		
		for(int i : arr7) {
			char[] graph = new char[i];
			Arrays.fill(graph, '*');
			System.out.println(new String(graph)+i);
		}
		
		String[][] str2D = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
		String[][] str2D2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
		System.out.println(Arrays.equals(str2D, str2D2)); //false
		System.out.println(Arrays.deepEquals(str2D, str2D2)); //true
		
		char[] chArr = {'A','D','C','B','E'};
		System.out.println("chArr = " + Arrays.toString(chArr)); //chArr=[A,D,C,B,E]
		System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B')); //-2
		Arrays.sort(chArr);
		System.out.println("chArr = " + Arrays.toString(chArr)); //chArr=[A,B,C,D,E]
		System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B')); //1
		
	}

}

 

240510

Comparator, Comparable

  • 객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
    Comparable : 기본 정렬기준을 구현하는데 사용(default)
    Comparator : 기본 정렬기준 외 다른 기준으로 정렬하고자 할 때 사용
    정렬 => 두 대상을 비교하고 자리 바꿈(오름차순, 내림차순)
//Comparator
public interface Comparator{
	int compare(Object o1, Object o2); //o1, o2 두 객체를 비교. 0이면 같음, 양수 o1>o2, 음수 o1<o2
    boolean equals(Object obj); //equals를 오버라이딩해야함
}    
//Comparable
public interface Comparable{
	int compareTo(Object o); //주어진 객체(o)를 자신(this)과 비교
}
  • compare()와 compareTo()는 두 객체의 비교결과를 반환하도록 작성
    같으면 0, 오른쪽이 크면 음수, 작으면 양수
public final class Integer extends Number implements Comparable{
	(...생략...)
    public int compareTo(Integer anotherInteger){
    	int v1 = this.value;
        int v2 = anotherInteger.value;
        return (v1 < v2 ? -1 : (v1==v2? 0 : 1)); //같으면 0, 오른쪽 값이 크면 -1, 작으면 1을 반환
    }
    (...생략...)
}

 

package chapter11;

import java.util.Arrays;
import java.util.Comparator;

class Descending implements Comparator{
	public int compare(Object o1, Object o2) {
		if(o1 instanceof Comparable && o2 instanceof Comparable) {
			Comparable c1 = (Comparable)o1;
			Comparable c2 = (Comparable)o2;
			return c1.compareTo(c2) * -1; //-1을 곱해서 기본 정렬방식의 역으로 변경 또는 c2.compareTo(c1)으로 작성
		}
		return -1;
	}
}


public class Study08Ex1 {

	public static void main(String[] args) {
		
		String[] strArr = {"cat", "Dog", "brid", "tiger", "panda"};
		
		Arrays.sort(strArr); //String의 Comparable구현에 의한 정렬
		//정렬을 위해서는 1) 대상 2) 기준이 필요함
		//static void sort(Object[] a) //객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
		//static void sort(Object[] a, Comparator c) //지정한 Comparator에 의한 정렬
		System.out.println("strArr = " + Arrays.toString(strArr)); //strArr = [Dog, brid, cat, panda, tiger] 대문자가 먼저

		Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); //대소문자 구분 안함
		System.out.println("strArr = " + Arrays.toString(strArr)); //strArr = [brid, cat, Dog, panda, tiger]
		
		Arrays.sort(strArr,new Descending()); //역순 정렬
		System.out.println("strArr = " + Arrays.toString(strArr)); //strArr = [tiger, panda, cat, brid, Dog]
		
		
	}

}

 

Integer와 Comparable

public final class Integer extends Number implements Comparable{
	(...생략...)
    public int compareTo(Integer anotherInteger){
    	int v1 = this.value;
        int v2 = anotherInteger.value;
        return (v1 < v2 ? -1 : (v1==v2? 0 : 1)); //같으면 0, 오른쪽 값이 크면 -1, 작으면 1을 반환
    }
    (...생략...)
}

 

//		public final class Integer extends Number implements Comparable{
//		(...생략...)
//	    public int compareTo(Integer anotherInteger){
//	    	int v1 = this.value;
//	        int v2 = anotherInteger.value;
//			return thisVal - anotherVal; //내림차순의 경우 반대로 뺄셈
//	    }
//	    (...생략...)
//	}

 

//버블정렬
static void sort(int[] inArr){
	for(int i=0;i<inArr.length-1;i++){
    	for(int j=0;j<intArr.length-1-i;j++){
        	int tmp = 0;
            
            if(intArr[j]>intArr[j+1]){
            	tmp = intArr[j];
                intArr[j] = intArr[j+1];
                intArr[j+1] = tmp;
            }
       }
   }
}

 

 

728x90

'organize > 자바' 카테고리의 다른 글

Java 26  (0) 2024.05.13
Java 25  (0) 2024.05.11
Java 23  (0) 2024.05.08
Java 22  (0) 2024.05.07
Java 21  (0) 2024.05.06