✅ 배열의 개념
- 배열(array) 은 같은 자료형의 데이터를 여러 개 저장할 수 있는 변수 집합
- 쉽게 말해, **"같은 타입의 값들을 하나의 변수에 줄 세워 놓은 것"**
✅ 주요 포인트
🔹 1. 배열은 같은 타입만 저장 가능
- int[] 배열이면 정수만
- double[] 배열이면 실수만
🔹 2. 배열은 인덱스(index) 를 통해 접근
- 인덱스는 0부터 시작
- 예: arr[0], arr[1], arr[2] …
✅ 이미지 설명
▶ int형 배열
- 값: 2, 4, 6, 8, 10
- 인덱스: [0] [1] [2] [3] [4]
- 예: arr[2] = 6

▶ double형 배열
- 값: 2.1, 3.2, 2.7, 4.6, 9.8
- 인덱스: [0] [1] [2] [3] [4]
- 예: arr[3] = 4.6

📝 요약 정리
배열이란? | 같은 자료형의 데이터를 저장하는 변수 모음 |
특징 | 인덱스로 각 요소에 접근 (0부터 시작) |
사용 이유 | 변수 여러 개 만들 필요 없이 한 번에 처리 가능 |
✅ arr이 뭐야?
👉 arr는 배열의 이름(변수 이름)
예를 들어,

여기서:
- int[] → 정수형 배열 선언
- arr → 배열의 이름(변수명)
- {2, 4, 6, 8, 10} → 배열에 들어갈 값들
즉, arr는 정수들을 담고 있는 상자 이름
🔍 arr를 사용하는 방법
- arr[0] → 첫 번째 값 (2)
- arr[1] → 두 번째 값 (4)
- arr[2] → 세 번째 값 (6)

🔍 배열 값 꺼내 쓰기
✅ int[] vs double[] 배열
저장 타입 | 정수 (1, 2, 3 ...) | 실수 (1.0, 2.5, 3.14 ...) |
선언 예시 | int[] scores = {90, 80, 100}; | double[] temps = {36.5, 37.0}; |
사용할 때 | 정수만 필요할 때 사용 | 소수점까지 표현할 때 사용 |
📦 먼저 배열 선언을 이렇게 했다고 가정함:
✅ int 배열 선언 예시

이건 정수형 배열이고, 안에 숫자 5개가 들어 있음
0 | 2 |
1 | 4 |
2 | 6 |
3 | 8 |
4 | 10 |
✅ 그럼 아래 내용은 이렇게 읽으면 됨
- arr[0] → 배열의 0번째 위치 값 = 2
- arr[1] → 배열의 1번째 위치 값 = 4
- arr[2] → 배열의 2번째 위치 값 = 6
✅ 코드 해석

👉 이건 arr 배열의 2번째 값(6) 을 출력하라는 뜻
(※ 2번째가 아니라 인덱스 2번, 즉 세 번째 값!)
❗ 왜 2번째가 아니라 3번째 값이 나올까?
배열은 항상 0번부터 시작하기 때문!
배열의 인덱스 | [0] | [1] | [2] | ... |
🧠 이해 팁
📌 arr[x]는 배열 안에서 x번째 인덱스 위치의 값을 꺼낸다고 이해하면 됨.
🧠 쉽게 비유하자면
arr = 책꽂이
arr[0], arr[1] = 책꽂이에 꽂힌 책 하나하나
✅ double 배열 선언 예시

➡ prices는 실수(소수점 있는 값들)를 저장하는 배열
int 배열처럼 인덱스를 사용하지만, 값만 소수라는 차이!
✅ 코드 비교 예
📌 정수 배열

📌 실수 배열
📌 정리
- int[] → 정수 배열
- double[] → 실수 배열
- 배열 이름은 자유롭게 정할 수 있고, []는 자료형 뒤에 붙여서 배열임을 표시
필요하면 arr 이름을 바꿀 수도 있음

➡ 이 경우 배열 이름은 scores
✅ 배열 이름은 개발자가 정하는 것!
예를 들어:

