CodeGym /Java Blog /무작위의 /배열에 관한 것
John Squirrels
레벨 41
San Francisco

배열에 관한 것

무작위의 그룹에 게시되었습니다
안녕! 이전 교육에서는 단일 객체(및 기본 유형)로 작업했습니다. 하지만 하나가 아닌 전체 개체 그룹으로 작업해야 하는 경우에는 어떻게 해야 할까요? 예를 들어 회사의 모든 직원의 생일 목록을 만들고 싶다고 가정합니다. 다음과 같은 형식의 30개 문자열을 포함해야 합니다. "Sarah Huffman, January 25" 배열 이라는 특수 데이터 구조의 이점을 얻을 수 있습니다 . 배열을 실제 개체와 비교하면 안전 금고가 있는 은행 금고와 매우 유사합니다. 배열에 관한 것 - 1배열도 "상자"로 구성됩니다. 각 상자에 무언가(요소)를 넣을 수 있습니다. 요소에 액세스하려면 상자 번호(인덱스)를 알아야 합니다. 배열이 생성되는 방식은 다음과 같습니다.

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
여기서는 10개의 요소를 포함하는 배열을 만듭니다. 어레이의 일부 기능을 즉시 확인할 수 있습니다.
  1. 잘 정의된 데이터 유형 의 요소를 저장합니다 . 문자열 배열을 만들면 그 안에 다른 것을 저장할 수 없습니다. 데이터 유형은 어레이가 생성될 때 지정됩니다 . 이것이 고객이 원하는 것을 보관할 수 있는 안전 금고와 다른 점입니다.

  2. 배열을 만들 때 크기를 지정해야 합니다 . 배열을 만든 후에는 나중에 표시하거나 크기를 변경할 수 없습니다 .
우리가 배열을 만들고 있다는 사실은 식의 양쪽에 있는 대괄호로 표시됩니다. 참조 변수 이름 앞이나 뒤에 지정할 수 있습니다. 어느 쪽이든 작동합니다.

String [] birthdays = new String[10];
String birthdays [] = new String[10];
배열에 무언가를 쓰려면 값을 쓸 상자의 인덱스를 지정해야 합니다. 배열의 상자는 0부터 시작하여 번호가 매겨집니다. 0부터 시작하여 계산하는 것은 프로그래밍에서 매우 일반적인 관행입니다. 빨리 익숙해질수록 좋습니다 :) 즉, 첫 번째 상자배열에 관한 것 - 2 에 값을 입력하려면 다음과 같이 하세요.

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
이제 Jana의 생일은 직원 생일 배열의 첫 번째 셀에 저장됩니다. 유사한 방식으로 다른 값을 추가할 수 있습니다.

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
여덟 번째 상자에 Rosie의 생일을 추가했습니다 (7번 상자가 여덟 번째 상자인 이유를 잊지 않으셨습니까?) . 다른 모든 셀을 채우지 않은 것을 볼 수 있습니다. 배열에 값을 순서대로 쓸 필요는 없습니다. 그런 요구 사항은 없습니다. 물론 요소를 순서대로 작성하면 사용 가능한 상자 수와 사용 중인 상자 수를 훨씬 쉽게 추적할 수 있으며 배열에 "구멍"이 생기는 것을 방지할 수 있습니다. 상자 중 하나의 내용물을 얻으려면 (안전 금고와 마찬가지로) 번호를 알아야 합니다. 이것이 수행되는 방법입니다.

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
콘솔 출력: Rosie Mills, 1월 3일 우리 는 변수를 만들고 String컴파일러에 다음과 같이 말했습니다 . 그리고 그것이 정확히 한 일입니다. 배열로 작업할 때 특수 속성인 length를 사용하여 배열의 길이를 쉽게 찾을 수 있습니다 . String

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
콘솔 출력: 10 참고: length속성은 가득 찬 상자 수가 아니라 배열 크기를 저장합니다. 우리 배열은 3개의 값만 저장하지만 만들 때 크기를 10으로 표시했습니다. 그리고 이것은 정확히 필드가 반환하는 값입니다 length. 이것이 유용한 이유는 무엇입니까? 음, 모든 생일 목록을 표시하고 싶다고 가정합니다(아무도 잊지 않았는지 확인하기 위해). 하나의 간단한 루프에서 이 작업을 수행할 수 있습니다.

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
루프에서 i0으로 초기화되는 변수를 선언합니다. 각 패스에서 배열에서 인덱스 i를 가진 요소를 가져와 그 값을 표시합니다. 루프는 10회 반복하고 i는 0에서 9로 증가하며 숫자는 배열 요소의 인덱스가 됩니다! 결과적으로 birthdays[0] 에서 birthdays[9] 까지 의 모든 값을 표시합니다 . 실제로 배열을 만들 수 있는 다른 방법이 있습니다. int예를 들어 다음과 같이 배열을 만들 수 있습니다 .

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
이 기술을 "바로 가기 초기화"라고 합니다. 동시에 배열을 생성하고 값으로 채우기 때문에 매우 편리합니다. 배열 크기를 명시적으로 지정할 필요가 없습니다. 단축키 초기화를 사용하면 필드 length가 자동으로 설정됩니다.

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
콘솔 출력: 9 이제 배열이 메모리에 저장되는 방식에 대해 조금 알아보겠습니다. 세 개의 객체로 구성된 배열이 있다고 가정해 보겠습니다 Cat.

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
여기서 몇 가지 사항을 이해해야 합니다.
  1. 프리미티브의 경우 배열은 특정 값 세트(예: ints)를 저장합니다. 개체의 경우 배열은 참조 집합을 저장 합니다 .
    배열 cats은 세 개의 요소로 구성되며 각 요소는 객체 에 대한 참조Cat 입니다 . 각 참조는 해당 개체가 저장된 메모리 주소를 가리킵니다.

  2. 배열 요소는 메모리의 단일 블록에 배열됩니다. 이는 빠르고 효율적으로 액세스할 수 있도록 하기 위한 것입니다.
