[자바] 배열이란?

배열이란?

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

을 의미한다
학생의 시험점수를 저장한다면 변수에 이름을 하나 하나 작성하여, 불러들어야 한다.
그러면 특정 학생의 점수를 불러들이면 일일히 변수의 이름을 기억을 해야한다.

이러한 문제점을 해결하기위해 배열을 사용한다.

배열의 특징

  • 인덱스 연산자[]를 이용하여 빠른 참조가 가능
  • 물리적 위치와 논의적 위치가 동일
  • 배열의 순서는 0부터 시작
  • 자바에서는 객체 배열을 구현한 ArrayList를 많이 활용한다

인덱스 연산자[]를 이용하여 빠른 참조가 가능

배열은 순서가 있는 자료형이다 순서는 0부터 배열의 길이-1 만큼을 가지고 있다. 해당하는 순서의 배열을 부를 수 있다.

물리적 위치와 논리적 위치가 동일

int[] arr = new int[5];

위의 배열을 풀어말하면 정수가 저장이 되는 8바이트의 데이터가 5개를 arr라는 이름으로 저장하였다 라는 것이다 정의적으로 8바이트의 데이터 옆에 또다른 공간의 데이터가 있다인 것처럼 컴퓨터 저장되는 위치도 동이하다
당연한 소리라고 생각이 들수 도 있지만 자바의 다른 참조형 데이터인 LinkedList는 물리적 위치와 논리적 위치가 동일하지 않다

배열의 선언 및 초기화

배열 선언

int[] arr1 = new int[10];
int arr2[] = new int[10];

데이터타입을 왼쪽에 넣고 []을 통해 이 변수는 자료형이다라는 것을 나타낸다.
배열의 이름을 적은 후, = 뒤에 new을 적은 후(뒤에 new가 왜 사용되는지 자세히 말하겠다)
해당 데이터타입의 갯수를 []안에 적어 주어야한다
변수을 적을 때, 변수의 이름과 []의 위치는 바뀌어도 상관이 없다.

배열 초기화 하기

  • 배열은 선언과 동시에 자료형에 따라 초기화가 된다(정수는 0, 실수는 0.0,객체는 null)
  • 필요에 따라 초기값을 지정할 수 있다

int[] numbers = new int[]{10, 20, 30}; //개수 생략해함, 갯수를 넣을 시 갯수 만큼 수도 넣어야 함
int[] numbers = {10, 20, 30}; // new int[] 생략 가능
int[] ids;
ids = new int[] {10, 20, 30}; // 선언후 배열을 생성하는 경우는 new int[] 생략할 수 없음

배열 사용하기

배열의 변수처럼 출력하면 어떻게 나올까

위와 같이 나온다. 그 이유는 배열이 어디에 저장이 되어있는지 알면 이해할 수있다.
우리가 프로그램이 실행 할때 변수가 저장되는 위치는 stack이다. 배열과 참조형 자료형, 객체 같은 경우는 heap에 저장이되고 stack에 있는 변수에 heap의 어느 위치에 있느지 주소값을 저장하게 된다. 따라서 우리가 생성을 할때 new 키위드를 사용하는 것이다.

배열의 아래와 요소에 접근을 할려면 아래와 같이 접근을 해야한다.

  • [] 인덱스 연산자 활용 - 배열 요소가 저장된 메모리의 위치를 연산하여 찾아줌
  • 배열을 이용하여 합을 구하기
class Main {
  public static void main(String[] args) {
    int[] arr = new int[5];
    int sum = 0;

    // 1부터 5까지 배열에 넣는 과정의 반복문이다
    for(int i = 0, num= 1; i<arr.length; i++, num++){
      arr[i] = num;
    }

    // 배열의 각 요소에 접근하여 모든 요소를 더하는 변수이다
    for(int i = 0; i<arr.length; i++){
      sum += arr[i];
    }

    // 합계를 출력하는 변수이다
    System.out.println("합계 : "+ sum);
  }
}

배열의 길이와 요소의 개수는 동일하지 않습니다

  • 배열을 선언하면 개수만큼 메모리가 할당되지만, 실제 요소(데이터)가 없는 경우도 있음
  • 배열의 length 속성은 배열의 개수를 반환해주기 때문에 요소의 개수와는 다름
  • length를 활용하여 오류가 나는 경우
class Main {
  public static void main(String[] args) {
    double[] dArr = new double[5];

    dArr[0] = 1.1;
    dArr[1] = 2.1;
    dArr[2] = 3.1;

    // 각 요소들을 모두 곱하여 저장하는 변수
    double mtotal = 1;
    for(int i = 0; i<dArr.length; i++){
      
      mtotal *= dArr[i];
      System.out.println("dArr의 "+i+"번째 요소 : "+dArr[i]);
      
    }
    System.out.println("요소들의 곱 : "+mtotal);
    return ;
  }
}
  • 원하는 결과

  • 실제 결과

  • 각 요소들을 출력한 사진

위와 같이 배열의 선언할때 0.0으로 출력이 되는 것을 볼수 있다. 내가 특정 요소를 초기화를 하여도 그외의 요소도 초기화가 된 상태이기때문에 arr.length와 선언한 갯수가 차이가 있는 것을 볼 수 있다.

  • 요소가 0.0이면 for문 빠져나오기
class Main {
  public static void main(String[] args) {
    double[] dArr = new double[5];

    dArr[0] = 1.1;
    dArr[1] = 2.1;
    dArr[2] = 3.1;

    // 각 요소들을 모두 곱하여 저장하는 변수
    double mtotal = 1;
    for(int i = 0; i<dArr.length; i++){
      if(dArr[i] == 0.0){
        break;
      }
      
      mtotal *= dArr[i];
      System.out.println("dArr의 "+i+"번째 요소 : "+dArr[i]);
      
    }
    System.out.println("요소들의 곱 : "+mtotal);
    return ;
  }
}
  • 요소의 개수에 대한 변수(count)를 따로 유지
class Main {
  public static void main(String[] args) {
    double[] dArr = new double[5];
    int count = 0;

    dArr[0] = 1.1; count++;
    dArr[1] = 2.1; count++;
    dArr[2] = 3.1; count++;

    // 각 요소들을 모두 곱하여 저장하는 변수
    double mtotal = 1;
    for(int i = 0; i<count; i++){
      
      mtotal *= dArr[i];
      System.out.println("dArr의 "+i+"번째 요소 : "+dArr[i]);
      
    }
    System.out.println("요소들의 곱 : "+mtotal);
    return ;
  }
}

위와 같은 코드로 원하는 결과를 나올수 있다.

향상된 for문 사용하기

배열의 n개의 요소를 0부터 n-1까지 순차적으로 순회할 때 간단하게 사용할 수 있음

  • 사용하는 형식
for(변수: 배열){

}
  • 문자 배열을 만들어 A-Z까지 배열에 저장하고 이를 다시 출력하기
class Main {
  public static void main(String[] args) {
    char[] alphabets = new char[26];
    char ch = 'A';

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

    for(char alpha : alphabets){
      System.out.println(alpha +","+ (int)alpha);
    }
    
    return ;
  }
}
  • 실행 결과

좋은 웹페이지 즐겨찾기