✅ 배열 이름 예시
arr | 아무 이름, 보통 예제에서 씀 |
scores | 점수 목록 |
ages | 나이 목록 |
numbers | 숫자 목록 |
grades | 성적 목록 |
values | 값 목록 |
data | 데이터 목록 |
list | 일반적인 리스트 |
prices | 가격 목록 |
names | 이름 목록 |
answers | 답안 목록 |
📌 중요한 건
배열 이름은 "그 배열이 어떤 걸 담고 있는지" 알아보기 쉽게 짓는 게 좋음!
👉 예: 학생 점수면 scores, 상품 가격이면 prices
✅ 배열은 인덱스로 구분한다는 뜻은?
배열에 있는 각 값(요소) 들은
고유한 번호(인덱스) 로 구분돼.
📌 인덱스는 0번부터 시작해서,
배열 안에 들어간 순서대로 번호가 붙어.
✅ 그래서 "중복"이 가능하다?
맞아! 값이 같아도 인덱스가 다르면
완전히 다른 자리로 인식돼.
👉 즉, 같은 값이 여러 번 들어가도 전혀 문제 없음!
🔍 예제

이 배열에는 10이라는 값이 3번 나와. 하지만 문제 없음!
0 | 10 |
1 | 20 |
2 | 10 |
3 | 30 |
4 | 10 |
여기서 10이라는 값은 중복되지만,
[0], [2], [4] 각각 인덱스가 다르기 때문에 전혀 헷갈리지 않아.
✅ 핵심 요약
인덱스 | 배열 안에서 각 값을 구분하는 번호 (0번부터 시작) |
중복 가능 | 값이 같아도 위치(인덱스) 가 다르면 문제 없음 |
🧠 비유로 이해하자면:
같은 책이 3권 있어도, 책꽂이 위치(0번칸, 2번칸, 4번칸)가 다르면 구분할 수 있는 거야!
✅ 배열을 사용할 때 알아둬야 할 중요 포인트 정리
🔹 1. 모든 배열은 동적으로 할당됨
- 배열은 선언만으로 끝나는 게 아니라, 반드시 new 키워드나 값으로 공간을 할당해야 함.

🔹 2. 배열의 길이는 .length 로 계산함
- 배열에 몇 개의 값이 들어 있는지 알고 싶을 땐 .length 사용

🔹 3. 배열 변수는 자료형 뒤에 대괄호([]) 를 붙여 선언

👉 일반 변수와 구분을 위해 []가 꼭 붙음
🔹 4. 배열 내부 인덱스는 0부터 시작

👉 항상 0번부터 시작, 실수로 arr[3] 같은 인덱스 초과 접근하면 오류 발생!
🔹 5. 배열은 정적 필드, 지역 변수, 매개변수로 사용 가능
- 클래스의 멤버 변수로도 사용 가능
- 함수의 매개변수로도 전달 가능

📘 5. 배열은 정적 필드, 지역 변수, 매개변수로 사용 가능
🔹 이건 무슨 뜻이야?
배열은 다양한 위치에서 쓸 수 있다는 걸 말함
① 정적 필드(static 변수)
클래스 전체에서 공유하는 배열

② 지역 변수(local variable)
메서드 안에서만 사용하는 배열

③ 매개변수(parameter)
배열을 메서드의 인자로 넘기는 경우

이걸 호출할 땐 이렇게 함👇

✨ 요약
배열 인덱스 | 0부터 시작, 최대 인덱스는 배열.length - 1 |
배열 위치 | 정적 필드, 지역 변수, 함수 매개변수로 모두 사용 가능 |
주의할 점 | 인덱스를 잘못 쓰면 오류(ArrayIndexOutOfBoundsException) 발생 |
🧠 요약정리
시작 인덱스 | 0부터 시작함 |
길이 | .length |
선언 방법 | 자료형[] 변수명 |
크기 지정 | int 타입만 가능 |
어디서 사용 가능? | 필드, 지역변수, 매개변수 |
상속 구조 | Object 클래스의 자식 |
지원 기능 | 복사(Cloneable), 저장(Serializable) 가능 |
🔹 6. 배열 크기는 int로 지정해야 함
- long, short 타입으로는 안 됨 ❌

🔹 7. 배열의 슈퍼클래스는 Object
- 자바에서 모든 배열은 Object의 자식 클래스로 취급됨

무슨 말이야?
자바에서 모든 배열은 Object 클래스의 자식 클래스처럼 취급된다는 뜻

- int[] 도 사실 자바에서는 하나의 객체(Object) 라는 뜻
- 그래서 arr instanceof Object → true (배열도 객체이기 때문!)
💡 즉, 배열도 new 키워드로 만든 "객체"고, 자바에서 Object 클래스의 기능을 일부 쓸 수 있어!
✅ instanceof란?
"이 객체가 어떤 클래스(또는 인터페이스)의 인스턴스인지 확인하는 연산자"
📌 문법

