Java

향상된 for문, 배열(Array), List

shin902 2023. 1. 13. 09:54

기존에 사용하는 for무은 총 조건이 3개 들어가고 , 조건이 충족 되면 "for" 문의 몸통 부분을 실행하게 된다 

이래서 그런지 프로젝트 할 떄마다 향상된 for문을 많이 썻다 

 

 

나의 피셜 걍 좀 더 간단해서 쓰는 거인거같다.

근데 찾아보면 for - each가 컬렉션이 중첩되는 경우 강점이 더욱 커진다고 한다 

그래서 리스트 돌릴 땐 무조건 for - each 사용하자!!!!!!!

 

//일반 for문 
for(String i=0; i<list.length; i++){
	String a = list[i];
}

 

//향상된 for문
List<String> list = Array.aList(1,2,3,4,5);

for(String i : list){
	System.out.pringln(i);
}

 

근데 이렇게 유용하지만 단점도 있기마련

그것은 인덱스를 사용할 수 없다는 것이다 . 

 

결론 

List를 반복할 때는 꼭  for - each나 Iterator를 사용하고, 인덱스가 필요한 경우는 명시적으로 인덱스를 사용하지 않을 수 있게 리팩토링 해보는건 어떨까...?

 


 

그렇다면 리스트에 쓴다고 했는데 초보자들은 리스트랑 배열 좀 헷갈려할 수 도 있다 

(나만 그랬던가 ... )

 

 

배열

index(식별자)와 값으로 구성되어있고 크기가 정해져 있으며 변경 불가능

초기 정의된 크기대로 연속된 메모리 공간을 가짐

장점 단점
메모리 공간이 연속적이여서 관리가 쉽다 
인덱스 활용하니 검색 빠르다 
초기 크기 지정하고 나면 변경이 어렵다 
만약 데이터가 삭제가 되면 빈 공간으로 남아있게 되어 낭비가 크다 

=> 검색 빠르지만 공간이 정해진 초큼 ... 정적인 느낌  그냥 정해져있다 !!!

int[] i = {1,2,3} 

int i = new int[3]

이런식으로 초기 선언을 해서 배열의 초기 크기를 생성을 해준다

 

 

 

리스트

장점 단점
포인터가 다음 데이터의 순서 가리키기 떄문에 삽입 삭제가 빠르다 (Linked List)
크기 할당이 동적이다 
데이터 삭제시, 포인터가 해당 메모리 공간을 가리키지 않으면 되기 때문에 효율적이다
기본 타입은 담을 수 없다 . 객체만 가능

=> 동적이고 포인터가 안가리키면 그 메모리도 안가리키기 때문에 메모리 공간 효율적아닌가ㅎㅎ

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

for(String listname : list){
	System.out.println(listname);
}

 


리스트 종류 

ArrayList, Linkedlist,Vector, Stack

 

ArrayList 

최상위 타입인 Object타입으로 배열을 생성하여 사용하기 때문에 요소 접근에서는 탁월한 성능을 보이나, 중간의 요소가 삽입, 삭제가 일어나는 경우 그 뒤의 요소들은 한 칸씩 밀어야 하거나 당겨야하기 때문에 삽입, 삭제에서는 비효율적

 

LinkedList

객체끼리 연결하는 방식이다. 요소를 검색해야 할 경우 처음 노드부터 찾으려는 노드가 나올 때까지 연결된 노드들을 모두 방문해야한다는 점에서 성능이 떨어지나, 해당 노드를 삭제, 삽입해야 할 경우 해당 노드의 링크를 끊거나 연결만 해주면 되기 때문에 삽입, 삭제에서는 효율이 좋음

 

Vector

잘 안쓰는거 같은데 항상 '동기화를'지원하는것을 알면될거같다 

쉽게 말하면 여러 쓰레드가 동시에 데이터에 접근하려하면 순차적으로 처리하도록 하게 한다는 뜻이다 

 

Stack

쌓아 올리는 것이다 . 후입선출(Lifo) 

아 좋은 예로 웹페이지 '뒤로가기'가 있다 우리가 새로운 페이지로 넘어갈 때마다 넘어가기 전 페이지를 스텍이 쌓고 ,

만약 뒤로가기를 누른다면 가장 위에 있는 페이지부터 꺼내오는 방식

 

전에 자기소개 할때 전 실력을 쌓는 스텍같은 사람입니다!!!라고 연습하던게 생각난다...ㅋㅋㅋㅋㅋㅋㅋㅋㅋ