[JAVA] ch4: 배열과 문자열

oow·2026년 4월 3일

JAVA

목록 보기
7/13

배열

배열


배열인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조이다. 같은 타입, 같은 의미를 지닌 자료들이라면 개별적인 변수로 저장하기보다 배열로 저장하는 것이 효율적이다. 또한 반복문으로 배열을 탐색할 수 있다는 장점이 있다.

일차원 배열

double [] doubleArray와 같이 배열을 선언하고 new double[5]와 같이 공간을 할당한다. 이때, 공간은 힙 영역에 생성된다. 배열 이름은 배열이 할당된 공간을 가리키는 포인터라고 생각할 수 있다.

new로 공간을 할당하는 것 대신, int [] intArray = {1, 2, 3, 4, 5};와 같이 초기값을 설정하여 배열을 생성할 수 있다.

배열 인덱스

배열의 인덱스는 0부터 시작한다. 크기가 n인 배열을 생성한다면 [0]...[n-1] 인덱스에 접근 가능하다. 인덱싱을 이용해 배열에 접근하기 위해서는 먼저 배열 공간을 할당해야 한다.

배열 공유

intArray라는 배열을 생성한 후 int [] myArray = intArray;로 치환할 경우 두 레퍼런스가 하나의 주소를 가리키게 된다. intArray에 할당된 공간을 myArray도 동일하게 접근 가능한 것이다. 이후 intArray에 새롭게 공간을 할당할 수도 있다.

  • .length 필드로 배열의 크기를 구한다.
  • 기능을 모듈화하여 메소드로 나누어 구현한다.
  • 메소드의 인자와 리턴값 여부, 타입을 고려한다.

배열과 for-each문

String [] names = {"", "", "", ...}
for(String s : names) {
	System.out.prints(s + " ");
}

for문 안에 (배열의 원소 타입 변수 : 배열)을 입력하여 enumerate를 순회할 수 있다. 따로 인덱스 변수 i 제어하지 않아도 돼서 유용하다. 반대로 i값을 알아야 하는 경우는 일반 for문을 사용한다.

2차원 배열

2차원 배열에는 행과 열이 있다. int [][] intArray = new int[2][5];와 같이 2차원 배열을 선언 및 할당할 수 있고, 위 배열은 자료형이 int인 2행 5열 배열이다.

이때 레퍼런스인 intArray의 length는 행의 개수인 2가 되고, 각 행을 가리키는 intArray[i].length의 length는 열의 개수인 5가 된다.

  • 평점 입력 메소드와 합 계산 메소드를 구현한다.
  • 행의 길이와 열의 길이를 고려하여 이중 for문을 작성한다.
  • 인덱스(0~)와 출력값(1학년~)의 차이를 고려한다.

비정방형 배열

비정방형 배열은 정방형 배열과 달리 각 행의 열의 개수가 다른 배열을 말한다. 행마다 따로 1차원 배열 공간을 할당해주어야 한다.

  • 매 행마다 열의 개수를 입력받아 new int[c]로 공간을 할당한다.
  • 배열을 출력할 때, 배열의 인덱스는 0부터 시작하므로 i, j의 초기값을 0으로 설정한다. -> 1부터 출력하려면 i+1, j+1을 해주어야 한다.

메소드에서의 배열

메소드 호출의 경우) 배열 변수는 레퍼런스(주소)를 저장하므로 메소드에 배열 이름만 전달하면 된다. 메소드에서 배열을 수정하면 원본 배열에 반영된다.

메소드에서 리턴하는 경우) 배열은 heap 영역에 생성되어 메소드 종료 후에도 값이 사라지지 않는다. 따라서 배열 변수를 리턴할 수 있다. 이때 리턴 타입을 맞춰주어야 한다. 참고로, 메소드에서 일반 변수는 스택에 생성된다.

  • 메소드의 리턴 타입, 메소드가 리턴하는 배열, 메소드의 리턴값을 받을 변수의 타입을 일치시킨다. -> int []

문자열

  • 입출력 메소드를 분리할 수 있다.
  • makeArray에서 String을 입력받기 위해 nextLine()을 사용한다. -> nextInt()와 nextLine() 사이에 엔터를 먹어주어야 한다. -> 이 과정이 없으면 to-do[1]을 스킵하고 to-do[2]부터 입력받는다.
  • 입력이 "."이면 입력을 종료한다. -> 문자열은 .equals() 메소드로 비교한다.
  • 문자열 배열을 리턴하는 대신, 인자로 넘길 수 있다. -> 메소드에서 배열을 수정하면 원본 배열에 반영된다.
  • 문장을 입력받을 때 카운트를 세면 출력할 때 null이 표시되지 않도록 반복 횟수를 설정할 수 있다.

Supp. ArrayList

ArrayList는 크기가 정해지지 않은 배열이다.

  • .add()으로 값을 추가한다.
  • .get()으로 특정 인덱스 값에 접근한다. -> ar.get(i)=15;와 같이 대입하면 오류가 발생한다.
  • .size()로 크기를 얻는다.
  • 배열의 원소가 int이므로 배열의 크기를 몰라도 for(int num:ar)으로 순차적 출력이 가능하다.
  • .size()와 .get()으로 일반 for문 출력도 가능하다.

0개의 댓글