CHAPTER 05. 배열 (Array)
1. 배열이란?
- What
배열(Array)은 같은 타입의 여러 데이터를 하나의 이름으로 연속된 메모리 공간에 저장하는 자료구조이다. - Why
많은 데이터를 일일이 변수로 선언할 수 없으므로,
같은 종류의 데이터를 효율적으로 저장, 관리, 반복 처리하려면 배열이 꼭 필요하다. - How
int[] nums = new int[5]; // int가 5개 저장되는 배열 nums[0] = 10; nums[1] = 20; // 값 저장 및 사용
2. 배열의 선언, 생성, 초기화
(1) 선언
- What
배열 변수의 타입과 이름을 선언한다. - Why
배열을 사용하려면 먼저 변수(참조형)를 선언해야 한다. - How
int[] arr; // 권장 double[] scores; String[] names;
(2) 생성
- What
new 키워드로 실제 배열(메모리 공간)을 만든다. - Why
배열 변수는 참조형이기 때문에
반드시 new로 실제 배열 객체를 만들어야
데이터 저장이 가능하다. - How
arr = new int[5]; // 5칸짜리 int 배열 생성 String[] students = new String[3];
(3) 선언과 생성, 초기화 한번에
- What
배열 선언과 동시에 크기, 값도 지정할 수 있다. - Why
배열을 빠르게 초기화하고,
코드의 가독성과 편의성을 높일 수 있다. - How
int[] nums = new int[4]; // 0,0,0,0 int[] nums2 = {10, 20, 30, 40}; // 직접 값 할당 String[] fruits = {"사과", "바나나", "포도"};- 초보 주의
- 배열 생성 시 크기는 반드시 지정(생략 불가),
한 번 정해진 배열의 크기는 변경 불가. - 배열 요소의 기본값: 정수형 0, 실수형 0.0, boolean false, 참조형 null
- 배열 생성 시 크기는 반드시 지정(생략 불가),
3. 배열의 인덱스와 사용법
- What
배열은 0번부터 (길이-1)번까지 인덱스를 가진다. - Why
각 요소에 빠르고 정확하게 접근하려면
인덱스가 꼭 필요하다. - How
int[] scores = {90, 80, 70}; System.out.println(scores[0]); // 90 scores[2] = 100; // 값 변경- 초보 주의
- 존재하지 않는 인덱스(음수, 길이 이상)를 사용하면
ArrayIndexOutOfBoundsException(런타임 오류) - 배열의 길이는 배열이름.length로 구함 (메서드 아님, 괄호 없음)
System.out.println(scores.length); // 3
- 존재하지 않는 인덱스(음수, 길이 이상)를 사용하면
4. 배열과 반복문
- What
배열의 각 요소를 차례대로 처리할 때 for, while 같은 반복문을 사용한다. - Why
배열은 여러 값을 저장하므로
반복문과 함께 쓰면 모든 값을 쉽게 처리(출력, 합계, 검색 등)할 수 있다. - How
int[] arr = {10, 20, 30, 40}; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }- 향상된 for문 (for-each문)
- What: 배열(또는 컬렉션)의 모든 요소를 처음부터 끝까지 반복
- Why: 인덱스 없이 더 간단하게 전체 탐색이 가능하다.
- How
for (int num : arr) { System.out.println(num); }- 초보 주의: 인덱스가 필요할 때는 일반 for문 사용
5. 다차원 배열
- What
배열의 배열(2차원 이상) — 표(행렬), 바둑판, 좌표 등 표현 - Why
여러 줄, 여러 열로 이뤄진 데이터를 체계적으로 저장하려면
다차원 배열이 필요하다. - How
- 선언/생성/초기화 한번에
int[][] map = { {1, 2}, {3, 4}, {5, 6} };
int[][] matrix = new int[2][3]; // 2행 3열 matrix[0][1] = 10;- 초보 주의
- 각 행의 열 개수가 다를 수도 있다 (비정방 배열)
int[][] jagged = { {1,2}, {3,4,5}, {6} };
6. 배열 복사
- What
기존 배열의 값을 새로운 배열로 옮기는 것(깊은 복사). - Why
배열은 한 번 생성하면 크기 변경 불가.
더 큰 배열로 확장, 데이터 유지 등
다양한 상황에서 복사가 필요하다. - How
- for문 직접 복사
int[] oldArr = {1,2,3}; int[] newArr = new int[5]; for (int i = 0; i < oldArr.length; i++) { newArr[i] = oldArr[i]; }- System.arraycopy()
System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
- 초보 주의
- 배열 변수끼리 단순 대입(
arr2 = arr1)은
배열 전체 복사가 아니라, 같은 배열(주소값)만 참조(얕은 복사).
- 배열 변수끼리 단순 대입(
7. 배열 관련 주요 에러/주의점
- What/Why
배열은 참조형이므로,- 인덱스 범위 초과(ArrayIndexOutOfBoundsException)
→ 프로그램이 강제 종료될 수 있음 - 배열 변수는 참조값(주소)만 저장
→==은 주소 비교, 값 비교는 Arrays.equals() - 배열 크기는 고정(늘리려면 새 배열 생성/복사)
- String[]은 각 요소가 문자열 참조값
- 인덱스 범위 초과(ArrayIndexOutOfBoundsException)
8. 포인트
- 배열 선언/생성/초기화 방법 3가지와 그 이유
- 인덱스, .length, 인덱스 범위 초과 에러의 원인과 예방
- 배열은 참조형(==, equals 차이, 복사 방식)인 이유
- 2차원 배열 선언/초기화 방법과 비정방 배열을 쓰는 이유
- for-each문과 일반 for문의 차이점과 각각의 쓰임새
- 배열 복사(깊은/얕은 복사), System.arraycopy()를 쓰는 이유
CHAPTER 06. 클래스 (Class)
1. 클래스란?
- What
클래스(Class)는 객체(Object)를 만들기 위한 설계도(틀)이며,
필드(속성), 메서드(기능), 생성자 등으로 구성된다. - Why
많은 객체를 체계적으로 만들고,
데이터(속성)와 기능(메서드)을 하나로 묶어서
코드의 재사용성과 유지보수성을 높이기 위해 꼭 필요하다. - How
class Student { String name; int age; void study() { System.out.println(name + "이(가) 공부합니다."); } }
2. 객체(Object)란?
- What
클래스로부터 실제로 만들어진 실체(메모리 공간을 차지하는 데이터 덩어리). - Why
프로그램에서 현실 세계의 사물(학생, 자동차 등)을 직접 표현하고 다루기 위해
객체가 반드시 필요하다.
객체는 각각 독립적으로 상태(필드 값)를 가진다. - How
Student s1 = new Student(); // 객체 생성 s1.name = "홍길동"; s1.age = 20; s1.study(); // 홍길동이(가) 공부합니다.
3. 클래스의 구성 요소
(1) 필드(Field, 멤버 변수)
- What
클래스 내부에 선언된 변수로, 객체가 가질 수 있는 데이터(속성)를 저장한다. - Why
객체의 개별 상태(이름, 나이 등)를 저장하고 관리하기 위해 필요하다. - How
class Person { String name; // 이름(필드) int age; // 나이(필드) }
(2) 메서드(Method)
- What
클래스가 제공하는 동작(기능)을 정의한 함수. - Why
객체가 어떤 행동을 할 수 있는지(예: 계산, 출력 등)를 코드로 구현하기 위해 필요하다. - How
class Calculator { int add(int a, int b) { return a + b; } }
(3) 생성자(Constructor)
- What
객체 생성 시 자동으로 호출되어
필드 초기화 등 객체의 초기 상태를 지정하는 특수한 메서드. - Why
객체가 생성될 때 반드시 필요한 값(초기값 등)을 안전하게 세팅하기 위해 필요하다.
생성자 없이 객체를 만들면, 필드값이 잘못되거나 누락될 위험이 크다. - How
class Dog { String name; Dog(String n) { // 생성자 name = n; } } Dog d = new Dog("멍멍이"); // 객체 생성 시 이름 초기화- 초보 주의
- 생성자 이름은 클래스명과 같아야 하고, 리턴 타입이 없다.
- 생성자를 하나도 안 만들면, 자바가 기본 생성자(매개변수 없는 것)를 자동 제공.
4. 객체의 생성과 사용
- Why
클래스를 실제로 사용하려면
반드시 new 키워드로 객체를 만들어야 하며,
이렇게 만들어진 객체만이 메모리에 데이터와 기능을 가진다. - How
Car myCar = new Car(); // 객체 생성 myCar.speed = 100; // 필드 값 설정 myCar.run(); // 메서드 사용
5. 객체 배열
- What
같은 클래스 타입의 객체 여러 개를 배열로 저장하는 것. - Why
학생 여러 명, 자동차 여러 대 등
같은 종류의 객체를 일괄 관리하려면 객체 배열이 꼭 필요하다. - How
Student[] arr = new Student[3]; // 3칸짜리 객체 배열 arr[0] = new Student(); // 각 칸마다 new로 객체 생성 필요 arr[1] = new Student(); arr[2] = new Student();- 초보 주의
- 배열만 만들면 각 칸이 null 상태이므로
반드시 각 칸마다 new로 객체를 생성해야 한다.
- 배열만 만들면 각 칸이 null 상태이므로
6. 클래스와 객체 관련 용어 정리
- 인스턴스(Instance):
클래스로부터 실제로 만들어진 '객체'를 가리킨다. - 멤버(Member):
클래스에 속한 필드, 메서드, 생성자 등 모든 구성 요소의 총칭. - 참조 변수:
객체의 메모리 주소(참조값)를 저장하는 변수. - this:
현재 객체 자기 자신을 가리키는 키워드(필드와 매개변수 이름이 같을 때 구분).
7. 접근 제어자 (Access Modifier) - 기초
- What
클래스의 멤버(필드, 메서드 등)에 대한 접근(사용) 허용 범위를 지정하는 키워드. - Why
데이터 은닉, 정보 보호(캡슐화) 등
객체지향 원칙을 지키기 위해 반드시 필요하다. - 종류
- public: 어디서나 접근 가능
- default(생략시): 같은 패키지 내에서만 접근 가능
- private: 클래스 내부에서만 접근 가능(외부에서 직접 접근 불가)
8. 포인트
- 클래스(설계도)와 객체(실체)의 차이와 관계
- 클래스의 구성 요소(필드/메서드/생성자)와 각각의 역할/필요성
- 생성자의 특징(이름, 리턴 타입 없음, 오버로딩 가능, 기본 생성자 자동 제공)
- 객체 배열 생성 시 각 칸마다 new로 객체 생성 필요
- 접근 제어자 기본 사용법 및 구분(특히 public/private)
- this의 의미와 사용 예시
'JS' 카테고리의 다른 글
| # 클래스와 다형성 개념 정리 (0) | 2025.05.14 |
|---|---|
| 2~3장 예상 문제 (0) | 2025.05.12 |
| [25.05.09 롤링 대비] 2장~4장 (0) | 2025.05.08 |
| 전체 반복 구조 (구구단 틀)/System.out.printf과 System.out.println의 차이 (0) | 2025.05.01 |
| [시험대비JS] 탭 2 (forEach) X -> 카드 한장 전용. 중지. (0) | 2025.04.26 |