- 👉 결과는 true 또는 false (논리값)
🎯 예제 1: 기본 클래스 비교

🎯 예제 2: 배열도 사용 가능

💡 언제 쓰이냐면?
- 객체가 null이 아닌지 + 타입이 맞는지 확인할 때
- 다형성(부모타입 → 자식타입) 캐스팅 전에 타입 체크할 때
⚠️ 주의할 점

→ null은 어떤 타입에도 해당하지 않기 때문에 false야!
🧠 한 줄 요약
instanceof =
"이 객체가 저 클래스(또는 인터페이스)에서 만들어진 거 맞아?"
→ 맞으면 true, 아니면 false
🔹 8. 배열은 Cloneable과 Serializable 인터페이스를 구현
- 즉, 배열은 복사 가능하고, 저장용 객체로도 사용 가능함
(조금 더 고급 기능에서 쓰임)
무슨 뜻이야?
배열은 자바 내부적으로 다음 인터페이스들을 구현하고 있어:
Cloneable | 배열을 복사할 수 있게 해줌 |
Serializable | 배열을 저장/전송용으로 직렬화할 수 있게 해줌 |
예시 설명
✔ Cloneable 덕분에:

✔ Serializable 덕분에:

✨ 정리 요약표
배열은 객체다 | int[] arr instanceof Object → true |
배열은 복사 가능 | Cloneable 덕분에 clone() 가능 |
배열은 직렬화 가능 | Serializable 덕분에 저장/전송 가능 |
🔍 한 줄씩 쉽게 해석해보자
1️⃣ ObjectOutputStream out = new ObjectOutputStream(...)
- ObjectOutputStream: 자바 객체를 **파일에 저장(직렬화)**할 수 있게 해주는 클래스
- 이걸 사용하면 객체, 배열, 리스트 등을 통째로 저장할 수 있음
2️⃣ new FileOutputStream("data.ser")
- FileOutputStream: 실제로 파일을 바이트로 저장해주는 클래스.
- "data.ser": 저장할 파일 이름. 확장자는 .ser (Serialized 의 약자)
→ 너가 만든 객체가 이 파일에 저장됨!
3️⃣ out.writeObject(a);
- a라는 객체를 저장하는 명령어.
- 배열도 저장 가능하고, ArrayList, HashMap 같은 것도 저장 가능함
- 단, a는 Serializable 인터페이스를 구현한 클래스여야 함!
4️⃣ out.close();
- 저장 작업이 끝났으면 스트림을 닫아야 해. 그래야 파일이 정상적으로 마무리됨
💡 예시로 보기

🧠 기억할 포인트
ObjectOutputStream | 객체를 파일에 저장할 때 사용 |
writeObject() | 객체나 배열, 리스트 등을 저장할 수 있음 |
.ser 파일 | 직렬화된 데이터가 들어있는 실제 저장 파일 |
Serializable | 저장 대상 클래스는 반드시 이 인터페이스 구현해야 함 |
🔴 인덱스 오류: ArraysIndexOutOfBoundsException
📌 이 오류는 언제 발생하냐면?
→ 배열의 범위를 벗어난 인덱스에 접근하려고 할 때 발생!
💡 예제 설명 (이미지 기준)
- 배열 이름: even
- 배열 내용: {2, 4, 6, 8, 10}
- 인덱스: [0] [1] [2] [3] [4] 까지만 존재함
→ 즉, 배열의 길이는 5니까
0번부터 4번 인덱스까지만 유효
🚫 그런데 그림에서 뭐가 문제야?

