-
java - 5) 배열Java 2020. 7. 19. 00:03
- 메모리 구조
모든 자바 프로그램은 JVM을 통해서 실행된다.
자바 프로그램이 실행되면, JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당 받는다.
이렇게 할당받은 메모리를 JVM은 용도에 따라 다음과 같이 구분하여 관리한다.
- 메소드 영역
메소드 영역은 자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역이다.
JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여,
해당 클래스에 대한 정보를 메소드 영역에 저장한다.
- 힙 영역
힙 영역은 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역이다.
JVM은 자바 프로그램에서 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
- 스택 영역
스택 영역은 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역이다.
JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장한다.
이렇게 스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸한다.
이렇게 스택 영역에 저장되는 호출 정보를 스택 프레임 (stack frame)이라고 한다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.
이러한 스택은 후입선출 (LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
- 1차원 배열
배열 (array)이란 ?
배열은 같은 타입의 변수들로 이루어진 유한 집합으로 정의할 수 있다.
배열을 구성하는 각각의 값을 배열 요소 (element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스 (index)라고 한다.
자바에서 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다.
배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 사용할 수 있는 가장 기본적인 자료구조이다.
배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있다.
하지만 현실적으로 이해하기가 쉬운 2차원 배열까지가 많이 사용된다.
- 배열 문법
선언 : 타입[] 배열이름;
생성 : 배열이름 = new 타입[배열길이];
동시에 : 타입[] 배열이름 = new 타입[배열길이];
초기화 : 타입[] 배열이름 = { 배열요소1, 배열요소2, ... };
타입[] 배열이름 = new 타입[]{ 배열요소1, 배열요소2, ...};
- 다차원 배열 (multi-dimensional array)
다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미한다.
즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며,
3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고,
4차원 배열은 배열 요소로 3차원 배열을 가지는 배열인 것이다.
- 가변 배열 (dynamic array)
자바에서는 2차원 배열을 생성할 때 열의 길이를 명시하지 않음으로써, 행마다 다른 길이의 배열을 요소로 저장할 수 있다.
이렇게 행마다 다른 길이의 배열을 저장할 수 있는 배열을 가변 배열 (dynamic array)라고 한다.
ex)
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[1];
int[][] arr = {
{10, 20},
{10, 20, 30, 40},
{10}
};
- 배열의 활용
- 배열의 복사
자바에서 배열은 한 번 생성하면 그 길이를 변경할 수 없다.
따라서 더 많은 데이터를 저장하기 위해서는 더욱 큰 배열을 만들고, 이전 배열의 데이터를 새로 만든 배열로 복사해야 한다.
이런 배열의 복사를 위해 자바에서는 다음과 같이 여러 가지 방법을 제공한다.
1. System 클래스의 arraycopy()
2. Arrays 클래스의 copyOf()
3. Object 클래스의 clone()
4. for문과 index를 이용한 복사
이 중에서 가장 좋은 성능을 보이는 것은 배열의 복사만을 위해 만들어진 arraycopy() 메소드이다.
하지만 현재 배열의 복사를 위해 가장 많이 사용되는 메소드는 좀 더 유연한 방식의 copyOf() 메소드이다.
arraycopy(), copyOf() 메소드와 for 문을 이용한 복사는 배열의 길이를 마음대로 늘일 수 있다.
하지만 clone() 메소드는 이전 배열과 같은 길이의 배열밖에 만들 수 없다.
- Enhanced for 문
Enhanced for 문은 명시한 배열이나 컬렉션의 길이만큼 반복되어 실행된다.
루프마다 각 요소는 명시한 변수의 이름으로 저장되며, 명령문에서는 이 변수를 사용하여 각 요소를 참조할 수 있습니다.
Enhance for 문 내부에서 사용되는 배열 요소는 배열 요소 그 자체가 아닌 배열 요소의 복사본입니다.
따라서 Enhance for 문에서 배열 요소의 값을 변경하여도 원본 배열에는 아무런 영향을 주지 못하게 됩니다.
- 문법
for (타입 변수이름 : 배열이나컬렉션이름) {
배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
}
※출처
'Java' 카테고리의 다른 글
JPA - 6. 프록시와 연관관계 관리 (0) 2020.07.25 JPA - 5. 상속관계 매핑 (0) 2020.07.25 java - 6) 클래스 (0) 2020.07.20 java -2) 타입 (0) 2020.07.08 java - 1 (0) 2020.07.05