YTCW

java 배열, array 본문

java

java 배열, array

YTCW 2024. 9. 5. 12:40

배열이란

같은 타입의 여러 변수를 하나의 집합으로 묶어서 처리하는 자료 구조이다.

데이터를 연속적으로 저장한고 순서 (index 0 ~1씩 증가되는 값) 가 있으며 중복도 가능하다

 

배열과 변수의 차이는

배열은 생성한다라는 표현을 사용하고

변수는 선언하다라는 표현을 사용한다.

 

컴퓨터 프로그래밍에 있어서

생성한다라는 표현은 new 연산자를 사용한다.

 

변수는

in korea = 90;

int math = 75;

 

배열은

생성하여 사용한다 ( new 연산자 )

배열의 선언은

생성한 배열을 담을 그릇 

dataType[] 배열명;

데이터타입 배열명[];

(개발자 차이인데 두개는 같다)

 

int[] array;

정수형의 데이터를 담을 수 있는 배열

 

배열의 생성은

new dataType[배열의 길이];

 

배열은 실제 데이터가 저장되는 것이 아니라

데이터 배열이 저장된 첫 번째 메모리 주소가 저장되는것이다.

 

new int[3]; // 오류가 남

생성하고 반드시 그릇에 담아줘야한다

System.out.println(array); // 주소값으로 나온다 참조 주소값 : [I@4e50df2e

 

배열의 요소에 접근하는법

배열명[인덱스번호] = 데이터;System.out.println(array[0]); // 0

System.out.println(array[1]); // 0

System.out.println(array[2]); // 0

해당 데이터 타입의 기본값(int : 0 , String : null , boolean : fasle)으로 초기화

 

array[0] = 123;

array[1] = 456;

array[2] = 789;

System.out.println(array[3]); //3은 없어서 오류 발생

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

at java_study/chapter03.A_Array.main(A_Array.java:14)

오류 : 길이 3에 대한 인덱스 3 경계를 벗어남

 

배열의 선언과 동시에 초기화

new 연산자를 사용한 직접적인 배열 생성 시 길이를 지정하지 않는다.

생성 시 요소의 개수를 파악하여 배열의 길이를 자동 지정한다.

 

int[] array = new int[] {요소1, 요소2, 요소3};

int[] scoreList = new int[] {90, 85, 100};
System.out.println(scoreList[0]); // 90

 

int array[] = new int[] {요소1, 요소2, 요소3};
char[] greet = {'h', 'e', 'l', 'l', 'o'};

System.out.println(greet[0]); // h
System.out.println(greet[1]); // e
System.out.println(greet[2]); // l
System.out.println(greet[3]); // l
System.out.println(greet[4]); // o

 

배열의 길이(크기) .length 속성으로 확인

System.out.println(greet.length); // 5

 

배열의 특징은

한 번 생성되면 크기 변경이 안되고

참조 타입은 주소값이 저장되며

모든 요소는 같은 자료형이라여 합니다.

 

문자열 배열 생성

String[] fruits = new String[3];
System.out.println(fruits[0]); // null

fruits[0] = "사과";
System.out.println(fruits[0]); // 사과

 

배열 요소를 삭제

삭제 기능을 담당하는 문법은 아니고

삭제할 요소를 제외한 나머지 요소를 새로운 배열로 복사하는 방법이다. 필터기능과 유사함

int[] original = {1, 2, 3, 4};
int removeIndex = 2;
int originalLengh = original.length; // 4

int[] result = new int[originalLengh - 1];

for (int i = 0; i < originalLengh; i++) {
    if (i == removeIndex) {
        continue; // 루프 나머지 부분을 건너뛰고 다음 반복을 진행
    }
    int k = 0; // 새로운 배열의 인덱스 번호
    // k, i
    // 0, 0
    // 1, 1
    // 2, 3
    result[k] = original[i];
    k++;
}
System.out.println(result[0]); // 1
System.out.println(result[1]); // 2
System.out.println(result[2]); // 4

removeIndex[2] 값이 걸러짐

 

배열을 순회하는 향상된 for문(for-each문) 형태가

for (dataType 변수명 : 해당 데이터 타입의 배열) {

    배열의 모든 요소에 접근하는 코드

}

int [] arrayNumber = {1, 3, 5, 7, 9};

for  (int number: arrayNumber) { // number 변수 : for문 내의 변수
    System.out.println(number);
}
// 1
// 3
// 5
// 7
// 9

 

다차원 배열

배열의 배열 (2, 3, 4 ... 차원)

데이터를 테이블 형태로 구성할 때 유용하다.

게임 보드, 데이터 분석, 그래픽 등에 사용한다.

 

다차원 배열의 선언 및 초기화 방법

2차원 배열 선언 : 데이터타입[][] 배열명;

int[][] matrix;

 

2차원 배열 초기화: 배열명 = new 데이터타입[행수][열수];

배열명 = new 데이터타입[반드시입력][선택입력];

matrix = new int[3][3];

 

각 요소에 값 할당

matrix[0][0] = 1; // 1행 1열

matrix[0][1] = 2; // 1행 2열

matrix[0][2] = 3; // 1행 3열

matrix[1][2] = 4; // 2행 3열

 

선언과 동시에 초기화

int[][] matrix2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} , {10, 11, 12} }; // 4행 3열

 

다차원 배열 출력

각 행을 순회하여, 해당 행 내부의 요소를 순회

for (int[] row : matrix2) {
    for (int value : row) {
        System.out.println(value + " ");
    }
    System.out.println(); // 줄바꿈
}

 

 

배열 클래스

배열을 조작하는 데 유용한 기능들은 제공

정렬, 검색, 변환 등

 

java.util 패키지 내부에 포함됩니다.

