본문 바로가기
☕ Java 웹 프로그래밍/Java

[프로그래머스] Java(자바) 입문 | Part 4. 배열

by 일단연 2023. 4. 28.

 배열 만들기 

1차원 배열

  • 배열의 개념
    • 같은 데이터 타입을 가진 연속된 메모리 공간으로 이루어진 자료구조
    • 같은 데이터 타입을 가진 여러 개의 변수가 필요할 때 사용
    • 배열은 참조형 타입
      • 배열의 변수는 하나인데 들어가는 값은 여러 개
      • 배열을 가리키는 변수 자체가 값을 가지고 있는 게 아니라, 해당 값을 가지고 있는 메모리를 가리킴
    • 배열도 모두 객체이므로, 각각의 배열은 모두 자신만의 필드와 메소드를 가지고 있음

 

  • 배열의 구성요소
    • 배열 요소(element)
      • 배열을 구성하는 각각의 값
    • 인덱스(index)
      • 배열에서의 위치를 가리키는 숫자
      • 언제나 0부터 시작하며, 0을 포함한 양의 정수만 가질 수 있음

 

  • 배열의 선언
    • 데이터타입[ ] 배열명;
    • 데이터타입 배열명[ ]; > 이 방법도 가능하지만 되도록 위의 방법만 쓰는 게 좋음
int[] array1;
int array2[];

 

  • 배열의 생성
    • 배열명 = new 데이터타입[배열 길이];
array1 = new int[4];

 

  • 배열의 선언과 생성 (동시에)
    • 데이터타입[] 배열명 = new 데이터타입[배열 길이];
int[] grade1 = new int[3]; // 길이가 3인 int형 배열의 선언 및 생성
int[] grade2 = new int[3]; // 길이가 3인 int형 배열의 선언 및 생성

grade1[0] = 85; // 인덱스를 이용한 배열의 초기화
grade1[1] = 65;
grade1[2] = 90;

grade2[0] = 85; // 배열의 길이보다 적은 수의 배열 요소만 초기화

for (int i = 0; i < grade1.length; i++) {
  System.out.print(grade1[i] + " "); // 인덱스를 이용한 배열로의 접근
}

for (int i = 0; i < grade2.length; i++) {
  System.out.print(grade2[i] + " "); // 인덱스를 이용한 배열로의 접근
}
  • 위의 예제에서 사용한 length: 배열의 길이를 저장하고 있는 배열 객체의 필드
  • 배열 grade2처럼 배열의 길이보다 적은 수의 배열 요소만을 초기화할 경우, 나머지 배열 요소들은 배열의 타입에 맞게 자동으로 초기화됨
배열의 타입 초깃값
char '\u0000'
byte, short, int 0
long 0L
float 0.0F
double 0.0 또는 0.0D
boolean false
배열, 인스턴스 등 null
  • 하지만 다음 예제처럼 해당 배열의 길이를 초과하는 인덱스를 사용하면, ArrayIndexOutOfBounds 예외가 발생
int[] grade = new int[3]; // 길이가 3인 int형 배열의 선언 및 생성
grade[0] = 85; // 인덱스를 이용한 배열의 초기화
grade[1] = 65;
grade[2] = 90;

System.out.print(grade[4]); // ArrayIndexOutOfBounds 예외 발생

 

  • 배열에 값 저장
    • 배열명[인덱스] = 값;
**array1[0] = 1;
array1[1] = 2;
array1[2] = 3;
array1[3] = 4;**
*//자바에서 배열의 인덱스는 0번부터 사용
//4개짜리 배열은 0부터 3까지의 인덱스를 가짐
//배열인덱스 0번부터 3번까지 차례로 1,2,3,4 값을 저장*

 

  • 배열에 저장된 값을 꺼내서 사용
    • 데이터타입 변수명 = 배열명[꺼낼 값의 인덱스];
