노트코드
노트코드
노트코드

블로그 메뉴

  • 홈
  • 이력서
  • 이전 블로그
  • 글쓰기
  • 관리자페이지
  • 분류 전체보기 (57)
    • 코틀린 (2)
      • 실무 프로젝트로 배우는 Kotlin & Sprin.. (2)
    • JAVA (1)
      • 디자인패턴 (1)
      • 객체지향 5대원칙 (0)
    • SPRING (32)
      • JPA (11)
      • 스프링시큐리티 (1)
      • 스프링 (8)
      • QueryDsl (1)
      • 스프링배치 (11)
    • AZURE (0)
    • ETC (10)
      • MAVEN (0)
      • GIT (0)
      • ReMind (3)
      • Exception (1)
      • CS (6)
    • 책 (8)
      • 이것이 자바다 (8)

최근 글

최근 댓글

태그

  • JPA
  • 스프링
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
노트코드

노트코드

책/이것이 자바다

[11장] 기본API클래스(3)

2022. 2. 14. 11:26

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이 아니다.
  • 둘 사이즈가 같다
  1. 반복문진입
  2. e1(original[0]) == e2[cloned[0]) 다르다
  3. deepEquals0(e1, e2)진입
  4. true 반환
  5. e1(original[1]) == e2[cloned[1]) 다르다.
  6. deepEquals0(e1,e2)진입
  7. ture 반환
  8. 최종 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
    '책/이것이 자바다' 카테고리의 다른 글
    • [11장] 기본API클래스(2)
    • [11장]기본 API클래스
    • [10장]예외처리
    • [9장]중첩 클래스와 중첩 인터페이스
    노트코드
    노트코드
    노션 블로그에서 티스토리로 이전공사중

    티스토리툴바