Backend/Java

Java 문법 2주차 2-11,12 배열, 복사, String배열

chillmyh 2023. 11. 22. 16:29

2-11

배열 (Array)

 - 선언

int와 같은 기본형 변수는 1개의 값만 변수에 저장할 수 있음

int[] 와 같은 배열형 변수는 여러개의 변수에 저장 가능!

 - 여러개를 하나의 변수에 넣어놓고 들고다니거나 하나씩 꺼내 쓸 수 있다는 점에서 분류통의 개념과 비슷

 - 단, 하나의 배열형 변수에는 같은 타입의 변수만 담을 수 있음 ( = 김치통엔 김치만~)

 한번에 많은 양의 데이터를 다루거나 계산할 때 사용 -> for문 등 반복문과 같이 사용. length와 같이 사용하기도함

선언방법 예시

 1. 타입 [] 변수; <- 일반적인 방법

 ex. int[] intArray;

 2. 타입 변수[]

 ex. int intArray[];

 

- 생성

 배열(Array)는 참조형 변수들처럼 new 명령을 통해서 생성하며, 대괄호 [] 안에 크기를 지정해준다.

  - 분류통을 만들때 new 명령어로 생성하고 분류통에 몇개를 담을지 미리 정의해준다고 생각!

  - 주의할점은 분류통은 각 칸마다 순번이 있음. 순번은 0번부터(index) 시작하기 때문에 8개 사이즈 분류통이라면 0~7번까지 있음.

  - int array[] = new int[8] -> 0~7번까지 있음

  - 타입별 초기값으로는 int는 0, boolean은 false, String은 null

 

package week02.array;

public class Arr01 {
    public static void main(String[] args) {
        // 배열 생성
        int[] intArray = new int[3]; // {0, 0, 0}
        boolean[] boolArray = new boolean[3]; // {false, false, false}
        String[] stringArray = new String[3]; // {"", "", ""}

        // 배열 선언 먼저! -> 나중에 초기화
        int[] intArray2;
        intArray2 = new int[3]; // {0, 0, 0}

        // 생성한 배열을 '순회' -> 배열의 값을 하나씩 뽑아서 조회한다.
        // (1) 단건 조회
        System.out.println(intArray[1]); // {0, "0", 0} 0, 1, 2번 순서이기 때문에 가운데 0이 출력
        System.out.println("------");

        // (2) !!다건 조회!!
        // length : 길이를 구하는 메서드
        for (int i=0; i<intArray2.length; i++) {
            System.out.println(intArray2[i]);
        }
    }
}

 

package week02.array;

import java.util.Arrays;

public class Arr02 {
    public static void main(String[] args) {
        // 초기화

        // 1. 배열의 특정값 대입해서 선언
        int[] intArr = {1, 2, 3, 4, 5};
        String[] stringArray = {"a", "b", "c", "d", "e"};

        // 2. for문을 통해서 대입 + 다건출력
        for(int i=0; i<intArr.length; i++) {
            intArr[i] = i; // intArr 배열에 1씩 더해지면 i값이 추가
            System.out.println(intArr[i]); // {0, 1, 2, 3, 4}
        }

        // 향상된 for문 사용
        for (int item: intArr) { // {0, 1, 2, 3, 4}
            System.out.println(item);
        }

        // 배열의 주소를 모두 같은 값으로 초기화
        Arrays.fill(intArr, 1); // (배열명, 원하는 초기값)

        for (int item: intArr) { // {1, 1, 1, 1, 1}
            System.out.println(item);
        }
    }
}

 

2-12

복사

 - 얕은 복사

배열은 참조형 변수이기 때문에 주소값을 이용한다.

따라서 얕은 복사를 해버리면 배열의 값이 같아지는게 아닌, 배열의 '주소값'이 같아진다(공유)

package week02.array;

