향상된 for 문 (enhanced for) foreach
: 배열과 컬렉션을 더 쉽게 처리하기 위해 향상된 for 문을 사용합니다.
// for (대입 받을 변수 정의 : 배열)
for (자료형 변수명 : 배열명) {
문장
}
카운터 변수와 증감 식을 사용하지 않고 항목 수만큼 반복하면 자동으로 for 문을 빠져 나옵니다.
타겟은 배열 또는 복수의 요소를 포함한 데이터형이 아니면 안됩니다.
여러 요소로 구성된 집합의 모든 요소에 대해 특정 작업을 반복하는 데 사용
//배열 변수 선언과 배열 생성
int() scores = { 95, 71, 84, 93, 87 };
//배열 항목 전체 합 구하기
int sum = 0;
for (int score : scores) {
sum = sum + score;
}
System.out.println("점수 총합 = " + sum);
//배열 항목 전체 평균 구하기
double avg = (double) sum / scores.length;
System.out.println("점수 평균 = " + avg);
Arrays 메서드
- Arrays.toString() : 객체가 가지고 있는 정보나 값을 문자열로 반환합니다.
int() arr1 = {9, 8, 7, 1, 2};
for (int n : arr1) {
System.out.println(n);
}
System.out.println(arr1); //(I@515f550a 알 수 없는 문자
//Array.toString 메소드 사용
//ctrl + shift + o : java.util.Arrays를 import
System.out.println(Arrays.toString(arr1));
String() arr2 = {"java", "hello", "friday", "sunday"};
System.out.println(Arrays.toString(arr2));
- Arrays.deepToString() : 참조 참조를 타고 들어가서 배열을 보여준다(2차원 배열 확인)
int() arr1 = {5, 2, 1, 0};
// 1차원 배열은 Arrays.toString()메소드로 확인 가능
System.out.println(Arrays.toString(arr1));
int()() arr2 = {
{7, 8},
{2, 3}
};
System.out.println(arr2(0)); //결과 (I@515f550a
System.out.println(Arrays.toString(arr2)); //결과 ((I@515f550a, (I@626b2d4a)
System.out.println("for loop로 toString");
for (int() arr : arr2) {
System.out.println(Arrays.toString(arr));
} //결과 (7, 8)
(2, 3)
// 2차원 배열은 Arrays.deepToString()메소드로 확인 가능
System.out.println("deepToString 메소드 사용");
System.out.println(Arrays.deepToString(arr2)); //결과 ((7, 8), (2, 3))
- Arrays.sort() : 정렬(오름차순)
// sort : 정렬
int() arr1 = {9, 0, 2, 3, 8,-1};
System.out.println(Arrays.toString(arr1));
// 정렬(오름차순)
// comparable 만 가능 (비교 가능한 것들만)
Arrays.sort(arr1);
System.out.println(Arrays.toString(arr1));
String() arr2 = {"java", "hello", "html", "css"};
System.out.println(Arrays.toString(arr2));
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
String()arr3 = {"java", "hello", "html", "css", "Java", "Css"};
System.out.println(Arrays.toString(arr3));
Arrays.sort(arr3);
System.out.println(Arrays.toString(arr3));
- 배열.toCharArray() : 문자열을 1문자씩 분할하여 char형 배열에 넣는 메서드
// String의 toCharArray
// split 과 비슷한 기능이나 데이터 타입이 다름
String str1 = "hello world!
";
String() arr1 = str1.split("");
System.out.println(Arrays.toString(arr1));
char() arr2 = str1.toCharArray();
System.out.println(Arrays.toString(arr2));
배열 복사
: 배열을 한 번 만들면 길이를 변경할 수 없으므로 더 많은 저장 공간이 필요한 경우
더 큰 길이의 배열을 새로 만들고 이전 배열에서 항목을 복사하여 사용
- for 문을 사용하여 항목을 하나씩 읽고 새 배열에 저장 (클래식 방법)
//고전적인 방법
//길이 3인 배열
int() oldIntArray = {1, 2, 3};
//길이 5인 배열을 새로 생성
int() newIntArray = new int(5);
//배열 항목 복사
for (int i = 0; i < oldIntArray.length; i++) {
newIntArray(i) = oldIntArray(i);
}
//배열 항목 출력
for (int i = 0; i < newIntArray.length; i++) {
System.out.println(newIntArray(i) + ", ");
}
- 시스템.arraycopy(원래 배열, 원본 배열 복사 시작 인덱스, 새 배열, 새 배열 시작 인덱스, 복사할 길이)
//System의 arraycopy() 메소드
//길이 3인 배열
String() oldStrArray = {"java", "array", "copy"};
//길이 5인 배열 새로 생성
String() newStrArray = new String(5);
//배열 항목 복사
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
//배열 항목 출력
for (int i =0; i < newStrArray.length; i++) {
System.out.println(newStrArray(i) + ", ");
}
- Arrays.copyOf(원래 배열, 타겟 배열의 길이)
// Arrays.copyOf() 메소드
//길이 3인 배열
String() oldStrArray = {"java", "array", "copy"};
//배열 항목 복사
String() newStrArray = Arrays.copyOf(oldStrArray, 5);
//배열 항목 출력
for (int i =0; i < newStrArray.length; i++) {
System.out.println(newStrArray(i) + ", ");
}
* Array.copyOf() 메서드를 사용하면 배열의 시작부터 원하는 길이까지 배열의 깊은 복사할 수 있는
int() arr1 = {3, 4, 5};
int() arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr1)); // 결과 (3, 4, 5)
System.out.println(Arrays.toString(arr2)); // 결과 (3, 4, 5)
arr1(0) = 30; //arr1 배열의 원소 값 변경
System.out.println(Arrays.toString(arr1)); // 결과 (30, 4, 5)
System.out.println(Arrays.toString(arr2)); // 결과 (3, 4, 5)
// arr1의 값을 변경해도 arr2에 영향을 미치치 않음(deep copy가 이루어짐)
int()() arr3 = {
{3, 4, 5},
{9, 8, 7}
};
int()() arr4 = Arrays.copyOf(arr3, arr3.length);
System.out.println(arr3.length);
System.out.println(arr4.length);
arr3(0)(0) = 30; //arr3 배열의 원소 값 변경
System.out.println(arr3(0)(0)); //30
System.out.println(arr4(0)(0)); //30
// 같은 값을 참조하고 있기 때문에 둘다 원소의 값이 변경됨(shallow copy가 이루어짐)
ㅁ Shallow copy (얕은 복사)
“주소 값” 복사 (참조하는 실제 값은 동일)
int()() arr1 = {
{3, 4},
{9, 8}
};
//얕은 복사 (shallow copy)
int()() arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println(arr1.length); //결과 2
System.out.println(arr2.length); //결과 2
arr1(0)(0) = 30;
System.out.println(arr1(0)(0)); //결과 30
System.out.println(arr2(0)(0)); //결과 30
ㅁ Deep copy (깊은 복사)
“실제 값”을 새 메모리 공간에 복사(실제 값이 다름)
int()() arr1 = {
{5, 7, 9, 10},
{3, 2, 1, 0}
};
// 깊은 복사 (deep copy)
int()() arr2 = new int(arr1.length)();
for (int i = 0; i < arr1.length; i++) {
arr2(i) = Arrays.copyOf(arr1(i), arr1(i).length);
}
System.out.println(Arrays.toString(arr1(0)));
System.out.println(Arrays.toString(arr1(1)));
System.out.println(Arrays.toString(arr2(0)));
System.out.println(Arrays.toString(arr2(1)));
arr1(0)(0) = 50;
System.out.println(arr1(0)(0));
System.out.println(arr2(0)(0));
regular expression 정규식, 정규식, 정규 표현식
: 패턴을 나타내는 문자열
– \\s*
– matches(string regex)