따라서 cats모든 개체(배열 요소)가 저장되는 메모리 블록을 참조합니다. Cats[0]이 블록 내의 특정 주소를 참조합니다. 배열에 관한 것 - 3 배열은 단순히 객체를 저장하는 것이 아니라 객체 자체라는 점을 이해하는 것이 중요합니다. 이것은 우리가 문자열이나 숫자의 배열뿐만 아니라 배열의 배열 도 만들 수 있는지에 대한 의문을 갖게 합니다 . 대답은 '예'입니다. 할 수 있습니다! 배열은 다른 배열을 포함하여 모든 개체를 저장할 수 있습니다. 이러한 배열을 2차원 이라고 합니다 . 시각적으로 표현하자면 일반 테이블과 매우 유사할 것입니다. 각각 10초를 저장할 수 있는 3개의 배열 로 구성된 배열을 만들고 싶다고 가정합니다 int. 다음과 같이 표시됩니다.
배열에 관한 것 - 4
각 줄은 int배열을 나타냅니다. 첫 번째 배열에는 1에서 10까지의 숫자가 포함되고 두 번째 배열에는 -1에서 -10까지의 숫자가 포함되며 세 번째 배열에는 난수 집합이 포함됩니다. 이러한 각 배열은 2차원 배열의 상자에 저장됩니다. 코드에서 2차원 배열의 초기화는 다음과 같습니다.

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
우리의 2차원 배열 고양이는 각 배열에 5개의 상자가 있는 3개의 배열을 저장합니다 . 두 번째 배열의 세 번째 상자에 객체를 넣으려면 다음과 같이 합니다.

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]두 번째 배열을 나타내고 [2]해당 배열의 세 번째 상자를 나타냅니다. 2차원 배열은 여러 배열로 구성되어 있으므로 이를 반복하고 모든 값을 표시하려면(또는 모든 요소를 ​​채우려면) 중첩 루프가 필요합니다.

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
외부 루프(변수 i)에서 2차원 배열의 모든 배열을 반복합니다. 내부 루프(변수 j)에서 각 배열의 모든 요소를 ​​통과합니다. 그 결과, cats[0][0] (첫 번째 배열, 첫 번째 요소)이 먼저 표시되고, 그 뒤에 cats[0][1] (첫 번째 배열, 두 번째 요소)가 표시됩니다. 첫 번째 배열을 살펴본 후 cats[1][0] , cats[1][1] , cats[1][2] 등을 표시합니다. 그런데 2차원 배열도 지원합니다. 속기 초기화:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
일반적으로 우리는 2차원 배열을 numbers로 선언 int[3][3]하지만 이 속기를 사용하면 값을 즉시 지정할 수 있습니다. 2차원 배열이 필요한 이유는 무엇입니까? 글쎄요, 하나를 사용하여 유명한 "Battleship" 게임을 쉽게 재현할 수 있습니다. 배열에 관한 것 - 5 "Battleship"에서 경기장의 구조는 각각 10개의 요소가 있는 10개의 배열로 구성된 2차원 배열로 쉽게 설명할 수 있습니다. 이 배열 중 두 개를 생성합니다(하나는 귀하용, 다른 하나는 상대방용).

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
일부 값(예: 숫자 또는 기호)을 사용하여 선박 위치에 해당하는 요소를 채운 다음 특정 요소에 대한 좌표를 차례로 호출합니다.
  • 전함보드1[0][2]!
  • 놓치다! 전함보드2[2][4]!
  • 때리다!
  • 전함보드2[2][5]!
  • 때리다!
  • 전함보드2[2][6]!,
  • 침몰!
이것으로 배열에 대한 첫 번째 소개를 마치지만 배열과의 상호 작용은 시작에 불과합니다. 다음 레슨에서 우리는 그것들이 사용될 수 있는 흥미로운 방법을 볼 것이고 또한 우리가 이 데이터 구조로 더 편리하게 작업할 수 있도록 자바가 가지고 있는 내장 함수에 대해서도 배울 것입니다 :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION