본문으로 바로가기
반응형

 

 

지난 포스팅에서 자바의 기본 API 대해 다뤄봤습니다.

 

 

 

 

 

이번 포스팅에서는 자바의 Collection 대해서 다뤄보고자 합니다.

 

 

 

 

 




 

먼저 컬렉션이란,,

 

 

메모리상에서 자료를 구조적으로 처리하는 방법자료구조라 일컫는데,

컬렉션(Collection)은 자바에서 제공하는 자료구조를 담당하는 프레임워크입니다.


추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결되어 자료구조적 알고리즘을
구현할 필요가 없죠.



java.util 패키지에 포함되며, 인터페이스를 통해 정형화된 방법으로
다양한 컬렉션 클래스 이용 가능합니다.

 

 

 

 

 


 

 

 

여기서 자료구조란,,

 

 

데이터(자료)를 메모리에서 구조적으로 처리하는 방법론이라고 하는데요.

 

그림으로 보면 아래와 같습니다.

 

 

 

이전까지 학습해왔던건 

단순구조(변수)까지 였는데요.

 

아직 학습할 자바의 여러 자료구조들이 많이 남았죠 ...ㅎ

 

 

 

지금 다뤄볼 건 선형구조에 리스트입니다.

 

 

 

 


 

 

 

 

▶ 자료구조

 

 

 

여러 자료들을 저장하기 위해, 이전까지 자료들을 배열에 삽입했었습니다.

 

하지만 배열이 여러 자료들을 담는다고 해서 장점만 있지는 않습니다.

 

배열에도 여러 문제점이 있습니다.

 

 

 

 

 


배열의 문제점

 

 

1. 한 번 크기를 지정하면 변경할 수 없다.

 

     -  필요에 따라 공간을 늘리거나 줄일 수 없음
     -  공간 크기가 부족하면 에러가 발생
         -> 할당 시 넉넉한 크기로 할당하게 됨 (메모리 낭비)

 


2. 기록된 데이터에 대한 중간 위치의 추가, 삭제가 불편하다.

 

     - 추가, 삭제할 데이터부터 마지막 기록된 데이터까지

       하나씩 뒤로 밀어내고 추가해야 함 (복잡한 알고리즘)

 


3. 한 타입의 데이터만 저장 가능하다.

 

 


 

 

 

 

이러한 문제를 해결하기 위해 컬렉션이 등장합니다.

 

 

 

 

 


 

컬렉션의 장점

 

 

 

1. 저장하는 크기의 제약이 없다.

2. 추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결된다.
     - 자료를 구조적으로 처리하는 자료구조가 내장되어 있어
       알고리즘 구현이 필요 없음

3. 여러 타입의 데이터가 저장 가능하다.
     - 객체만 저장할 수 있기 때문에 필요에 따라 기본 자료형을
       저장해야 하는 경우 Wrapper클래스 사용

 

 


 

 

▶ 컬렉션의 주요 인터페이스

 

 

 

컬렉션 분류

 

 

컬렉션 인터페이스별 특징

 

 


 

▶ List

 

 

 

List란,,

 

 

자료들을 순차적으로 나열한 자료구조로 

 

인덱스로 관리되며, 중복해서 객체 저장 가능합니다.


구현 클래스로 ArrayList와 Vector, LinkedList가 있습니다.

 

 

 

 


 

 

▷ List 계열 주요 메소드

 

 

 

 

 


 

 

▶ ArrayList

 

 

오늘 자세히 알아볼 건 ArrayList 입니다.

 

 

 

ArrayList란,,

 

 

 

List의 후손으로,

초기 저장용량은 10으로 자동 설정 / 따로 지정 가능합니다.


저장 용량을 초과한 객체들이 들어오면 자동으로 증가 / 고정도 가능합니다.


다른 인터페이스 다르게 동기화(Synchronized)를 제공하지 않습니다.

 

* 동기화 - 하나의 자원(데이터)에 대해 여러 스레드가 접근하려 할 때 한 시점에서
하나의 스레드만 사용할 수 있도록 하는 것

 

 