**int value = array1[2];**
*//array1 이 참조하는 배열의 2번 인덱스에 해당하는 값 3을 꺼내서 int형 변수 value에 담음*
**System.out.println(array1[1]);** 
*//array1이 참조하는 배열의 1번 인덱스에 해당하는 값 2가 콘솔에 출력됨*

 

  • 배열의 초기화
    • 초기화 블록을 이용해 배열을 선언과 동시에 초기화할 수 있음: 초기화 블록에 맞춰 자동으로 배열의 길이가 설정됨
      • 초기화 블록(initialization block): 괄호({})를 사용하여 초깃값을 나열한 것
      1. 데이터타입[ ] 배열명 = new 데이터타입[ ]{배열요소1, 배열요소2, …};
      2. 데이터타입[ ] 배열명 = {배열요소1, 배열요소2, …};
    • 다음과 같은 경우에는 2)가 아닌 1)만을 사용해 초기화해야 함
      • 배열의 선언과 초기화를 따로 진행해야 할 경우
      • 메소드의 인수로 배열을 전달하면서 초기화해야 할 경우
int[] grade1 = {70, 90, 80}; //배열의 선언과 동시에 초기화할 수 있음
int[] grade2 = new int[]{70, 90, 80}; //배열의 선언과 동시에 초기화할 수 있음
int[] grade3;
// grade3 = {70, 90, 80}; //이미 선언된 배열을 이 방법으로 초기화하면 오류 발생
int[] grade4;
grade4 = new int[]{70, 90, 80}; //이미 선언된 배열은 이 방법으로만 초기화할 수 있음
  • 예제 1
int[] grade = new int[]{85, 65, 90};  // 길이가 3인 int형 배열을 선언과 동시에 초기화

for (int i = 0; i < grade.length; i++) {
  System.out.print(grade[i] + " "); // 인덱스를 이용한 배열로의 접근
}
  • 예제 2
int[] grade = new int[]{85, 65, 90}; //길이가 3인 int형 배열을 선언과 동시에 초기화
int sum = 0;

for (int i = 0; i < grade.length; i++) {
  sum += grade[i];
}

System.out.println("모든 과목에서 받은 점수의 합은 " + sum + "입니다.");
System.out.println("이 학생의 평균은 " + (sum / grade.length) + "입니다.");

 

 

실습


 

 배열 사용하기 

for 반복문을 이용해 배열 사용하기

  • 인덱스를 통해 배열에 접근
int[] iarray = new int[100];
iarray[0] = 1; 
iarray[1] = 2;
  • 배열에 0번째 인덱스부터 시작해 1부터 100까지 넣기
    • 정수를 100개 저장할 수 있는 배열을 생성
int [] iarray = new int[100];
  • 배열의 길이를 알아내는 방법
    • 배열명.length
iarray.length 
*//배열을 참조하는 레퍼런스 변수.length 하면 해당 배열의 길이를 리턴*
  • 배열에 1부터 100까지 값 넣기
//배열에 값을 반복적으로 넣어야 하므로, for 반복문을 이용
for(int i = 0; i < iarray.length; i++){ 
//배열의 인덱스는 0부터 시작하므로, 0부터 배열의 길이보다 하나 작을 때까지 반복하면 배열의 크기만큼 반복 가능
    iarray[i] = i + 1;  
//배열의 인덱스는 0부터인데 넣고 싶은 값은 1부터 사용해야 하므로, 인덱스에 1을 더해준 값을 넣어줌
}
  • 배열에 저장된 값을 모두 더해주기
int sum = 0; 
//값을 누적하기 위한 변수는 반복문 밖에서 선언
//for문 안에 sum을 선언하는 동시에 초기화(int sum = sum + i;)하면
//반복되는 시점에 매번 새롭게 선언되기 때문에 sum에 지속적으로 값을 저장할 수 없게 됨
for(int i = 0; i< iarray.length; i++){  
// 배열의 크기만큼 반복*
    sum = sum + iarray[i];
//반복문 밖에서 선언한 변수에 반복적으로 값을 누적
}

System.out.println(sum);
//배열에 들어있는 모든 값 누적한 변수를 출력
  • 변수의 scope
    • 변수는 선언한 지점이 어디냐에 따라 변수를 사용할 수 있는 범위가 달라짐
    • 변수의 scope: 변수가 선언된 지점을 감싸고 있는 괄호 안 (변수가 선언된 블럭 안)
    • 변수는 선언될 때 생성되었다가, 해당 블럭이 끝날 때 소멸됨

