Joslynn의 하루

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -14일차 노트 필기_자료구조 (컬렉션 프레임워크) List, ArrayList _220804 본문

MSA Full-Stack 개발자 양성과정/Java

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -14일차 노트 필기_자료구조 (컬렉션 프레임워크) List, ArrayList _220804

Joslynn 2022. 8. 4. 18:04

자료 구조

: data를 상황별 저장 방법을 다르게 함;

: 데이터를 저장하는 방식에 따른 다양한 객체를 제공;

: 데이터를 조작(추가, 검색, 삭제, 수정)할 수 있는 메소드를 풍부하게 제공

: 객체만 저장 가능하고, 다양한 데이터 타입 저장할 수 있다. ↔ 배열: 한가지 타입만 가능;

   그러나 저장된 데이터를 꺼낼때는 Object 타입으로만 받을 수 있다. (자료 구조의 단점)

    저장된 데이터를 꺼낼 때 Object로 받아서 instanceOf 연산자로 타입 확인 및 다운캐스팅 필요;

 

→ 개선된 문법 Class ArrayList<E> /*제너릭 타입*/: 한가지 타입으로 저장해서 저장 및 꺼낼 때 모두 캐스팅 없이 한가지 타입으로 사용 가능;

→AutoBoxing && AutoUnBoxing 일어남

 


Java Collection

: 자바의 컬렉션은 모두 인터페이스이다. // implements(구현) 시, 구현 객체에서 모든 메소드 오버라이딩 필요;

: 어마어마하게 많은 메소드 오버라이딩이 필요 → 따라서 자바에서는 이미 구현 객체들을 제공;

 

1) List

: 순서가 있고 중복 가능(같은 객체 저장 가능)

** 미리 구현해놓은 다양한 구현객체: ArrList, Vector, LinkedList

: 리스트를 사용한다는 의미는 사실 구현객체를 생성해서 사용하는 것; 

 

2) Set

: 순서 없고 중복 안 됨

: 구현 객체: HashSet, TreeSert /*요소 정렬*/

 

3) Map: key와 value 한 쌍(EntrySet)으로 이루어져 key는 중복 안되고, value는 중복 가능

            구현 객체: Hashtable, HashMap, TreeMap

 

**중요:  자료 구조는 데이터를 저장할 때, 객체만 저장 가능하다. == 기본형 저장 불가하다.

 


ArrayList

: 가변 크기 배열을 구현한 클래스

: Vetor와 거의 유사하나 자동으로 스레드 동기화를 지원하지 않는다;

 

ArrayList 예제1) 

import java.util.ArrayList;

class Test {
	int a = 0;
	
	public String toString(){
		return "Test";		
	}
}
	
class ArrayListExam extends ArrayList<Object>{

	//전역 Variable
	Object obj;
	int i;

	//Constractor
	public ArrayListExam(){
		//초기 배열 길이 5개 생성
		super(5);
	}

	/*addInt:인수로 받은 정수를 객체로 만들어 list에 추가.*/
	public void addInt(int i) {
		super.add(i); //정수 i - AutoBoxing
		
	}


	/*addFloat: 인수로 받은 실수를 객체로 만들어 list에 추가.*/
	
	public void addFloat(float f) {	
		this.add(5.5F);
	}
	
    
	/*addString: 인수로 받은 String 을 list에 추가.*/
	
	public void addString(String str) {
		
		String stringValue = new String(str);
		add(stringValue);
		
	}
	
	public void addTest(Test t) {
		add(t);
	}
		
	/*printList	: 정수형 전역변수에 현재 list에 들어있는 객체의 개수 입력한 후 전역변수 출력.
		           List에 저장된 각 객체를 맴버변수에 저장한후 출력*/
	
	public void printList() {
		this.i = list.size();
		System.out.println("저장된 객체 갯수:"+i);
		
		for(int index=0; index<i; index++) {
		this.obj = super.get(index); // 다양한 객체들이 저장되어있어 Object 타입으로만 받을 수 있음;
		System.out.println("저장된 객체: "+obj); 
		// 객체가 println 만나면서 자동으로 toString 메소드 실행(toString 메소드 오버라이딩 되어있음)
		
		}
		
		//위의 for문을 개선된 for로 변경
		System.out.println("----------------------");
		for(Object obj:this) { // this는 단독 사용 가능, super는 불가 // 상속을 받았을 때 this로 super 가르킬 수 있음;
			System.out.println("저장된 객체: "+obj);
			
		}
		// 효율적인 code 구성 가능
		
		
	}
		
	public static void main(String args[]){
		ArrayListExam list = new ArrayListExam();
		String s = new String("newString");		 
		list.addInt(5);
		list.addFloat(5.5F);
		list.addString(s);
		list.addTest(new Test());
		list.printList();
	}
}

/*실행결과

list에 들어있는 객체의 총 개수는=3
5
5.5
newString

Normal Termination
출력 완료 (0초 경과).
*/

 


ArrayList VS LinkedArray 예제2)

public class LinkedListExample {

	public static void main(String[] args) {
		
		List <String> list1 = new ArrayList <String>();
		List <String> list2 = new LinkedList<String>();
		
		// 필드 선언
		long startTime;
		long endTime;
		
		
		// ArrayList 실행 시간
		startTime = System.nanoTime(); // 억만분의 1초
		for (int i=0; i<10000; i++) {
			list1.add(0, String.valueOf(i));
			
		}
		endTime = System.nanoTime();
		System.out.println("ArrayList 걸린 시간: "+(endTime-startTime)+"ns");
		
		// LinkedList 실행 시간
		startTime = System.nanoTime();
		for (int i = 0; i < 10000; i++) {
			list2.add(0, String.valueOf(i));
		}
		endTime = System.nanoTime();
		System.out.println("LinkedList 걸린 시간: "+(endTime-startTime)+"ns");
		
		
	}

실행값:

 

Comments