Ex)

 

 

 


 

 

 

 

 

 

이제 ArrayList의 예제를 풀어봅시다.

 

 

 

 

※ String 활용법 혹은 Date 활용법을 익히지 못하신 분들은 아래 링크를 확인 후 문제를 풀어주세요!

https://healthdevelop.tistory.com/entry/java-string

https://healthdevelop.tistory.com/entry/java-date

 

[Java] 자바 날짜 구하기 | 자바 시간 구하기 Date | Calendar | GregorianCalendar | SimpleDateFormat | 자바 날짜

찾고자 하는 내용을 'ctrl + f' 를 눌러 찾으시길 바랍니다. ex) ctrl + f -> "원하는 형식으로 날짜 및 시간 출력" 입력 후 엔터 ※ 필자는 두번째 문단에 작성한  Calendar 클래스를 활용하는 것을 선호

healthdevelop.tistory.com

 

[Java] 자바 String | StringBuilder | StringTokenizer(문자열 분리, 문자열을 정수로, 정수를 문자열로, 문자

찾고자 하는 내용을 'ctrl + f' 를 눌러 찾으시길 바랍니다. ex) ctrl + f -> "문자열을 정수로" 입력 후 엔터 ● String 클래스 ▶ .equals : 문자열 같은지 확인 String str = "동일 문자열 확인"; boolean res..

healthdevelop.tistory.com

 

 

 

 

 

 


ArrayList 예제


 

 

 

 

 

난이도 ★

 

 

 

예제 1

 

 

Q : 사용자 입력으로 정수 데이터를 받아 ArrayList 에 저장 후
     ArrayList에 저장된 모든 정수의 합을 구하여 출력한다.
     (단, 사용자 입력은 한 번만 사용한다.)

 

 

 

 

 

  

   


 

 

 

 

풀이 :

 

 

 

 

import java.text.SimpleDateFormat;
import java.util.*;

public class Sample3 {
	public static Scanner sc = new Scanner(System.in);

	public static void ex1() {
		List<Integer> aList = new ArrayList<Integer>();
		while(true) {
			System.out.print("저장시킬 정수를 입력(띄어쓰기로 구분) : ");
			String sNum = sc.nextLine();
			String[] splitNum = sNum.split(" ");
			int sum = 0, count = 0;
		
			try {
				for(String s: splitNum) {
					aList.add(Integer.valueOf(s));
					sum += aList.get(count++);
				}
			}catch(Exception e) {
				System.out.println("정수만 입력하세요(띄어쓰기 구분)");
				aList.clear();	continue;
			}
			System.out.println(aList);
			System.out.println("배열에 있는 정수들의 합 : " + sum);
			break;
		}
		
		
	}
	
	
	public static void main(String[] args) {
		ex1();
	}

}

⊙ try ~ catch 구문을 학습하지 못하였으면 지우고 해도 무방합니다.



 

 

 


 



 

 

 

난이도 ★

 

 

 

예제 2

 

 

Q : 사용자 입력으로 실수 데이터를 받아 ArrayList 에 저장 후
     ArrayList에 저장된 모든 실수의 합과 평균을 구하여 출력한다.
     (단, 사용자 입력은 한 번만 사용한다.)
)

 

 

 

 

 

  

   


 

 

 

 

풀이 :

 

 

 

 

import java.util.Arrays;
import java.util.Scanner;

public class Sample3 {
	public static void ex1() {
		List<Double> dList = new ArrayList<Double>();
		while(true) {
			System.out.print("저장시킬 실수를 입력(띄어쓰기로 구분) : ");
			String sNum = sc.nextLine();
			String[] splitNum = sNum.split(" ");
			double sum = 0;
			
			try {
				for(String s: splitNum) {
					dList.add(Double.valueOf(s));
					sum += Double.valueOf(s);
				}
			}catch(Exception e) {
				System.out.println("정수만 입력하세요(띄어쓰기 구분)");
				dList.clear();	continue;
			}
			
			System.out.println(dList);
			System.out.println("저장된 실수들의 합은 : " + sum +", 평균은 " + sum/dList.size());
			break;
		}
		
	}
	
	
	public static void main(String[] args) {
		ex1();
	}

}

 

 

 

 


 



 

 

 

 

