본문 바로가기

JAVA/JAVA 기초

자바 배열관련

반응형

배열

동일 타입의 값을 여러개 취급할 수 있는 기능


int[] array = new int[10];

array[0] = 1;

array[1] = 1;

array[2] = 2;

array[3] = 3;


배열 초기화

int[] array1 = new int[10]; //크기지정

int[] array2 = {1,2,3,4,5}; //초기값 지정

int[] array3 = new int[] {6,7,8,9,10}; //초기값과 타입을 지정


int[] array4;


array4 = new int[]{1,2,3,4,5}; //값을 지정하여 대입

array4 = {1,2,3,4,5}; //이것은 컴파일 에러


배열을 인수로 하는 경우


log("사용자를 등록하였습니다.", new String[] {"userName", "Ken"});

log("사용자를 등록하였습니다.", {"userName", "Ken"}); //컴파일 에러


배열에 대입할 값이 선언시에 정해져 있는 않는 경우에는 컬렉션을 이용하는 경우가 많다.


배열의 사이즈 변경

배열은 한번 작성하면 요소 수를 변경할 수 없다.

새로운 배열을 작성한 후에 예전 배열에서 새로운 배열로 복사해야한다.

자바 5.0까지는 System 클래스의 arraycopy 메서드를 사용

자바 6 이후에는 Arrays 클래스의 copyof 메서드를 사용


int[] array = {1,2,3,4,5};

int[] newArray1 = new int[array.length + 3];

System.arraycopy(array, 0, newArray1, 0, array.length);

int[] newArray2 = Arrays.copyOf(array, array.length + 3);

newArray1[5] = 6;

newArray1[6] = 7;

newArray1[7] = 8;

newArray1[8] = 9; //ArrayIndexOutOfBoundException 발생

for (int i : newArray1) {

System.out.println(i); 

}


arraycopy 메서드 인수

1 / 복사 대상인 원래 배열

2 / 복사 대상인 원래 배열의 몇번째부터 복사

3 / 복사할 타깃 배열

4 / 복사할 타깃 배열의 몇번째부터 복사

5 / 복사할 배열의 요소 수


요소 수가 결정되지 않은 경우에는 배열이 아니라 ArrayList 클래스 등 컬렉션 클래스를 이용하는 편이 적절하다.

배열은 요소 수나 내용이 결정되어 간단히 작성하고 싶은 경우나 기본 형의 값의 배열을 작성하고 싶을 때만 한정해서 이용하는 것이 좋다.


Arrays 클래스를 이용하여 배열

int[] array = {1,2,3,4,5};

System.out.println(array); // [I@2a139a55

System.out.println(Arrays.toString(array)); // [1, 2, 3, 4, 5]


