Java

[Java] 06. 배열

Joo.v7 2024. 8. 25. 13:28

Chapter 1: 배열 개요

  • Java에서 배열 표기법
  • 배열의 차원
  • 배열 요소에 접근
  • 배열의 경계 검사
  • 배열과 컬렉션 비교

Chapter 2: 배열 생성

  • 배열 인스턴스 생성
  • 배열 요소 초기화
  • 다차원 배열 요소 초기화
  • 가변 길이 배열
  • 계산된 크기를 가진 배열 생성
  • 배열 요소 복사

Chapter 3: 배열 사용

  • 배열의 크기
  • 배열 메소드
  • 메소드에서 배열 return
  • 배열을 파라미터로 전달
  • 명령줄 인자
  • 데모: 명령줄 인자 사용
  • foreach 문에서 배열 사용

Lab 6-1: 배열의 생성과 사용


Chapter 1: 배열 개요

- 배열은 요소를 순서대로 모아서 관리하기 위해 만들어진 자료구조다.

- 배열의 모든 요소는 같은 타입을 가진다.

- 인덱스 0부터 시작하는 각각의 요소에는 정수 인덱스를 사용해서 access한다.

- 자바의 모든 Type을 배열로 만들 수 있다. ex) 클래스를 요소로 하는 배열

 

Java에서 배열 표기법

  • 배열에 나열될 요소들의 타입
  • 배열의 차원
  • 배열을 선언한 변수 이름
  • ex) String[] name;

 

배열의 차원

   1차원 배열과 2차원 배열

 

배열 요소에 접근

   각 배열에 대해 정수 인덱스가 제공되고 인덱스는 0에서 시작한다.

 

 

배열의 경계 검사

  • 배열은 크기가 정해져 있어서 요소 access를 위해 배열 경계를 검사한다.
  • 배열의 크기/index를 넘어가는 작업은 ArrayIdexOutofBoundsException 예외를 발생시킨다.
  • length 변수 사용

 

배열과 컬렉션 비교

  • 배열
    • 배열의 크기를 조절할 수 없다.
    • 배열은 같은 type의 요소를 저장하기 위한 자료구조다.
    • 배열의 요소는 읽기 전용 access 권한을 가질 수 없다.
    • 배열은 빠르지만, 유연성이 떨어진다. (고정길이, 연속된 형태)
int[] row = new int[2];
/* final로 배열을 선언하더라도 배열 내의 각 요소는 읽기 전용이 아니다. */
final int[] row = {1,2,3,4,5}
row[1] = 99; 	// 값 변경 허용

 

  •  컬렉션
    • ArrayList와 같은 컬렉션 클래스는 크기를 조절할 수 있다.
    • 다양한 타입의 요소를 저장하기 위해 설계됐다.
    • 컬렉션의 요소는 읽기 전용이 가능하다.
    • 배열에 비해 느리지만 보다 더 유연하다.
ArrayList list = new ArrayList();
list.add(“문자열”);	 // 문자열 추가
list.add(99); 	        // 정수형 추가

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
/* 읽기 전용으로 선언된 리스트에 삽입/삭제/갱신 시도하면 
UnsupportedOperationException 이 발생한다 */
list = Collections.unmodifiableList(list);
try {
    list.set(0, 11);
}
catch (UnsupportedOperationException e) {
    e.printStackTrace();
}

 


 

Chapter 2: 배열 생성

배열 인스턴스 생성

  • 배열 변수를 선언한다고 해서 배열이 생성되지 않는다. (배열이 참조타입 이라서)
  • new 키워드를 사용해서 명시적으로 배열의 인스턴스를 생성(배열의 크기도 지정)해야 한다.
  • 배열이 생성되면 Type에 따른 기본 값이 암시적으로 할당된다. ex) boolean -> false, int -> 0

 

배열 요소 초기화

  • 배열의 요소는 선언시 명시적으로 초기화될 수 있다.
  • 배열 초기화 시 배열의 크기를 명시할 수 없다.

 

다차원 배열 요소 초기화

  • Java에서 다차원 배열은 배열안에 배열이 포함되어 있는 형태다.
  • 배열에 포함된 배열은 쉼표( , )로 구분한다.
/* 2차원 배열 */
int[][] grid = new int[][] {
    {1,2,3,4},  // grid[0] 배열
    {5,6,7,8}   // grid[1] 배열
};

/* 3차원 배열 */
int[][][] cube = new int[][][] {
    {               	// cube[0] 배열
        {1,2,3,4},  	// cube[0][0] 배열
        {5,6,7,8}   	// cube[0][1] 배열
    },
    {
        {9,10,11,12},   // cube[1][0] 배열
        {13,14,15,16}   // cube[1][1] 배열
    }
};

 

가변 길이 배열

  • Java의 다차원 배열은 배열안에 다른 배열이 포함되어 있는 형태.
  • 배열 내의 각 배열은 다른 크기를 가질 수 있다.
    (1) 배열 이니셜라이저로 초기화
    (2) 배열 내 배열의 수를 결정한 후 포함된 배열의 크기를 지정
/* (1) 배열 이니셜라이저로 초기화 */
int[][] grid = new int[][] {
    {1,2,3,4},
    {5,6,7},
    {8,9,10,11,12}
};