난이도 ★

 

 

 

예제 3

 

 

Q : 다음의 요구사항을 잘 보고 요구사항에 맞도록 구현한다.
       - 사용자 입력으로 정수 데이터를 받아 ArrayList 에 저장을 해야 한다.
       - 사용자 입력으로 하나의 정수 데이터를 입력할 수 있지만 2개 이상의 정수를 입력하기도 한다.
       - 동일한 정수 데이터는 ArrayList에 저장되지 않도록 한다.

 

 

 

 

 

  

   


 

 

 

 

풀이 :

 

 

 

 

import java.util.Arrays;
import java.util.Scanner;

public class Sample3 {
	public static void ex1() {
    
		List<Integer> aList = new ArrayList<Integer>();
		while(true) {
			System.out.print("저장시킬 정수를 입력(띄어쓰기로 구분) : ");
			String sNum = sc.nextLine();
			String[] splitNum = sNum.split(" ");
		
		
			try {
				for(String s: splitNum) {
					aList.add(Integer.valueOf(s));
				}
			}catch(Exception e) {
				System.out.println("정수만 입력하세요(띄어쓰기 구분)");
				aList.clear();	continue;
			}
			
			for(int i=0; i<aList.size()-1; i++) {
				for(int j=i+1; j<aList.size(); j++) {
					
					if(aList.get(i) == aList.get(j)) {
						aList.remove(j);
					}
				}
			}
			System.out.println(aList);
			break;
		}
		
	}

	
	
	public static void main(String[] args) {
		ex1();
	}

}

 

 

 

 


 



 

 

 

 

난이도 ★

 

 

 

예제 4

 

 

Q : 사용자 입력으로 최솟값, 최대값, 갯수 를 입력받아 다음 요구사항에 맞도록 구현한다.
       - 최소값, 최댓값은 랜덤을 통해 생성할 값의 범위이다.
       - 개수는 랜덤을 통해 생성할 값의 수량이다.
       - 생성된 랜덤 값은 ArrayList 에 저장한다.
       - ArrayList에 저장한 정수는 중복이 없어야 한다.

 

 

 

 

 

  

   


 

 

 

 

풀이 :

 

 

 

 

import java.util.Arrays;
import java.util.Scanner;

public class Sample3 {
	public static void ex1() {
		
		List<Integer> aList = new ArrayList<Integer>();
		
		System.out.print("최소값 입력 : ");
		int min = sc.nextInt();		sc.nextLine();
		System.out.print("최댓값 입력 : ");
		int max = sc.nextInt();		sc.nextLine();
		System.out.print("갯수 입력 : ");
		int count = sc.nextInt();	sc.nextLine();
		
		
		for(int i=0; i<count; i++) {
			int rangeNum = (int)((Math.random()*(max-min+1))+min);
			aList.add(rangeNum);
			
			if(i != 0) {
				for(int k=0; k<aList.size()-1; k++) {
					for(int j=k+1; j<aList.size(); j++) {
						
						if(aList.get(k) == aList.get(j)) {
							aList.remove(k);
						}
					}
				}
			}
		}
		
		System.out.println(aList);

	}
	
	
	public static void main(String[] args) {
		ex1();
	}

}

 

 

 

 


 



 

 

 

 

난이도 ★★☆

 

 

예제 5

 

 

Q : 현재 날짜를 구한 후 ArrayList에 년, 월, 일, 시간, 분, 초 데이터가 저장되도록 한다.

 

 

 

 

 

  

   


 

 

 

 

풀이 :

 

 

 

 

import java.util.Arrays;
import java.util.Scanner;

