프로그래밍/JAVA

java 배열 / 1차열 배열

Cognivox 2025. 4. 4. 12:40
반응형

✅ 배열의 개념

  • 배열(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[] 배열

항목                       int배열                 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번부터 시작하기 때문!

우리가 생각하는 순서1번째2번째3번째...
배열의 인덱스 [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개를 메모리에 할당하라는 명령

🧠 메모리 구조 설명

  1. new int[5] → 메모리에 정수(int) 5개 크기만큼 공간을 할당
  2. 각 공간은 인덱스로 구분됨: [0], [1], [2], [3], [4]
  3. 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배우기 #자바코드 #개발자공부

#자바 #자바학습 #자바기초 #자바프로그래밍 #자바언어 #자바기초학습 #자바배우기 #자바개발 #자바코딩 #자바문법 #자바배열 #자바클래스 #자바객체지향 #자바메서드 #자바변수 #자바조건문 #자바반복문 #자바예제 #자바튜토리얼 #자바개발자

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

java 상수란?  (0) 2025.04.07
java 용어 2  (0) 2025.04.04
java 반복문  (0) 2025.04.03
java 조건문  (0) 2025.04.02
java 연산자  (0) 2025.04.01