TIL 2023/10/25 Java

YEONGDO·2023년 10월 25일

1. 배열

  • Array. 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것. 배열을 사용할 때 가장 중요한 것은 위에 강조되어 있다시피 " 같은 타입(Type) "이다.
  • int score1, score2, score3, score4, score5
    
    int[] score = new int[5]
    // score[0] ~ score[4]까지 모두 5개의 저장공간 생성
    

    2. 배열의 선언과 생성

  • 배열의 선언: 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조 변수를 위한 공간이 만들어질 뿐이다.
  • 선언방법	예시
    타입[] 변수이름;	int[] score;
    String[] name;
    타입 변수이름[];	int score[];
    String name[];

  • 배열의 생성: 배열을 생성해야 값을 저장할 수 있는 공간이 만들어진다.
  • 타입[] 변수이름;		// 배열을 선언(배열을 다루기 위한 참조변수 선언)
    변수이름 = new 타입[길이];	// 배열을 생성(실제 저장공간을 생성)

  • 배열의 선언과 생성을 동시에
  • 타입[] 변수이름 = new 타입[길이];	// 배열의 선언과 생성을 동시에
    int[] score = new int[5];		// 길이가 5인 int 배열

  • 배열의 길이와 인덱스: 인덱스 넘버는 0부터 시작하기 때문에, 위의 경우 인덱스의 범위는 0부터 4가 된다.(크기가 5)

  • length: 자바에서는 '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.
  • int[] arr = new int[5];		// 길이가 5인 int배열
    int tmp = arr.length;		// arr.length의 값은 5이고 tmp에 5가 저장된다

    배열은 한번 생성하면 길이를 변경할 수 없으므로, 이미 생성된 배열의 길이는 변하지 않는다.

    그래서 '배열이름.length'는 상수이고, 값을 읽을 수만 있을 뿐 변경할 수 없다.


    ++ for문의 조건식에 배열의 길이를 직접 적기보다 '배열이름.length'를 사용하는 것이 좋다.


  • 배열의 초기화: 배열은 원래 생성과 동시에 자동으로 자신의 타입에 해당하는 기본값으로 초기화된다. 따로 초기화하지 않아도 되지만, 원하는 값을 저장하고 싶다면 값을 지정해야 한다.
  • int[] candy = new int[5];
    candy[0] = 10;
    candy[1] = 20;
    candy[2] = 30;
    candy[3] = 40;
    candy[4] = 50;

  • 배열의 생성과 초기화를 동시에
  • int[] candy = new int[] {10, 20, 30, 40, 50};
    int[] candy = {10, 20, 30, 40, 50};		// new int[] 생략 가능. 더 간단!
    
    // 잘못된 코드의 예
    // 배열의 선언과 생성을 따로 하는 경우에는 new 타입[] 생략 불가능
    int[] candy;
    candy = new int[] {10, 20, 30, 40, 50};		// OK
    candy = {10, 20, 30, 40, 50};		// 에러 발생. new int[] 생략 불가능

  • 복사
    • 얕은 복사
      배열 변수간에 대입 연산자 = 를 사용해서 복사를 하게 되면 주소값만 복사가 된다. 이렇게 주소값만 복사되고 실제값은 1개로 유지되는 걸 얕은 복사라고 한다.
    // 얕은 복사
    
    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문을 통해서 하나씩 꺼내 복사해주는 방법과 여러 메서드를 사용하는 방법이 있다.
    // 깊은 복사
    
    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 배열은 그대로 입니다.
    // 깊은 복사 메서드
    
    // 1. clone() 메서드
    int[] a = { 1, 2, 3, 4 };
    int[] b = a.clone(); // 가장 간단한 방법입니다. 
    // 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!
    // 깊은 복사 메서드
    
    import java.util.Arrays;
    
    public class Main {
    	public static void main(String[] args) {
    		// 2. Arrays.copyOf() 메서드
    		int[] a = { 1, 2, 3, 4 };
    		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
    	}
    }

  • String 배열의 선언과 생성 및 초기화
  • // String 배열 선언과 생성
    // String 배열을 아래와 같이 선언과 생성할 수 있습니다.
    String[] stringArray = new String[3];
    // String 배열의 초기화
    // 선언 후 하나씩 초기화 할 수 있습니다.
    String[] stringArray = new String[3];
    stringArray[0] = "val1";
    stringArray[1] = "val2";
    stringArray[2] = "val3";
    
    // 선언과 동시에 초기화 할 수 있습니다.
    String[] stringArray1 = new String[]{"val1", "val2", "val3"};
    String[] stringArray2 = {"val1", "val2", "val3"};

    String 기능을 활용하자

    • String = char[]
      char와 같은 기본형 변수은 소문자로 시작, String과 같은 참조형 변수는 대문자로 시작.

    • String이 가지고 있는 기능

    length() > int > 문자열의 길이를 반환
    charAt(int index) > char > 문자열에서 해당 index의 문자를 반환
    substring(int from, int to) > 문자열에서 해당 범위(from~to)에 있는 문자열을 반환 (to는 범위에 포함되지 않음)
    equals(String str) > boolean > 문자열의 내용이 같은지 확인. 같으면 결과는 true, 다르면 false.
    toCharArray() > char[] > 문자열을 문자배열(char[])로 변환해서 반환
    new String(char[] charArr) > String > 문자배열(char[]) 을 받아서 String으로 복사해서 반환

    // String 기능 활용하기
    
    String str = "ABCD";
    
    // length()
    int strLength = str.length();
    System.out.println(strLength);  // 4 출력
    
    // charAt(int index)
    char strChar = str.charAt(2); // 순번은 0부터 시작하니까 2순번은 3번째 문자를 가리킵니다.
    System.out.println(strChar);  // C 출력
    
    // substring(int from, int to)
    String strSub = str.substring(0, 3); // 0~2순번까지 자르기 합니다. (3순번은 제외)
    System.out.println(strSub);  // ABC 출력
    
    // equals(String str)
    String newStr = "ABCD";  // str 값과 같은 문자열 생성
    boolean strEqual = newStr.equals(str);
    System.out.println(strEqual); // true 출력
    
    // toCharArray()
    char[] strCharArray = str.toCharArray(); // String 을 char[] 로 변환
    
    // 반대로 char[] 를 String로 변환하는 방법
    char[] charArray = {'A', 'B', 'C'};
    String charArrayString = new String(charArray); // char[] 를 String 으로 변환

  • 다차원 배열
  • 1) 2차원 배열

    • 선언: 2차원 배열을 선언할 때는 1차원 배열에 대괄호를 하나 더 추가
    • 생성: 2차원 배열을 생성할 때도 대괄호를 하나 더 추가하면 된다.
    • 초기화: 2차원 배열을 초기화하는 데는 2가지 방법이 있다.
    // 중괄호를 사용해 초기화
    
    int[][] array = {
    	{1, 2, 3},
    	{4, 5, 6}
    };
    // 반복문을 통한 초기화
    
    int[][] array = new int[2][3]; // 최초 선언
    
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            arr[i][j] = 0;  // i, j 는 위 노란색 네모박스 안에있는 숫자를 의미하며 인덱스 라고 부릅니다.
        }
    }

    2) 가변 배열

    • Java 프로그래밍 에서는 2차원 배열을 생성할 때 열의 길이를 생략하여, 행마다 다른 길이의 배열을 요소로 저장할 수 있다.
    • 이렇게 행마다 다른 길이의 배열을 저장할 수 있는 배열을 가변 배열이라고 한다.
    // 가변 배열
    
    // 선언 및 초기화
    int[][] array = new int[3][];
    // 배열 원소마다 각기다른 크기로 지정 가능합니다.
    array[0] = new int[2];
    array[1] = new int[4];
    array[2] = new int[1];
    
    // 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
    int[][] array2 = {
        {10, 20},
        {10, 20, 30, 40},
        {10}
    
    };

    3) 2차원 배열 이상의 다차원 배열

    • 2차원 배열 외에 3차원,4차원... 등이 있지만 대부분 3차원까지만 사용
      ex. int[][][] multiArrary
    // 3차원 배열의 이해
    
    // 중괄호 3개를 써서 3차원 배열 초기화를 할 수 있습니다.
    int[][][] MultiArray = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
    profile
    개발 블로그

    0개의 댓글