/* (2) 배열 내 배열의 수를 결정한 후 포함된 배열의 크기를 지정 */
int[][] grid2 = new int[3][];
grid2[0] = new int[] {1,2,3,4};
grid2[1] = new int[] {5,6,7};
grid2[2] = new int[] {8,9,10,11,12};

 

계산된 크기를 가진 배열 생성

  • 아래처럼 배열의 크기는 컴파일 시에 결정될 필요는 없다.
long[] row = new long[4];

 

  • 배열의 크기를 런타임에 계산된 값을 지정
/* 배열의 크기를 런타임에 계산된 값을 지정 */
String s = scanner.nextLine();
int arraySize = Integer.parseInt(s);
int[] array = new int[arraySize];

/* 계산된 값을 상수를 혼용해서 배열 생성 */
Scanner scanner = new Scanner(System.in);
int rowCount = Integer.parseInt(scanner.nextLine());
…
int[][] grid = new int[rowCount][3];

 

배열 요소 복사

  • Shallow Copy (얕은 복사)
    • 새 변수는 기존 변수와 같은 메모리 위치에 저장된 데이터를 가리킨다.
    • 하나의 변수에서 배열의 내용을 변경하면 다른 변수도 동일하게 영향을 받는다.

  • Deep Copy (깊은 복사)
    • 배열 안의 객체를 copy해서 새로운 하나의 객체(배열)을 만들어낸다.
int[] array2 = array1.clone();

 


 

Chapter 3: 배열 사용

배열의 크기

  • Java에서 배열의 크기를 표시하는 length가 있다.
  • 배열의 length값은 배열에 "포함된" 요소의 수를 나타낸다.

 

배열 메소드

2024.08.25 - [Java] - [Java 문법] 배열의 출력, 비교, 복사, 정렬

 

[Java 문법] 배열의 출력, 비교, 복사, 정렬

import java.util.Arrays;Arrays 클래스는 배열을 조작하는데 유용한 다양한 메소드들을 지원한다.Arrays.toString(), Arrays.equals(), Arrays.indexOf(), Arrays.indexOfRange(), Arrays.sort(), Arrays.binarySearch(), Arrays.copyOf(), Array

lightningtech.tistory.com

 

 

메소드에서 배열 return

  • 메소드에서 배열을 return.
/* 메소드에서 배열을 return */
class Example {
    public static void main(String[] args) {
        int[] array = createArray(7);
    }
    static int[] createArray(int size) {
        int[] result = new int[size];
        return result;
    }
}

/* createArray 메소드를 아래와 같이 쓸 수도 있다. */
static int[] createArray(int size) {
    return new int[size];
}

 

배열을 파라미터로 전달

  • 배열 파라미터는 배열 변수의 복사본이다.
    • 배열 변수를 메서드의 argument로 전달하면 전달된 배열 변수와 원본 배열 변수가 모두 동일한 인스턴스를 참조한다.
class Example {
    public static void main(String[] args) {
        int[] argument = {1, 2, 3, 4};
        chahgeArrayElement(argument);
        System.out.println(argument[0]);
    }
    static void changeArrayElement(int[] parameter) {
        parameter[0]++;		// 실행 결과: 2
    }
}

 

명령줄 인자(arguments)

  • 런타임은 main 메소드로 명령줄 argument를 넘겨준다.
  • main 메소드는 parameter로 문자열(String) 타입 배열을 넘겨 받는다.
  • 프로그램 이름은 배열의 요소가 아니다.
/* Example.java */
class Example {
    public static void main(String[] args) {
        for (String arg: args) {
            System.out.println(arg);
        }
    }
}

 

터미널에 입력

> javac Example.java
> java Example Ironman Captain-America Thor Hulk

 

실행 결과

Ironman
Captain-America
Thor
Hulk

 

foreach 문에서 배열 사용

  • foreach문은 배열의 모든 요소를 반복하는 매커니즘을 추상화 한 것이다.
  • 배열을 읽는데 좋다(읽기 전용). 그러나 배열의 변경이나 수정이 필요하면 for문을 사용해야 한다.
/* 일반적인 for문 */
for (int i = 0; i < args.length; i++) {
    System.out.println(args[i]);
}

/* foreach문 사용 */
for (String arg: args) {
    System.out.println(arg);
}

 

Lab 6-1: 배열의 생성과 사용

2024.08.29 - [코딩 문제] - [코딩 문제] Text file 입출력

 

[코딩 문제] Text file 입출력

문제) 텍스트 파일의 이름을 main 함수의 argument로 받아서 파일의 내용을 요약해서 출력.터미널에서 java FileDetails Yesterday.txt 하면 txt파일을 넘겨주면서 실행한다. Text file/* Yesterday.txt */YesterdayYester

lightningtech.tistory.com

 

 

 

 

 

2024.08.23 - [코딩 문제] - [코딩 문제] TicTacToe 게임

 

[코딩 문제] TicTacToe 게임

문제틱-택-토(Tic-Tac-Toe)는 두 명이 번갈아가며 O 와 X 를 3x3 보드에 써서 같은 글자를 가로, 세로 혹은 대각선 상에 놓이도록 하는 놀이이다.아래 예시는 먼저 놓은 X가 이기는 경우이다.게임 방

lightningtech.tistory.com

 


 

 

출처: https://github.com/gikpreet/class-programming_with_java/tree/master

 

GitHub - gikpreet/class-programming_with_java

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com