11.11 Arrays 클래스
Arrays 클래스는 배열 조작 기능을 가지고 있다. 배열 조작이란 배열의 복사, 항목 정렬, 항목 검색과 같은 기능을 말한다.
11.11.1 배열 복사
배열 복사를 위해 사용할 수 있는 메소드는 copyOf(원본배열, 복사할 길이), copyOfRange(원본배열, 시작인덱스, 끝 인덱스)이다
복사할 길이는 원본 배열의 길이보다 커도되며, 타겟 배열의 길이가 된다
char[] arr1 = {'J','A','V','A'};
char[] arr2 = Arrays.copyOf(arr1, arr1.length);
copyOfRang는 원본 배열의 시작 인덱스에서 끝 인덱스까지 복사한 배열을 리턴한다. 시작 인덱스는 포함되지만, 끝 인덱스는 포함되지 않는다.
char[] arr1 = {'J','A','V','A'};
char[] arr2 = Arrays.copyOfRange(arr1, 1,3)
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
System.arraycopy(원본배열 ,원본 시작인덱스, 타겟배열,타겟 시작인덱스, 복사갯수)
arraycopy(arr1, 1, arr2, 3, 2);
11.11.2 배열 항목 비교
Arrays의 equals()와 deepEquals()는 배열 항목을 비교한다. equals()는 1차 항목의 값만 비교하고, deepEquals()는 1차 항목이 서로 다른 배열을 참조할 경우
중첩된 배열의 항목까지 비교한다.
얕은 복제후 비교
package main.java.chap11.part11;
import java.util.Arrays;
public class EqualsExample {
public static void main(String[] args) {
int[][] original = {{1, 2}, {3, 4}};
System.out.println("얕은 복제후 비교");
int[][] cloned1 = Arrays.copyOf(original, original.length);
System.out.println("배열 번지 비교:" + original.equals(cloned1));
System.out.println("1차 배열 항목값 비교" + Arrays.equals(original,cloned1));
System.out.println("중첩 배열 항목값 비교" + Arrays.deepEquals(original,cloned1));
}
}
equals()비교
Arrays.equals()비교
Arrays.deepEquals()비교
- original과 cloned의 객체주소값은 다르다.
- original과 cloned은 둘다 null아니다
- 두 배열은 사이즈가 같다
반복분에서
e1(a1[0]) == e2(a2[0]) 주소값이 같으므로 continue;
e1(a1[1]) == e2(a2[1]) 주소값이 같으므로 continue;
반복문 끝
true 반환
Arrays.deepEquals(original,cloned1) : true
깊은 복제후 비교
public class EqualsExample {
public static void main(String[] args) {
int[][] original = {{1, 2}, {3, 4}};
System.out.println("깊은 복제후 비교");
int[][] cloned1 = Arrays.copyOf(original, original.length);
cloned1[0] = Arrays.copyOf(original[0], original[0].length);
cloned1[1] = Arrays.copyOf(original[1], original[1].length);
System.out.println("배열 번지 비교" + original.equals(cloned1));
System.out.println("1차 배열 항목값 비교" + Arrays.equals(original,cloned1));
System.out.println("중첩 배열 항모고 비교" + Arrays.deepEquals(original,cloned1));
}
}
equals()비교
Arrays.equals()비교
Arrays.deepEquals()비교
- original과 cloned1의 주소값은 같지 않다.
- 둘다 null이 아니다.
- 둘 사이즈가 같다
- 반복문진입
- e1(original[0]) == e2[cloned[0]) 다르다
- deepEquals0(e1, e2)진입
- true 반환
- e1(original[1]) == e2[cloned[1]) 다르다.
- deepEquals0(e1,e2)진입
- ture 반환
- 최종 true 반환
Arrays.deepEquals(original,cloned1) = true
11.11.3 배열 항목 정렬
사용자 정의 클래스 타입일 경우에는 클래스가 Comparable 인터페이스를 구현하고 있어야 정렬이 된다.
package main.java.chap11.part11.comparable;
public class Member implements Comparable<Member>{
String name;
public Member(String name) {
this.name = name;
}
@Override
public int compareTo(Member o) {
return name.compareTo(o.name);
}
}
package main.java.chap11.part11.comparable;
import java.util.Arrays;
public class SortExample {
public static void main(String[] args) {
int[] scores ={99, 97, 98};
Arrays.sort(scores);
// 97,98,99
String[] names = {"홍길동","박동수","김민수"};
Arrays.sort(names);
//김민수, 박동수, 홍길동
Member m1 = new Member("홍길동");
Member m2 = new Member("박동수");
Member m3 = new Member("김민수");
Member[] members = {m1, m2, m3};
Arrays.sort(members);
//김민수, 박동수, 홍길동
}
}
11.12 Wrapper(포장)클래스
자바는 기본타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체를 생성할 수 있다.
이런 객체를 포장(Wrapper) 객체라고 하는데 , 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문이다.
포장 객체의 특징은 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다.
11.12.1 박싱과 언박싱
기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내느 과정은 언박싱이라고 한다.
ex)
기본 타입값을 줄 경우
Byte obj= new Byte(10);
Character obj = new Character("가")
Short obj = new Short(100);
문자열을 줄 경우
Byte obj = new Byte("10");
Short obj = new Short("100")
생성자를 이용하지 않아도 다음과 같이 각 포장 클래스마다 가지고 있는 정적 valueOf() 메소드를 사용할 수도 있다.
Integer obj = Integer.valueOf(1000);
Integer obj = Integer.valueOf("1000");
이렇게 박싱된 포장 객체에서 다시 기본 타입의 값을 얻어 내기 위해서는 각 포장 클래스마다 가지고 있는 "기본타입명 + value()" 메소드를 사용한다.
11.12.3 문자열을 기본 타입 값으로 변환
포장 클래스의 주요 용도는 기본 타입의 값을 박싱해서 포장 객체로 만드는 것이지만, 문자열을 기본 타입 값으로 변환 할때에도 사용한다.
public class StringToPrimitiveValueExample {
public static void main(String[] args) {
int value1 = Integer.parseInt("10");
double value2 = Double.parseDouble("3.14");
boolean value3 = Boolean.parseBoolean("true");
}
}
11.12.4 포장 값 비교
포장 객체는 ==와 ≠ 연산자를 사용할 수 없다.
단 boolean, char, byte, short, int 타입은 ==와 ≠ 로 비교가 가능하다.
포장 객체에 정확히 어떤 값이 저장될지 모르는 상황이라면 언박싱해서 비교하거나, equals() 메소드로 내부 값을 비교하는 것이 좋다.
포장 클래스의 equals() 메소드는 내부의 값을 비교하도록 오버라이딩 되어있다.
'책 > 이것이 자바다' 카테고리의 다른 글
[11장] 기본API클래스(2) (0) | 2022.02.14 |
---|---|
[11장]기본 API클래스 (0) | 2022.02.14 |
[10장]예외처리 (0) | 2022.02.14 |
[9장]중첩 클래스와 중첩 인터페이스 (0) | 2022.02.14 |
[8장]인터페이스 (0) | 2022.02.14 |