Do it! 알고리즘 입문: 자바 편 (2)
[책리뷰 & Book review]
public static void main(String [] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] inputNumbers = new int [N]
이해하기
자바에서 배열은 다음과 같이 세 가지 단계를 거쳐 초기화됩니다.
배열 선언: int [] inputNumbers;라는 코드는 inputNumbers라는 이름의 정수형 배열을 선언합니다.
이 시점에서 inputNumbers는 아직 어떤 메모리도 가리키고 있지 않습니다.
배열 생성: new int [N];라는 코드는 메모리에 N개의 정수를 저장할 수 있는 공간을 할당하고, 이 공간의 주소를 반환합니다.
배열 초기화: int [] inputNumbers = new int [N]; 이라는 코드는 선언한 배열에 메모리 공간을 할당하고 그 주소를 inputNumbers에 저장합니다. 이제 inputNumbers는 N개의 정수를 저장할 수 있는 배열을 가리키게 됩니다.
이렇게 세 단계를 거치면, inputNumbers는 사용자가 입력한 N개의 정수를 저장할 수 있는 배열이 됩니다.
다음은 이 과정을 도식화한 그림입니다.
[변수 선언]
int[] inputNumbers;
↓
[메모리 할당]
new int[N];
↓
[변수 초기화]
int[] inputNumbers = new int[N];
이제 inputNumbers는 N개의 정수를 저장할 수 있는 배열이며, 사용자로부터 N개의 정수를 입력받아 배열에 저장하는 코드는 다음과 같습니다.
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] inputNumbers = new int[N];
for (int i = 0; i < N; i++) {
inputNumbers[i] = scanner.nextInt();
}
}
}
이 코드를 실행하면, 사용자로부터 N개의 정수를 입력받아 inputNumbers 배열에 순차적으로 저장합니다.
이 배열은 이후에 다른 연산이나 출력 등에 사용될 수 있습니다.
[변수 선언]
int[] inputNumbers;
↓
[메모리 할당]
new int[N];
↓
[변수 초기화]
int[] inputNumbers = new int[N];
의 과정은 꼭 거쳐야 하는가?
자바에서 배열을 사용하기 위해 위의 세 단계를 거치는 이유는 자바의 메모리 관리 방식 때문입니다.
자바에서는
모든 객체, 배열 포함,
이 힙 메모리에 생성되며,
이 힙 메모리는 JVM(Java Virtual Machine)에
의해 관리됩니다.
변수 선언: 변수를 선언함으로써 컴파일러에게 변수의 타입과 이름을 알려줍니다.
이렇게 하면 컴파일러는 이 변수를 사용할 수 있도록 스택 메모리에 공간을 할당합니다.
이 시점에서 변수는 아직 실제 데이터를 가리키고 있지 않습니다.
메모리 할당: new 키워드를 사용하여 힙 메모리에 공간을 할당하고, 이 공간을 배열로 사용하도록 합니다.
new int [N]은 힙 메모리에 N개의 정수를 저장할 수 있는 공간을 생성하고, 이 공간의 주소를 반환합니다.
변수 초기화: 반환된 주소를 배열 변수에 할당함으로써, 이제 이 변수는 실제 데이터를 가리키게 됩니다.
다음은 이 과정을 도식화한 그림입니다.
[변수 선언] [메모리 할당] [변수 초기화]
int[] inputNumbers; new int[N]; int[] inputNumbers = new int[N];
↓ ↓ ↓
[스택 메모리] [힙 메모리] [스택 메모리]
inputNumbers: null int[N] 생성 inputNumbers: int[N]의 주소
이 과정을 거치지 않고 배열을 사용하려 하면,
배열이 가리키는 메모리가 할당되지 않았기 때문에 Null Pointer Exception이 발생할 수 있습니다.
이는 배열이 아직 실제 데이터를 가리키고 있지 않기 때문입니다.
이러한 과정은 자바가 메모리를 안전하게 관리하고,
개발자로부터 복잡한 메모리 관리를 추상화하여 쉽고 안전하게 프로그래밍을 할 수 있도록 돕습니다.
자바는 이러한 메모리 관리를 JVM이라는 가상 머신을 통해 수행하며,
이는 플랫폼 독립성을 보장하고 코드의 안정성을 높입니다.
자바에서 배열을 사용하기 위해 위의 세 단계를 거치는 이유
자바에서 배열을 사용하기 위해서는
배열 선언,
메모리 할당,
변수 초기화라는 세 단계를 거쳐야 합니다.
이 과정은 자바의 메모리 관리 방식, 특히 힙 메모리와 스택 메모리의 사용 방식 때문입니다.
배열 선언: int [] inputNumbers; 이 코드는 정수형 배열 inputNumbers를 선언합니다. 이때 스택 메모리에 inputNumbers를 위한 공간이 만들어지고, 이 변수는 아직 힙 메모리의 어떤 공간도 가리키지 않습니다.
메모리 할당: new int [N]; 이 코드는 힙 메모리에 정수 N개를 저장할 수 있는 공간을 할당하고, 그 공간의 주소를 반환합니다.
변수 초기화: int [] inputNumbers = new int [N]; 이 코드는 inputNumbers에 힙 메모리 주소를 할당합니다. 이제 inputNumbers는 힙 메모리에 할당된 공간을 가리키게 됩니다.
이 과정을 도식화하면 아래와 같습니다.
[변수 선언]
스택 메모리: inputNumbers 변수 공간 생성
↓
[메모리 할당]
힙 메모리: int[N] 공간 생성
↓
[변수 초기화]
스택 메모리: inputNumbers 변수가 힙 메모리의 int[N] 공간을 가리킴
그리고 이를 자바 코드로 표현하면 아래와 같습니다.
java
int[] inputNumbers; // 변수 선언
inputNumbers = new int[N]; // 메모리 할당과 변수 초기화
이는 자바가 메모리를 안전하고 효율적으로 관리하기 위한 방법으로, 자바 가상 머신(JVM)이 자동으로 메모리를 관리해 주기 때문에 개발자는 이런 세부적인 메모리 관리 과정을 신경 쓸 필요가 없습니다.
또한, 이런 방식은 배열의 크기가 실행 시점에 결정될 수 있게 해 주므로 프로그램의 유연성을 높여줍니다.
int N = scanner.nextInt();
int [] inputNumbers = new int [N];
을 분석하여 보자.
int [] inputNumbers = new int [N]; 이 코드에서 각 키워드의 역할은 다음과 같습니다.
int []: 이 부분은 정수형 배열을 선언하겠다는 것을 나타냅니다.
inputNumbers: 이 부분은 변수의 이름을 나타냅니다. 이 이름을 통해 배열에 접근할 수 있습니다.
=: 이 부분은 할당 연산자로, 왼쪽의 변수(inputNumbers)에 오른쪽의 값을 할당하겠다는 것을 나타냅니다.
new: 이 부분은 새로운 객체를 생성하겠다는 것을 나타내는 키워드입니다. 이 경우에는 새로운 정수형 배열을 생성하겠다는 것을 의미합니다.
int [N]: 이 부분은 N개의 정수를 저장할 수 있는 배열을 생성하겠다는 것을 나타냅니다.
스택 메모리와 힙 메모리에 대한 이해도
[1. 변수 선언]
[스택 메모리]
| |
| inputNumbers: null| ----> X (아무것도 가리키지 않음)
| |
-------------------
[2. 메모리 할당(new int[N])과 변수 초기화(inputNumbers =)]
[스택 메모리] [힙 메모리]
| | | |
| inputNumbers ----|----> | int[N]|
| | | |
------------------- | |
| |
---------
그리고 이를 자바 코드로 표현하면 아래와 같습니다.
java
public class Main {
public static void main(String[] args) {
int N = 10; // 스택 메모리에 변수 N이 할당됩니다.
int[] inputNumbers = new int[N]; // 힙 메모리에 int[N] 배열이 할당되고,
이 배열을 가리키는 inputNumbers 변수가 스택 메모리에 할당됩니다.
}
}
이 코드를 실행하면, main 메서드가 호출되면서 새로운 스택 프레임이 생성되고,
이 프레임 안에 변수 N과 inputNumbers가 할당됩니다.
동시에 new int [N]에 의해 힙 메모리에 배열이 할당되며, 이 배열의 주소가 inputNumbers에 저장됩니다.
스택 메모리와 힙 메모리는 프로그램의 두 주요 메모리 영역으로, 각각의 특징과 용도가 있습니다.
스택 메모리: 스택 메모리는 각 스레드에 대해 JVM이 생성하며, 메서드 호출과 로컬 변수에 대한 메모리 할당을 담당합니다. 스택 메모리는 자동으로 관리되며, 메서드 호출이 끝나면 메서드에 의해 할당된 모든 변수는 자동으로 해제됩니다. 이는 메모리 관리를 간소화하지만, 공간이 제한적이라는 단점이 있습니다.
힙 메모리: 힙 메모리는 애플리케이션 전체에서 공유되며, 객체와 배열을 저장하는 데 사용됩니다. 힙 메모리는 가비지 컬렉션에 의해 관리되며, 더 이상 참조되지 않는 객체는 가비지 컬렉터에 의해 자동으로 제거됩니다. 힙 메모리는 크기가 크지만, 가비지 컬렉션 동안 애플리케이션 성능에 영향을 줄 수 있다는 단점이 있습니다.
이 두 메모리 영역의 사용은 아래 코드와 같습니다:
java
public class Main {
public static void main(String[] args) {
int N = 10; // 스택 메모리에 변수 N이 할당됩니다.
int[] inputNumbers = new int[N]; // 힙 메모리에 int[N] 배열이 할당되고,
이 배열을 가리키는 inputNumbers 변수가 스택 메모리에 할당됩니다.
}
}
이를 도식화하면 다음과 같습니다:
[스택 메모리]
| |
| inputNumbers ----|----> [힙 메모리]
| | | |
| method call | | int[N]|
| | | |
------------------- | |
| |
---------
또한, 스택 메모리와 힙 메모리는 서버의 상태와 연관성이 있습니다.
메모리가 부족하면 OutOfMemoryError가 발생하거나,
가비지 컬렉션으로 인해 애플리케이션 성능이 저하될 수 있습니다.
따라서 적절한 메모리 관리는 서버의 성능과 안정성에 중요한 역할을 합니다.
#알고리즘 #자바 #자바알고리즘 #정렬알고리즘 #알고리즘강좌 #알고리즘기초 #알고리즘뽀개기 #알고리즘공부 #알고리즘대회 #백준알고리즘 #두잇알고리즘 #알고리즘조합 #해시알고리즘 #알고리즘순열 #알고리즘기본 #js알고리즘 #재귀알고리즘 #두잇알고리즘 #알고
#자바 #자바프로그래밍 #자바프로그래밍입문 #자바입문 #doit #자바언어 #자바기초 #자바인강 #자바초보 #백준자바 #두잇자바 #자바스크립트 #자바기초강의 #자바강의 #자바독학 #자바설치 #it취업 #doit #doit! #doit! #자바스크립트
#알고리즘 #쇼츠알고리즘 #알고리즘뜻 #알고리즘뜻 #알고리즘강의 #알고리즘영상 #알고리즘공부 #알고리즘대회 #쇼츠알고리즘 #알고리즘만화 #알고리즘 4화 #유튜브알고리즘 #알고리즘투게더 #알고리즘원리 #알고리즘공부 #알고리즘강의 #알고리즘이란 #실전알고리즘 #지식
#코딩테스트 #카카오코딩테스트 #네이버코딩테스트 #삼성코딩테스트 #네카라쿠배코딩테스트 #코딩테스트 #코딩테스트준비 #삼성코딩테스트 #코딩테스트문제 #코딩테스트공부 #코딩테스트준비법 #코딩테스트공부 #코딩테스트풀이 #코딩테스트언어 #코딩테스트준비 #코딩테스트
'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
Do it! 알고리즘 입문: 자바 편 (4)[책리뷰 & Book review] (1) | 2024.01.30 |
---|---|
Do it! 알고리즘 입문: 자바 편 (3)[책리뷰 & Book review] (1) | 2024.01.29 |
Do it! 알고리즘 입문: 자바 편 (1)[책리뷰 & Book review] (1) | 2024.01.29 |
죽음이 물었다 어떻게 살 거냐고 (1)[책리뷰 & Book review] (2) | 2024.01.29 |
댓글