우리가 기본적으로 많이 사용하는 반복문은 for문이다.
그리고 for문과 동일한 출력을 가지는 for Each문이 존재한다.
for Each문은 향상된 for문이라고도 불린다.
배열에서는 array.length; 를 사용하지만 리스트나 맵의 경우
list.size(), map.size()를 통하여 메소드를 호출한다.
public class ForEach {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < list.size(); i++) {
}
}
}
이 때 list의 개수가 100만개라면?
list.size() 메소드를 100만 번 호출하게 되는 것이다.
public class ForEach {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Map<String, String> map = new HashMap<String, String>();
int size = list.size();
for(int i = 0; i < size; i++) {
}
}
}
list의 크기를 미리 구한 뒤 반복을 하면 불필요한 호출을 피할 수 있다.
배열, 리스트, 맵을 이용하여 for문을 돌릴 때 상황에 따라 for Each를 사용할 수도 있다.
for Each문
for Each문도 사용 방법이 여러 가지인데
일반적으로 향상된 for문을 사용하는 방법이 존재하며,
람다식으로 표현하는 for문도 존재한다.
Array
일반적인 for문
public class ForEach {
public static void main(String[] args) {
int[] str = new int[10];
for(int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
String[] str2 = new String[10];
for(int i = 0; i < str2.length; i++) {
System.out.println(str2[i]);
}
}
}
향상된 for문
public class ForEach {
public static void main(String[] args) {
int[] arr = new int[10];
for(int i : arr) {
System.out.println(i);
}
String[] arr2 = new String[10];
for(String s : arr2) {
System.out.println(s);
}
}
}
이런식으로 사용이 가능하다.
배열에서 for Each를 사용하기 위해서는 Stream API를 사용해야한다.
public class ForEach {
public static void main(String[] args) {
String[] arr = new String[10];
Arrays.stream(arr).forEach(s -> System.out.println(s));
}
}
List
일반적인 for문
public class ForEach {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
int size = list.size();
for(int i = 0; i < size; i++) {
list.get(i);
}
}
}
list에 담겨 있는 데이터를 순차적으로 꺼낼 수 있다.
향상된 for문
public class ForEach {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for(String s : list) {
System.out.println(s);
}
}
}
for Each문
public class ForEach {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.forEach(s -> System.out.println(s));
}
}
일반적인 for문에 비해 편리하고 가독성이 좋다.
Map
Map은 List와 비슷하나 key와 value로 매칭이 되어 있기 때문에 조금 다른 방식을 사용한다.
public class ForEach {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
System.out.println(map.keySet());
System.out.println(map.values());
}
}
------------------ 출력 결과 -------------------
[a, b]
[A, B]
향상된 for문
key값
public class ForEach {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
for(String key : map.keySet()) {
System.out.println(key);
}
}
}
----------------- 출력 결과 ------------------
a
b
value 값
public class ForEach {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
for(String value : map.values()) {
System.out.println(value);
}
}
}
-------------------- 출력 결과 -----------------
A
B
for Each문
public class ForEach {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
map.forEach((key, value) -> {
System.out.println(key+" : "+value);
});
}
}
-------------------- 출력 결과 ---------------------
a : A
b : B
이렇게 배열, 리스트, 맵에서의 for문 사용법을 알아봤다.
향상된 for문은 기본적으로 카운터 변수가 필요하지 않기 때문에
조금 더 코드를 간결하게 만들 수 있다.
for Each 또한 람다식을 이용하기에 코드를 간결하게 작성할 수 있다.
간단한 처리를 할 때는 코드의 간결성, 가독성 면에서 향상된 for, for Each가 좋다.
하지만 향상된 for문과 for Each는 기본적으로 순차적으로 처음부터 끝까지
반복하기 때문에 반복의 순서를 뒤집거나 특정 위치부터 반복하는
반복문에는 유용하지 않다.
그리고 성능적인 부분에서는,
ArrayList에서 for문이 조금 더 빠르고 LinkedList에서는 for Each문이 빠르다.
사실 for문과 for Each문의 성능 차이는 그렇게 크게 나지 않는다.
하지만 작은 프로그램에서는 무엇을 사용해도 차이가 미미하지만,
이러한 차이가 나중에 어떠한 상황에서는 큰 차이가 날 수도 있다.
그래서 주어진 상황에 따라 무엇을 사용하면 좋을지에 대한 고민을 해보는 것이 좋을 것 같다.
'JAVA' 카테고리의 다른 글
[JAVA] JAVA는 인터프리터? 컴파일? (0) | 2022.02.27 |
---|---|
[JAVA] 자바는 무엇인가?(자바의 특징) (0) | 2022.02.27 |
[JAVA] Map - HashMap, TreeMap, LinkedHashMap (0) | 2022.01.12 |
[JAVA] Collection framework (0) | 2022.01.12 |
[JAVA] Static Stack Heap 메모리 구조 (0) | 2022.01.06 |