import 구문을 사용

 

배열 오름차순으로 정렬하기

import java.util.Arrays;

int[] numbers = {3, 2, 5, 4, 1};
Array.sort(numbers);
System.out.println(numbers[0]); // 1

 

 

배열 변환 Arrays.toString(array)

배열의 전체적 구조를 파악할 수 있는 기능

전체 배열을 대괄호 안에 담은 형태를 나타냄

import java.util.Arrays;

int[] numbers = {3, 2, 5, 4, 1};
String numbersToString = Array.toString(numbers);
System.out.println(numbersToString);

 

배열 내의 검색 Arrays.binarySearch(array, 찾고자 하는 값); => 값은 index 위치값으로 나옴

import java.util.Arrays;

int[] numbers = {3, 2, 5, 4, 1};
int target = 5;
int index = Arrays.binarySearch(numbers, target);
System.out.println("Element found at index: " + index); // 2

 

배열의 비교 Arrays.equals(a,b) => boolean

import java.util.Arrays;

int[] numbers1 = {3, 2, 5, 4, 1};
int[] numbers2 = {3, 2, 5, 4, 1};
int[] numbers3 = {4, 2, 5, 4, 1};

boolean numbersEquals1 = Arrays.equals(numbers1, numbers2);
boolean numbersEquals2 = Arrays.equals(numbers2, numbers3);
boolean numbersEquals3 = Arrays.equals(numbers1, numbers3);

System.out.println(numbersEquals1); // true
System.out.println(numbersEquals2); // false
System.out.println(numbersEquals3); // false

 

 

배열의 채움 Arrays.fill(array, 채울 요소의 값) => [요소의 값들이 채워진 새로운 배열]

Arrays.fill(array, index, index-1, 채울 요소의 값); 

Arrays.fill(numbers, 2, 6, 3);

배열 numbers의 인덱스 2부터 5까지를 3으로 채웁니다. 인덱스 6은 포함되지 않습니다.

 

다차원 fill

int[][] matrix = new int[3][3];

// 각 행을 5로 채우기
for (int[] row : matrix) {
    Arrays.fill(row, 5);
}

// 배열 출력
for (int[] row : matrix) {
    System.out.println(Arrays.toString(row));
}

 

 

자바의 기본 배열 형태

한 번 생성되면 크기 변경이 불가능하다

수정하려면 새로운 배열을 생성하여 원래 배열을 복사했어야 했다.

(삭제 기능을 필터를 이용하여 그것만 빼고 새로운 배열에 값을 넣어서 만들어줌)

int [] numbers = new int[5];
System.out.println(Arrays.toString(numbers)); // [0, 0, 0, 0, 0]

 

동적인 배열 생성

ArrayList 사용법

ArrayList 라이브러리의 기능

java.utils.ArrayList를  import하여 사용해야한다.

 

동적 배열의 경우에는 배열의 타입 지정 시

일반 데이터 타입이 아니라 참조 타입으로 작성해야한다.

일반 데이터 > 참조 타입

int 가 아니라 Integer 로

char 가 아니라 Charactor 로

boolean 가 아니라 Boolean 로

String String은 원래 참조값이다.

 

참조 타입은 기본값이 모두 null 이다.

[null, null, null .....];

 

기본 타입은 null 값을 가질 수 없다. int a = null; (x)

Integet a = 123;
System.out.println(a); // 123

 

컴퓨터 메모리에 저장된걸 가져오는거라 일반 데이터 타입보다 느리다.

 

ArrayList 생성

ArrayList<E> arrayName = new ArrayList<E>(선택);
E : dataType
(Integer, Charactor, Boolean, String)

ArrayList<Integer> arrayList = new ArrayList<>(20);
// (20) : 소괄호 안에 선택값은 초기용량을 설정 
// => 지정하지 않을 경우에는 기본 용량이 10으로 설정됨

 

배열의 마지막에 값을 추가해보자
arrrayName.add(추가할 데이터)

arrayList.add(10);
arrayList.add(20);
arrayList.add(30);
System.out.println(arrayList); // [10, 20, 30]


ArrayList 데이터 변경하는 방법

arrayName.set(indexNumber, changeData);

arrayList.set(1, 50);
System.out.println(arrayList); // [10, 50, 30]

 

ArrayList 데이터 삭제하는 방법

arrayName.remove(indexNumber);

arrayList.remove(2);
System.out.println(arrayList); // [10, 50]

 

ArrayList 크기 확인 방법

arrayName.size();

System.out.println(arrayList.size()); // 2

 

ArrayList 원하는 위치에 데이터 넣기

arrayName.add(indexNumber, inputDataValue);

arrayList.add(1, 123);
System.out.println(arrayList); //[10, 123, 50]

 

ArrayList 특정 요소에 접근하는 방법

arrayName.get(indexNumber);

System.out.println(arrayList.get(1)); // 123

 

간단한 ArrayList 예제 

package chapter03;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class E_Array {

    public static void main(String[] args) {
        ArrayList<String> items = new ArrayList<>();
        
        items.add("사과");
        items.add("연필");
        items.add("책");
        items.add("시계");
        items.add("텀블러");
        
        Random random = new Random();
        String selectedItem = items.get(random.nextInt(items.size()));
        Scanner sc = new Scanner(System.in);
        
        String userGuess;
        
        while (true) {
            System.out.println("아이템을 맞춰보세요.");
            userGuess = sc.nextLine();
            
            if(userGuess.equals(selectedItem)) {
                System.out.println("정답입니다");
                break;
            } else if (userGuess.equals("종료")) {
                break;
            } else {
                System.out.println("틀렸습니다. 다시 시도하세요");
            }
        }
        sc.close();
        System.out.println("종료되었습니다.");
    }

}