[Java] 8. 자바의 배열

PYOUNANI·2022년 10월 6일
0

Java

목록 보기
9/14
post-thumbnail

8. 자바의 배열

8-1. 배열

연관된 데이타들을 묶어 반복문을 이용하여 사용하기 위해 배열을 사용한다.
만약 배열을 사용을 했는데 반복문을 사용하지 않았다면 잘못 사용하고 있는 것이다.


8-1-1. 배열 생성

C언어에는 배열을 생성하기 위해 두가지 방법이 있는데, 지역적으로 선언하거나 동적할당을 해서 선언하는 방법이다.
지역적으로 생성하는 방법은 편하기는 하지만 특정 지역으로 벗어나면 사용하지 못하는 단점을 가지고 있다.
동적할당으로 생성할 시에 지역적으로 상관없이 원하는 크기만큼 생성할 수 있었다.

두 가지 방법 중 동적할당하여 생성하는 것이 활용도가 높음을 알 수 있다.
그래서 자바에서는 배열은 모두 동적할당이 된다.
따라서 자바에서는 참조 변수를 선언한 후에 배열 객체를 동적으로 생성하여 할당해주는 과정이 필요하다. 참조 변수는 배열의 이름으로 나타낸다.

double[] costs = new double[100];

뿐만 아니라 배열의 각 요소는 그 요소 타입에 해당하는 객체의 할당이 따로 필요시 한다.

8-1-2. 기본자료형 배열 생성

배열 선언

//elementType[] arrayName;
int[] list;

특정 크기를 가진 값을 할당

//arrayName = new elementType[size];
list = new int[5];

배열 생성 여러 자료형 예시

public class CircleArrayTest {
	public static void main(String[] args){
    	int[] integers;
        integers = new int[10];
        
        double[] doubles = new double[5];
        
        int n = 10;
        boolean booleans[] = new booleans[n]; 
    }
}

8-1-3. 기본자료형 배열 사용

배열 요쇼의 선택
선택식을 이용하여 배열 요소를 선택하여 조작한다.

list[0] = 90;

배열의 할당 크기안에서 사용을 해야한다.
그렇지 않으면 자바에서는 ArrayIndexOutOfBoundsException가 자동으로 예외가 처리가 됨

그렇다면 배열의 할당 크기를 알아야 한다.

// arrayName.length;
int arrlen = list.length;

배열 요소를 선택하는 예시

public class CircleArrayTest {
	public static void main(String[] args){
    	int[] integers;
        integers = new int[10];
        
        double[] doubles = new double[5];
        
        int n = 10;
        boolean booleans[] = new booleans[n]; 
        
        // 배열 요소 선택식
        integers[0] = 100;
        
        for(int i = 0; i < integers.length; i++){
        	System.out.println(integers[i]);
        }
    }
}

배열의 초기값 정해서 생성하기

double[] doubles = new double[5];
double[] doubles = new double[] {1, 2, 3, 4, 5}; // 초기값을 가진 선언 방법
double[] doubles = {1, 2, 3, 4, 5}; // 다른 방법

8-1-4. 참조자료형 배열 생성

만약에 객체들을 묶어 배열을 만든다고 할 때, 그럼 참조 자료형 배열을 써야할 것이다.

객체 배열에 대한 참조 변수를 선언

Circle[] circles;

new 연산자로 객체 배열을 할당

circles = new Circle[5];

각 요소가 가리키는 객체를 할당

public class CircleArrayTest {
	public static void main(String[] args){
    	Circle[] circles = new Circle[5];
        
        circles[0] = new Circle();
        circles[1] = new Circle(2);
        circles[2] = new Circle(3);
        circles[3] = new Circle(4);
        circles[4] = new Circle(5);
        
        for(int i = 0; i < circles.length; i++){
        	System.out.println(circles[i].getRadius());
        }
    }
}

각 요소는 참조자료형이 가리키고 있음을 그림을 통해 알 수 있다.

기본 자료형 배열과 비교하면 확실하게 차이를 알 수 있다. 기본 자료형 배열은 기본 자료형의 값이 요소에 저장이 되고, 참조자료형 배열은 참조값이 요소에 저장이 된다.

8-1-5. 문자열 배열 생성

직접 문자열을 저장하는 것이 아니라 하나의 참조값을 저장하는 것이다.
문자열 배열도 마찬가지로 각 요소를 가리키는 객체를 할당을 해주어야 한다.
암시적 생성, 명시적 생성 두 가지를 제공하고 있다.

String[] arr;
arr = new String[3];

// 암시적 생성          명시적 생성
arr[0] = "Java";     // arr[0] = new String("Java");
arr[1] = "Array";   // arr[1] = new String("Array");
arr[2] = "Test";   // arr[2] = new String("Test");

8-1-6. for each로 배열 요소 접근

우리는 앞서 배열에 요소에 접근하기 위해 for문을 사용했다.
자바에서는 추가의 반복을 제시하고 있는데, for each이다.

String[] arr = {'홍길동', '일지매', '이지매'};

for (String s : arr)
	System,out.println(s);

CircleArrayTest를 for문 대신 for each문을 적용해보자.

public class CircleArrayTest {
	public static void main(String[] args){
    	Circle[] circles = new Circle[5];
        
        circles[0] = new Circle();
        circles[1] = new Circle(2);
        circles[2] = new Circle(3);
        circles[3] = new Circle(4);
        circles[4] = new Circle(5);
        
        // for each 적용
        for(Circle c: circles){
        	System.out.println(c.getRadius());
        }
    }
}