public class Sample3 {
	public static void ex1() {
		
		Calendar cal = Calendar.getInstance();
		SimpleDateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd");
		String date = dFormat.format(cal.getTime());
		
		System.out.println(date);
		
		List<Integer> dateList = new ArrayList<Integer>();
		dateList.add(cal.get(Calendar.YEAR));		dateList.add(cal.get(Calendar.MONTH));
		dateList.add(cal.get(Calendar.DATE));		dateList.add(cal.get(Calendar.HOUR));
		dateList.add(cal.get(Calendar.MINUTE));;	dateList.add(cal.get(Calendar.SECOND));
		
		System.out.println(dateList);

		
		
	}
		

	
	
	public static void main(String[] args) {
		ex1();
	}

}

 

 

 

 


 



 

 

 

 

난이도

 

 

 

예제 6

 

 

Q : 3초에 한 번씩 정기적으로 1 ~ 99 사이의 랜덤 값을 ArrayList 에 저장을 하도록 한다.
     ArrayList 에 저장하는 데이터는 10개로 제한한다.

 

 

 

 

 

  

   


 

 

 

 

풀이 :

 

 

 

 

import java.util.Arrays;
import java.util.Scanner;

public class Sample3 {
	public static void ex1() {
		
		List<Integer> aList = new ArrayList<Integer>();
		int count = 0;
		
		while(count < 10) {
			int random = (int)(Math.random()*99+1);
			Calendar cal = Calendar.getInstance();
			int firstTime = cal.get(Calendar.SECOND);
			
			while(true) {
				Calendar cal2 = Calendar.getInstance();
				int laterTime = cal2.get(Calendar.SECOND);
				
				if(laterTime - firstTime == 3 | laterTime - firstTime == -57) {
					aList.add(random);
					System.out.println(aList);
					count++;
					break;
				}else {
					continue;
				}
			}
		}
	}
	
	
	public static void main(String[] args) {
		ex1();
	}

}

 

 

 

 


 



 

 

 

 

 

난이도 

 

 

 

예제 7

 

 

Q : 3초에 한번씩 정기적으로 1 ~ 99 사이의 랜덤값을 ArrayList 에 저장을 할 때 저장 시간도
     같이 ArrayList에 저장하도록 하며 저장하는 데이터는 10개로 제한한다.
     (단, 중복 데이터는 저장이 안 되도록 하며, ArrayList를 2개 이용하도록 한다. 시간은 년월일
     시분초까지만 저장하도록 한다.)

 

 

 

 

 

  

   


 

 

 

 

풀이 :

 

 

 

 

import java.util.Arrays;
import java.util.Scanner;

public class Sample3 {
	public static void ex1() {
		
		List<Integer> aList = new ArrayList<Integer>();
		List<String> dateList = new ArrayList<String>();
		SimpleDateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		int count=0 ,overlap = 0;
		
		while(count < 10) {
			int random = (int)(Math.random()*99+1);
			Calendar cal = Calendar.getInstance();
			int firstTime = cal.get(Calendar.SECOND);
			for(int i=0; i<aList.size();i++) {
				if(random == aList.get(i)) {
					overlap++;
				}
			}
			if(overlap >= 1) {
				overlap = 0;
				continue;
			}
			
			while(true) {
				Calendar cal2 = Calendar.getInstance();
				int laterTime = cal2.get(Calendar.SECOND);
				
				if(laterTime - firstTime == 3 | laterTime - firstTime == -57) {
					String date = dFormat.format(cal.getTime());
					aList.add(random);		dateList.add(count, date);
					System.out.println("배열: " + aList + "\n생성된 시간 : " + dateList);	
					count++;
					break;
				}else {
					continue;
				}
			}
			
		}
	}
	
	
	public static void main(String[] args) {
		ex1();
	}

}

 

 

 

 


 



 

이상  Arraylist 실습 문제를 마치겠습니다.

 

 

다음 포스팅에선 Collection의 List에 대해 다뤄보고자 합니다.



반응형