[I@2a139a55

[ => 배열

I => int 타입

@이후 => 해시값


배열의 정렬

배열을 순서대로 정렬하는 처리 Arrays.sort 메서드

int[] array2 = {1,5,3,2,4};

Arrays.sort(array2);

System.out.println(Arrays.toString(array2));


Arrays 클래스의 sort 메서드

기본타입 => 오름차순으로 값정렬

객체 => Comparable 인터페이스의 compareTo 메서드를 사용하여 정렬


객체의 경우, 정렬의 대상이 되는 클래스가 Comparable 인터페이스의 구현 클래스가 아니면 ClassCastException이 발생하는다는 점이 주의


Comparable 인터페이스를 구현한 클래스가 아닌 경우 정렬 순서를 지정하고 싶은 경우에는 두번째 인수에 java.util.Comparator 인터페이스를 구현한 클래스를 건넴으로써 독자적인 규칙에 따른 정렬을 실시할 수 있다.


Integer[] array3 =  {1,3,4,5,2};

Comparator<Integer> c = new Comparator<Integer>() {


@Override

public int compare(Integer o1, Integer o2) {

return o2.compareTo(o1);

}

};

Arrays.sort(array3, c);

System.out.println(Arrays.toString(array3));


compare 메서드의 반환값에 따라 정렬

반환값이 0 이상의 경우 => 인수1 -> 인수2의 순서로 정렬

반환값이 0 미만인 숫자를 반환한 경우 => 인수2 -> 인수1의 순서로 정렬



package com.eeswk.domain;


import java.util.Arrays;

import java.util.Comparator;


public class ArraySample {


public static void main(String[] args) {

Student[] students = {

new Student("Ken", 100),

new Student("Shin", 60),

new Student("Kim", 80)

};

Comparator<Student> comparator = new Comparator<Student>() {

@Override

public int compare(Student o1, Student o2) {

return Integer.compare(o2.getScore(), o1.getScore());

}

};

Arrays.sort(students, comparator);

for(Student student : students) {

System.out.println(student.getName() + ":" + student.getScore());

}

}

}


Ken:100

Kim:80

Shin:60


Comparator? Comparable?


정렬대상이 되는 클래스 자신을 Comparable 인터페이스의 구현 클래스로 정의해서 compareTo 메서드를 구현하는 방법


ppackage com.eeswk.domain;


import java.util.Arrays;


public class Animal implements Comparable<Animal> {


private String name;

private int height;


public Animal(String name, int height) {

this.name = name;

this.height = height;

}

public String getName() {

return name;

}

public int getHeight() {

return height;

}


@Override

public int compareTo(Animal o) {

return Integer.compare(o.getHeight(), getHeight());

}

public static void main(String[] args) {

Animal[] animals = {

new Animal("cat", 30),

new Animal("dog", 50),

new Animal("duck", 20)

};

Arrays.sort(animals);

for(Animal animal : animals) {

System.out.println(animal.getName() + ":" + animal.getHeight());

}

}

}


Arrays 클래스의 sort 메서드에서 Comparator를 지정하지 않고 정렬한다.

그러나 Comparable은 한종류의 정렬밖에 할수 없으므로 여러 종류의 정렬로 전환할 수 없다.

내림차순으로 정렬하였지만 이름의 오름차순, 키의 오름차순 등 별도의 정렬를 하고 싶은 경우에는 Comparator가 필요하게 된다.


Comparable에 의한 정렬은 해당 클래스 자신이 갖는 디폴트 정렬 순서에 의한 정렬이므로 가장 자연스러운 정렬 방식이어야 한다.


Comparable => 해당 클래스 자신의 가장 자연스러운 정렬 방식에 따른 디폴트 정렬로 사용

Comparator => 업무적으로 필요한 나열 방식에 따른 정렬로 사용



배열의 검색

검색에는 Arrays 클래스의 binarySearch 메서드를 사용

이진탐색을 수행하여 배열의 중앙값을 보고 기대하는 값보다 큰 경우 중앙보다 왼쪽을 탐색

작은경우에는 오른쪽을 탐색하는 것을 반복해서 목적하는 값을 찾는다.

배열이 정렬되어 있지 않으면 제대로 검색할 수 없다.

정렬된 배열에 대해 검색하는 횟수가 적기 때문에 대부분은 for문을 사용한 단순 검색(선형 검색)보다 빠르게 검색 대상을 찾을 수 있다.


발견되는 경우 배열의 인덱스를 반환, 없으면 0보다 작은 값은 반환


int[] array = {1, 1, 4, 5, 7, 8, 11, 12, 17, 21, 24};

int found = Arrays.binarySearch(array, 5); // 5를 찾음

System.out.println(found); // 3

int notFound = Arrays.binarySearch(array, 6); // 6를 찾음

System.out.println(notFound); // -5 (4번째 이므로 -4에서 1을 뺀 -5반환)



1) 사전에 Arrays 클래스의 sort 메서드를 사용해서 정렬

2) Arrays 클래스의 binarySearch 메서드를 사용하지 않고 선형 검색등 실시


동일 데이터에 대해서 몇번이고 검색할 경우

-> 사전에 정렬한 후 에 검색

한번만 검색할 경우

-> 정렬을 하지 않고 검색


가변길이 인수로 메서드 정의

void log(String message, String[] args) {

System.out.println(message);

System.out.println("매개변수");

for(String arg : args) {

System.out.println(arg);

}

}


args의 부분은 항상 new String[] 해야한다.

log("등록", new String[] {"userName", "ken"});

log("오류", new String[] {"Cannot load file"});

log("종료", new String[0]);


new를 해야하는게 중복된다.


가변길이 인수를 사용으로 타입의 뒤에 ... 붙여서 정의


void log(String message, String... args) {

System.out.println(message);

System.out.println("매개변수");

for(String arg : args) {

System.out.println(arg);

}

}


log("등록", "userName", "ken");

log("오류", "Cannot load file");

log("종료");


컴파일시에 가변 길이 인수가 배열로 변환된다.

log("등록", new String[] {"userName", "ken"});

log("오류", new String[] {"Cannot load file"});

log("종료", new String[0]);

반응형

'JAVA > JAVA 기초' 카테고리의 다른 글

예외 관련  (0) 2018.10.21
자바 컬렉션관련  (0) 2018.10.13
자바 타입관련  (0) 2018.10.13
자바 기본형 참조형 클래스 관련  (0) 2018.10.12
자바 기초 작성법  (0) 2018.10.12