배열

    1) 메모리 구조

     

    메모리 구조

     

    자바 프로그램이 실행되면, JVM은 운영체제로ㅋ부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받음

    메소드(method) 영역

     

    자바 프로그램에서 사용되는 클래스에 대한 정보와 클래스 변수(static variable)가 저장되는 영역

    JVM은 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 대한 정보를

    메소드 영역에 저장함

     

    힙(heap) 영역

     

    자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역

    JVM은 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장함

    힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨

     

    스택(stack) 영역

     

    자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역

    JVM은 메소드가 호풀되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장

    스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸

    후입선출(LIFO, Last In First Out)

     

     

    2) 1차원 배열

     

    배열(array)이란?

     

    같은 타입의 변수들로 이루어진 유한 집합

    배열 요소(element) :  배열을 구성하는 각각의 값

    인덱스(index) : 배열에서의 위치를 가리키는 숫자

     

    1차원 배열

    1. 타입[] 배열이름;
    
    2. 타입 배열이름[];
    
    배열이름 = new 타입[배열길이];
    
    타입[] 배열이름 = 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] + " "); // 인덱스를 이용한 배열로의 접근
    
    }

     

    배열의 초기화

     

    괄호({})를 사용하여 초깃값을 나열한 것을 초기화 블록(initialization block)이라고 함

    1. 타입[] 배열이름 = {배열요소1, 배열요소2, ...};
    
    2. 타입[] 배열이름 = new 타입[]{배열요소1, 배열요소2, ...};
    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};       // 이미 선언된 배열은 이 방법으로만 초기화할 수 있음.
    // 배열 요소의 합과 평균을 구하는 예제
    
    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) + "입니다.");

     

     

    2) 다차원 배열

     

    다차원 배열

     

     2차원 이상의 배열

    배열 요소로 또 다른 배열을 가지는 배열

     

    2차원 배열

     

    배열의 요소로 1차원 배열을 가지는 배열

    1. 타입[][] 배열이름;
    
    2. 타입 배열이름[][];
    
    3. 타입[] 배열이름[];

    int[][] arr = new int[2][3];
    
     
    
    int k = 10;
    
    for (int i = 0; i < arr.length; i++) {
    
        for (int j = 0; j < arr[i].length; j++) {
    
            arr[i][j] = k; // 인덱스를 이용한 초기화
    
            k += 10;
    
        }
    
    }
    
     
    
    for (int i = 0; i < arr.length; i++) {
    
        for (int j = 0; j < arr[i].length; j++) {
    
            System.out.print(arr[i][j] + " ");
    
        }
    
        System.out.println();
    
    }

     

     

    3) 배열의 활용

     

    배열의 복사

     

    1. System 클래스의 arraycopy() 메소드

    2. Arrays 클래스의 copyOf() 메소드

    3. Object 클래스의 clone() 메소드

    4. for 문과 인덱스를 이용한 복사

    int[] arr1 = new int[]{1, 2, 3, 4, 5};
    
    int newLen = 10;
    
     
    
    // 1. System 클래스의 arraycopy() 메소드
    
    int[] arr2 = new int[newLen];
    
    System.arraycopy(arr1, 0, arr2, 0, arr1.length);
    
     
    
    // 2. Arrays 클래스의 copyOf() 메소드
    
    int[] arr3 = Arrays.copyOf(arr1, 10);
    
     
    
    // 3. Object 클래스의 clone() 메소드
    
    int[] arr4 = (int[])arr1.clone();
    
     
    
    // 4. for 문과 인덱스를 이용한 복사
    
    int[] arr5 = new int[newLen];

     

    Enhanced for 문

     

     for (타입 변수이름 : 배열이나컬렉션이름) {
    
        배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
    
    }
    nt[] arr = new int[]{1, 2, 3, 4, 5};
    
     
    
    for (int e : arr) {
    
        System.out.print(e + " ");
    
    }

     

     

     

    출처 : http://www.tcpschool.com/

    'JAVA' 카테고리의 다른 글

    메소드와 생성자  (0) 2022.08.07
    클래스  (0) 2022.08.07
    제어문  (0) 2022.08.02
    연산자  (0) 2022.08.01
    타입  (0) 2022.08.01

    댓글