❗ 5번 인덱스는 존재하지 않는데 접근하려고 했음
→ 그래서 프로그램이 ArraysIndexOutOfBoundsException 오류를 발생시킴
→ "배열 범위 벗어났어!" 라는 뜻
📌 정리
배열 길이 | 5 |
유효 인덱스 | 0 ~ 4 |
접근 시도 | even[5] → ❌ 오류 발생 |
오류 이름 | ArraysIndexOutOfBoundsException |
🧠 꿀팁
- 배열 인덱스는 항상 0부터 시작
- 길이보다 1 작은 수까지만 사용 가능!
- 배열.length - 1 이 최대 인덱스
✅ 1차원 배열이란?
- 한 줄로 된 배열 (가로로 나열된 값들)
- 인덱스를 1씩 증가시키면서 값을 꺼낼 수 있어
- 예: int[] myArr = new int[5]; → 정수 5개를 저장할 수 있는 배열
📌 그림 설명
🔹 int[] myArr;
- 👉 배열 선언
- "나는 정수형 배열을 만들 거야!" 라고 선언만 한 상태
- 이때 메모리 공간은 아직 없음
🔹 new int[5];
- 👉 배열 생성
- "정수 5개를 저장할 공간을 만들어줘!"
- 이때 실제 메모리 공간이 확보됨
🔹 int[] myArr = new int[5];
- 선언 + 생성 한 줄에 같이!
- 이제 myArr[0]부터 myArr[4]까지 총 5칸이 생김
- 각 칸에는 기본값 0이 들어있음
💡 중요한 포인트 정리
배열 선언 | int[] myArr; → 배열 이름만 만들었음 |
배열 생성 | new int[5]; → 5개의 공간 확보 |
전체 | int[] myArr = new int[5]; → 선언 + 생성 |
🧠 보너스! 배열에 값 넣기

✅ 1차원 배열 선언

이 문장은 이렇게 구성돼 있음:
int[] | 정수형 배열 자료형 선언 (int 타입의 배열이라는 뜻) |
myArr | 배열 이름 (변수명) |
new int[5] | 정수형 공간 5개를 메모리에 할당하라는 명령 |
🧠 메모리 구조 설명
- new int[5] → 메모리에 정수(int) 5개 크기만큼 공간을 할당
- 각 공간은 인덱스로 구분됨: [0], [1], [2], [3], [4]
- myArr는 이 배열의 시작 주소를 가리키는 참조 변수
📦 메모리 주소 시각화
오른쪽 그림 보면:
- myArr는 0x62fe20이라는 주소를 가지고 있음
- 실제 배열 데이터는 0x62fe34부터 시작하는 메모리 공간에 저장됨
- 즉, myArr는 배열의 시작 위치를 참조하는 포인터 개념과 비슷함
🔍 정리하면!
- 배열을 선언하면 연속된 메모리 공간이 생성되고,
- 변수 myArr는 이 공간을 가리키는 참조 주소를 담고 있어
- myArr[0], myArr[1]처럼 인덱스를 통해 각 공간에 접근할 수 있음
✅ 2차원 배열 선언

이 구문은 다음처럼 구성돼 있음
int[][] | 정수형 2차원 배열 선언 (행 x 열) |
myArr | 배열 이름 (변수명) |
new int[3][4] | 3행 4열 크기의 배열을 메모리에 생성 |
즉, 총 3 x 4 = 12개의 int 타입 공간을 연속된 메모리에 할당한다는 뜻
🧠 메모리 구조
🧱 배열 구조

총 3행 4열, 총 12칸의 2차원 배열 형태
🧾 메모리 주소 구조
오른쪽 그림을 보면:
- myArr는 배열이 저장된 위치를 참조(가리킴) 하고 있음
- myArr 자체는 0x62fe20 주소에 저장돼 있고,
- 실질적인 배열 데이터는 0x62fe34부터 연속된 공간에 저장돼 있음
🎯 정리
- int[][]는 2차원 배열 (행렬) 선언
- new int[3][4]는 3행 4열짜리 배열을 메모리에 만들고
- myArr는 이 배열의 시작 주소를 가지고 있음
- 자바에서는 실제로는 배열 내부 배열도 각각 객체이기 때문에, 2차원 배열은 배열의 배열(Array of arrays) 이지만, new int[3][4] 같이 고정된 형태일 땐 연속된 메모리 구조처럼 볼 수 있음
#자바 #Java기초 #배열 #자바배열 #for문 #반복문 #자바반복문 #기초프로그래밍 #자바공부 #자바예제 #배열출력 #자바입문 #프로그래밍기초 #코딩연습 #Java배열 #Systemoutprintln #코딩기초 #Java배우기 #자바코드 #개발자공부
#자바 #자바학습 #자바기초 #자바프로그래밍 #자바언어 #자바기초학습 #자바배우기 #자바개발 #자바코딩 #자바문법 #자바배열 #자바클래스 #자바객체지향 #자바메서드 #자바변수 #자바조건문 #자바반복문 #자바예제 #자바튜토리얼 #자바개발자