실습


 

 2차원 배열 

  • 다차원 배열(multi-dimensional array)
    • 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열
    • 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열
    • 3차원 배열은 배열 요소로 2차원 배열을 가지는 배열
    • 4차원 배열은 배열 요소로 3차원 배열을 가지는 배열
  • 2차원 배열(two dimensional array)
    • 배열의 배열 (배열의 요소로 1차원 배열을 가지는 배열)
    • 자바에서는 2차원 배열을 나타내는 타입을 따로 제공하지 않음
    • 대신, 1차원 배열의 배열 요소로 또 다른 1차원 배열을 사용하여 2차원 배열을 나타낼 수 있음
  • 2차원 배열의 선언
    • 데이터타입[ ][ ] 배열명;
    • 데이터타입 배열명[ ][ ];
    • 데이터타입[ ] 배열명[ ];
int[][] array1;
int array2[][];
int[] array3[];
  • 2차원 배열의 생성
    • 배열명 = new 데이터타입[행의 길이][열의 길이];
array4 = new int[3][4];
  • 2차원 배열의 선언과 생성 (동시에)
//정수를 4개씩 담을 수 있는 배열이 3개 생성됨
int[][] array4 = new int[3][4];

  • 2차원 배열에 값 저장
    • 만약 array4[1] = 10 ; 이렇게 사용하면 오류!!
      • array4[1] 은 또 다른 1차원 배열을 가리킬 수 있는 참조형 변수이기 때문에 값을 담을 수는 없음
array4[0][0] = 10;
  • 배열의 선언과 동시에 초기화
    • 데이터타입 배열명[행의 길이][열의 길이] = { {배열요소[0][0], 배열요소[0][1], ...}, {배열요소[1][0], 배열요소[1][1], ...}, {배열요소[2][0], 배열요소[2][1], ...}, ... };
int[][] array6 = {{1}, {2,3}, {4,5,6}};
*//위와 같이 선언할 경우 array6[0][0] 는 1. array6[1][0]은 2.*
  • 가변 배열(dynamic array)
    • 행마다 다른 길이의 배열을 저장할 수 있는 배열
    • 생성방법: 2차원 배열을 생성할 때 열의 길이를 명시하지 않기(두 번째 첨자를 생략)
      • 값을 담을 수 있는 1차원 배열은 만들어지지 않은 상태

  • 가변 배열을 생성한 후, 배열의 인덱스마다 1차원 배열을 생성해줘야 함
    • 2차원배열명[인덱스] = new 데이터타입[해당 인덱스에 들어갈 1차원배열 길이];
int[][] array5 = new int[3][];
*//위와 같이 선언하면 array5는 3개짜리 배열을 참조
//3개짜리 배열은 아직 참조하는 배열이 없다는 것을 의미 (*값을 담을 수 있는 1차원 배열이 만들어지지 않음)
**array5[0] = new int[1]; *//정수를 1개 담을 수 있는 배열을 생성해 array5의 0번째 인덱스가 참조*
array5[1] = new int[2]; *//정수를 2개 담을 수 있는 배열을 생성해 array5의 1번째 인덱스가 참조*
array5[2] = new int[3]; *//정수를 3개 담을 수 있는 배열을 생성해 array5의 2번째 인덱스가 참조*

  • 초기화 블록을 사용하여 배열을 선언과 동시에 초기화할 수 있음
int[][] array6 = {{1},{2,3},{4,5,6}};

실습


 

 for each 

  • 자바 1.5 버전부터 추가된 for each 구문
    • 자바에선 for로 사용하긴 하지만, 다른 언어에선 for each로 사용
  • 형태: for(데이터타입 값을 받아줄 변수명 : 출력하고 싶은 자료구조)
int[] iarr = {10,20,30,40,50};

  for(int value:iarr){
    System.out.println(value);
  }
//아래와 같은 결과를 냄

for(int i = 0; i < iarr.length; i++) {
  int value = iarr[i];
  System.out.println(value);
}
  • for each문은 iarr를 자동으로 돌면서 값을 꺼내고 value가 그걸 받는 과정을 반복
    • 문법도 훨씬 간결하고 값을 꺼내서 담아주는 역할까지 알아서 해줌
  • for문은 iarr의 인덱스를 이용해 값을 꺼내서 int형 변수 value에 담는 과정을 반복
    • 반복해서 자료를 꺼내기 위해 배열과 같은 자료구조의 크기륾 먼저 알낸 후에 그 크기만큼 돌면서 사용해야 함

실습