DSA 1일차: 배열 기초
I’m ready to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (excluding the source line you’ve already provided) here? Once I have the text, I’ll keep the source link at the top and translate the rest into Korean while preserving the original formatting.
Source:
Introduction
저는 배열을 DSA 여정의 시작점으로 선택했습니다. 완전 초보자는 아니지만—이미 Java와 기본 DSA를 배운 적이 있기 때문에—배열은 더 고급 주제로 넘어가기 전에 다시 살펴보고 강화하기에 좋은 개념이라고 생각했습니다.
하지만 절대 초보자에게 바로 배열을 시작점으로 삼는 것은 권장하지 않습니다. 초보자는 먼저 변수, 데이터 타입, 반복문과 같은 기본 프로그래밍 개념에 익숙해져야 합니다. 이러한 기본이 확실히 잡히면 배열을 이해하는 것이 훨씬 쉬워집니다.
DSA를 배우기 전에 프로그래밍 언어를 선택하는 것이 중요합니다. 저는 Java를 주요 언어로 선택했으며, 이 블로그에서는 Java 관점에서 DSA 개념을 다루고, 필요에 따라 Python과의 간단한 비교도 제공할 것입니다.
이 YouTube 튜토리얼 강사님께 빠른 감사를 전합니다—덕분에 개념을 더 잘 이해할 수 있었습니다.
이 블로그에서 다루는 주제
- 배열이 왜 필요할까요?
- 배열이란 무엇인가요?
- Java와 Python의 배열
- Java에서 배열의 구문
- Java에서 배열의 규칙
- 선언 및 초기화
- 배열 생성 예시
- 배열 인덱싱
- 배열의 길이
- 배열의 기본값
- 문자열 배열과 메모리
- 기본 타입 vs 객체
- 배열의 가변성
배열이 왜 필요할까요?
배열은 단일 이름(보통 참조 변수라고 함) 아래에 관련된 값들의 컬렉션을 저장하는 데 사용됩니다.
예를 들어, 친구들의 이름을 저장하고 싶다면 각각의 이름마다 변수를 여러 개 만드는 대신 friendsNames라는 하나의 배열에 모든 이름을 저장할 수 있습니다. 이렇게 하면 코드가 더 체계적이고 확장 가능하며 작업하기 쉬워집니다.
배열을 떠올릴 때 저는 선반 위에 놓인 빈 상자들을 생각합니다. 각 상자는 고정된 위치 번호를 가지고 있으며, 그 상자마다 관련된 항목을 하나씩 넣을 수 있습니다. 이러한 사고 모델은 인덱스가 예측 가능한 패턴을 따른다는 것을 알기 때문에 나중에 반복문을 작성할 때 도움이 됩니다.
배열이란 무엇인가?
일반적으로 사용되는 배열에 대한 정의는 다음과 같습니다:
배열은 동일한 데이터 타입의 요소들을 연속된 메모리 위치에 저장한 컬렉션이다.
이 정의는 C와 C++와 같은 저수준 언어에 대해 완전히 정확합니다. 그러나 배열의 내부 구현은 프로그래밍 언어마다 다를 수 있습니다.
“연속(Contiguous)”이라는 말은 슬롯들이 메모리에서 나란히 배치되어 있다는 의미입니다. 이점은 빠른 임의 접근이 가능하다는 것으로, 인덱스 i 로 점프하는 것이 프로그램이 정확한 메모리 주소를 계산할 수 있기 때문에 빠릅니다. 단점은 크기 조정이 보통 새로운 배열을 만들고 항목들을 복사하는 작업을 의미한다는 점입니다.
Java의 배열
- Java에서 배열은 하나의 데이터 타입만 저장할 수 있어 배열이 동질적입니다.
- Java의 배열은 객체이며, 힙 메모리에 생성됩니다.
- 원시 데이터 타입(
int,double등)의 경우, 값이 배열 객체 내부에 연속적으로 저장됩니다. - 참조 타입(
String,Object등)의 경우, 배열은 연속적인 참조를 저장하고 실제 객체는 힙의 서로 다른 위치에 있을 수 있습니다.
String[] names가 실제로는 참조를 보관한다는 것을 기억하면 좋습니다. names[0] = "Bob"을 변경하면 해당 슬롯이 가리키는 String 객체가 바뀔 뿐이며, 기본 String 객체를 다른 곳으로 이동하거나 복사하지 않습니다.
파이썬의 배열
- Python은 기본적으로 전통적인 배열을 제공하지 않습니다.
- Python에서 일반적으로 사용되는 것은 list, different data types를 저장할 수 있습니다.
- 파이썬 list는 references to objects를 저장하며, 원시 값 자체는 저장하지 않습니다.
파이썬 list는 동적이기 때문에, 요소를 추가하는 것이 손쉽게 느껴집니다. 런타임은 필요할 때 조용히 재할당하고 복사합니다. 이는 초보자에게 친절하지만, 고정‑size Java 배열에 비해 리스트가 성장하는 비용을 숨기기도 합니다.
Java에서 배열의 구문
datatype[] arrayName = new datatype[size];
설명
| 기호 | 의미 |
|---|---|
datatype | 배열이 저장할 수 있는 요소의 타입을 지정합니다 |
[] | 변수가 배열 타입임을 나타냅니다 |
arrayName | 배열 객체를 가리키는 참조 변수 |
new | 힙에 배열 객체를 생성하는 데 사용됩니다 |
datatype[size] | 배열이 가질 수 있는 데이터 타입과 요소 개수를 지정합니다 |
처음 이 코드를 쓸 때 []의 위치가 헷갈렸습니다. datatype[] arrayName과 datatype arrayName[] 모두 Java에서 컴파일되지만, 저는 첫 번째 스타일을 고수합니다. 왜냐하면 “arrayName은 datatype의 배열이다”라고 읽히기 때문입니다. 크기는 생성 시에 고정됩니다.
Java 배열 규칙
- 참조 변수 이름은 일반 변수와 동일한 명명 규칙을 따라야 합니다.
- 배열의 모든 요소는 동일한 데이터 타입이어야 합니다.
- 배열은 생성된 후 크기가 고정되며 변경할 수 없습니다.
크기가 변하는 것이 필요하다고 생각되면 대신 ArrayList를 사용합니다. 일반 배열에만 집중하는 것은 인덱싱을 배우고 고정 크기 저장소가 예상되는 면접 스타일 질문에 대비하는 데 좋은 연습이 됩니다.
선언 및 초기화
datatype[] arr; // declaration
arr = new datatype[size]; // initialization
- 선언 중에 참조 변수가 생성됩니다.
- 초기화 중에 배열 객체가 힙에 생성됩니다.
- 선언은 컴파일 시점에 검사됩니다.
- 배열에 대한 메모리 할당은 런타임에 이루어집니다.
쉽게 저지르는 실수: arr이 초기화되기 전에 arr[0]을 호출하면 참조가 아무것도 가리키지 않기 때문에 NullPointerException이 발생합니다. 선언만으로는 박스가 생성되지 않으며 초기화가 해야 한다는 점을 계속 스스로에게 상기시킵니다.
배열 생성 예시
int[] nums = {1, 2, 3, 4, 5, 6};
이 코드는 6개의 요소를 포함하는 정수 배열을 생성하고 초기화합니다.
중괄호를 사용해 선언할 때마다, 나는 va…를 읽습니다 (원본 텍스트가 여기서 갑자기 끝납니다).
배열에서 인덱싱
인덱싱은 배열의 요소에 접근할 때 사용됩니다.
- Java에서 배열 인덱싱은 0부터 시작합니다.
- 첫 번째 요소는 인덱스
0에 저장됩니다.
예시
int[] num = {2, 7, 8};
-
num[0]→2 -
num[1]→7 -
num[2]→8 -
배열의 길이 =
3 -
마지막 인덱스 =
length - 1 = 2
많은 초보자들이 배열의 길이와 마지막 인덱스를 혼동하지만, 둘은 동일하지 않습니다.
마지막 인덱스보다 큰 인덱스에 접근하려고 하면, Java는 ArrayIndexOutOfBoundsException이라는 예외를 발생시킵니다.
루프 범위를 작성하기 전에 아직도 멈칫합니다:
for (int i = 0; i
추가 자료
- GeeksforGeeks 배열 소개
- W3Schools Java 배열 개요
- freeCodeCamp 배열 기본 가이드
여기까지 오셨다면, 함께 배워 주셔서 감사합니다. 저는 여전히 이것을 실험 노트처럼 다루고 있습니다: 간단한 그림, 작은 코드 조각, 그리고 진행 중에 발견한 솔직한 실수들. 혹시 빠진 부분을 발견하거나 초보자에게 친절한 좋은 자료가 있다면 알려 주세요. 이 저널을 계속 개선하고 싶습니다.