public class Arr03 {
    public static void main(String[] args) {
        // 얕은 복사

        int[] a = { 1, 2, 3, 4 };
        int[] b = a; // 얕은 복사 -> 똑같은 값을 가지는게 아니라 같은 주소값만 공유하게된다!!

        b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정. (1 -> 3)

        System.out.println(a[0]); // 3.  <- a 배열의 0번째 순번값도 3으로 조회.
    }
}

 

 - 깊은 복사

  - 얕은 복사처럼 가짜 복사가 아니라 진짜 새로운 배열을 값이 똑같게 만들고 싶을때 사용.

  - 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사하는 방법.

  - 반복문 for 등을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법등이 있음.

 

반복문 for을 통한 깊은복사

package week02.array;

public class Arr03 {
    public static void main(String[] args) {
        // 깊은 복사

        int[] a = { 1, 2, 3, 4 };
        int[] b = new int[a.length];

        for (int i = 0; i < a.length; i++) {
            b[i] = a[i]; // 깊은 복사
        }

        b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정. (1 -> 3)

        System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로.
    }
}

 

clone() 메서드

 - 간단하지만, 2차원이상 배열에서는 얕은 복사로 동작한다.

2차원 이상의 배열 : ["a", "b", "c"] 가 아닌 [ [1, 2], [3, 4] ... ] 식의 배열안에 배열이 있는 구조에 대해서는 얕은 복사로 동작한다. 가장 바깥의 괄호 내의 주소값만 새로 지정해 복사해주기 때문에 안에 있는 작은 배열들에 대해서는 얕은복사로 동작하는 것.

 

때문에

 

Arrays.copyOf() 메서드

package week02.array;
import java.util.Arrays;

public class Arr04 {
    public static void main(String[] args) {
        // 2. Arrays.copyOf() 메서드
        int[] a = {1, 2, 3, 4};
        int[] b = Arrays.copyOf(a, a.length); // (배열 a, 배열a의 길이)

        a[3] = 0;
        System.out.println(a[3]); // 0. 4 -> 0
        System.out.println(b[3]); // 4
    }
}

 

String배열들

package week02.array;

public class Arr05 {
    public static void main(String[] args) {
        // 문자(char / 1byte), 문자열(String)
        // String = char[]

        // 기본형 변수 vs 참조형 변수
        // 1. 기본형 변수는 '소문자로 시작함' 반면, 참조형 변수는 '대문자로 시작함'
        //   - Wrapper class에서 기본형 변수를 감싸줄 때(boxing), int -> Integer
        // 2. 기본형 변수는 값 자체를 저장, 참조형 변수는 별도의 공간에 값을 저장 후 그 주소를 저장(= 주소형 변수)

        // char < String(훨씬 더 많이씀)
        // String이 가지고 있는 기능이 너무 많아서..
        // Wrapper class와도 상당히 비슷 ->
        // 기본형 변수가 가지고 있는 기능이 제한 ->
        // 다양한 기능을 제공하는 Wrapper을 감쌈으로써, 추가기능을 더함

        // String 기능 활용 예시
        String str = "ABCD";

        // (1) length
        int strLength = str.length();
        System.out.println(strLength); // 4

        // (2) charAt(int index)
        char strChar = str.charAt(1);
        System.out.println(strChar); // B. 0, 1, 2~ 순서이기때문

        // (3) substring(int formIdx, int toIdx)
        String strSub = str.substring(0, 3); // 0부터 3번째 '전'까지.
        System.out.println(strSub); // A, B, C

        // (4) equals(String str) -> 어떠한 string이 입력받은 string과 같니?
        String newStr = "ABCD";
        boolean strEqual = newStr.equals(str); // equals는 같은지 물어보기 때문에 boolean으로 판별용 변수
        System.out.println(strEqual); // true. newStr과 str의 String 값이 같음

        // (5) toCharArray() : String -> char[]
        char[] strCharArray = str.toCharArray();

        // (6) 반대로 char[] -> String -> char
        char[] charArray = {'A', 'B', 'C'};
        String charArrayString = new String(charArray);
        System.out.println(charArrayString);
    }
}