향상된 for문, 배열(Array), List
기존에 사용하는 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)
아 좋은 예로 웹페이지 '뒤로가기'가 있다 우리가 새로운 페이지로 넘어갈 때마다 넘어가기 전 페이지를 스텍이 쌓고 ,
만약 뒤로가기를 누른다면 가장 위에 있는 페이지부터 꺼내오는 방식
전에 자기소개 할때 전 실력을 쌓는 스텍같은 사람입니다!!!라고 연습하던게 생각난다...ㅋㅋㅋㅋㅋㅋㅋㅋㅋ