8-1-7. 배열의 매개변수 전달

메서드 매개변수를 배열을 전달 받을 수도 있다.
배열들의 요소들의 값이 전달이 되는 것이 아니라 하나의 참조값이 전달이 되어지는 것이다.
그렇기 때문에 좀 더 효율적으로 배열을 넘길 수 있다.

public class CircleArrayTest {

	static void initArray(Circle[] cs){    // 배열의 주소값을 전달 받음(cs = circles)
    	for(int i = 0; i < cs.length; i++){
        	cs[i] = new Circle();
        }
    }
	public static void main(String[] args){
    	Circle[] circles = new Circle[5];
        
        initArray(circles);
        
        for(Circle c: circles){
        	System.out.println(c.getRadius());
        }
    }
}

8-1-5. 메서드의 배열 반환

자바에서는 참조값을 전달을 받기 때문에 배열을 반환 받을 수 있다.

public class CircleArrayTest {

	static void initArray(int n){    // 배열의 주소값을 전달 받음(cs = circles)
    	Circle[] cs = new Circle[n];
        for(int i = 0; i < n; i++){
        	cs[i] = new Circle();
        }
    }
	public static void main(String[] args){
    	Circle[] circles = initArray(3);
        
        for(Circle c: circles){
        	System.out.println(c.getRadius());
        }
    }
}

8. 자바의 배열

8-2. 다차원 배열


8-2-1. 고정적 길이 배열

다차원 배열을 좀 더 쉽게 이해하기 위해서 그룹 개념으로 설명할 것이다.

그림을 통해 보면 1차원 배열이 3개 그룹이 있고 각 그룹에 있는 배열에 4개 요소가 있다.

int[][] test1;
test1 = new int[2][3];

코드를 통해 보면 2개의 그룹이 있고 각 그룹당 3개 요소를 가진 1차원 배열을 가지고 있다.
위의 경우는 모든 그룹이 같은 크기를 가지고 있다. 이는 고정적 길이의 2차원 배열이다.

8-2-2. 가변적 길이 배열

그렇다면 그룹마다 다른 크기를 가진 2차원 배열도 있을 것이다.

int[][] test2;
test2 = new int[2][];

이 경우 test2[0] test2[1]에 각각 1차원 배열의 참조값을 대입함으로써 각각 초기화가 필요하다.
각 그룹마다 1차원 배열의 요소의 갯수가 다르기 떄문에 따로 초기화하는 작업이 필요하다.

test2[0] = new int[2];
test2[1] = new int[4];


그림을 보면 각 그룹당 요소의 갯수가 다르다. 이것이 가변적 길이를 가진 배열이다.

8-2-2. 참조자료형 배열

String[][] test3;
test3 - new String[2][];

test3[0] = new String[2];
test3[1] = new String[3];

이 경우 참조값이 들어간 것이기 때문에 test3[i][j] 에 각각 객체에 대한 참조를 대입함으로써 각 배열 요소 초기화가 필요하다.

test3[0][0] = new String("hi");
test3[1][0] = new String("a);

8-2-3. 배열 초기화

이차원 배열를 선언하자마자 초기화할 수 있는 방법도 있다.

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

8-2-4. 배열의 요소 접근 방법

for 문을 이용하여 접근해볼 수 있다.

int i, j;
for(i = 0; i < array.length; i++){
	for(j = 0; j < array[i].length; j++){
    	// statements to be repeated : array[i][j]
    }
}

for문을 이용하여 여러 배열의 요소에 접근을 해보자.

  • 고정적 길이
public class BasicTypeArrayTest1 {
public static void main(String[] args){
      int[][] integers;
      integers = new int[2][3];

      for(int g = 0; g < integers.length; g++){
          for(int e = 0; e < integers[g].length; e++){
              integers[g][e] = g * 10 + e;
          }
          System.out.println();
      }

      for(int[] a: integers){
          for(int n: a){
              System.out.println(n + "\t");
          }
          System.out.println();
      }
   };
};
  • 가변적 길이
public class BasicTypeArrayTest2 {
	public static void main(String[] args){
      int[][] integers;
      integers = new int[2][];

      integers[0] = new int[2];
      integers[1] = new int[4];

      for(int g = 0; g < integers.length; g++){
          for(int e = 0; e < integers[g].length; e++){
              integers[g][e] = g * 10 + e;
          }
          System.out.println();
      }

      for(int[] a: integers){
          for(int n: a){
              System.out.println(n + "\t");
          }
          System.out.println();
      }
   };
};
  • 참조자료형 배열
public class CircleArrayTest {
	public static void main(String[] args){
      Circle[][] circles;
      circles = new Circle[2][];  

      circles[0] = new Circle[2];
      circles[1] = new Circle[4];
      
      //circles[0][0] = new Circle(1); 구분해서 알아두기

      for(int g = 0; g < circles.length; g++){
          for(int e = 0; e < circles[g].length; e++){
              circles[g][e] = new Circle(g * 10 + e);
          }
          System.out.println();
      }

      for(Circle[] ca: circles){
          for(Circle c: ca){
              System.out.println(c.getRadius() + "\t");
          }
          System.out.println();
      }
   };
};

0개의 댓글