[25.05.09 롤링 대비] 5장 배열~6장 클래스

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[]은 각 요소가 문자열 참조값

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로 객체를 생성해야 한다.

6. 클래스와 객체 관련 용어 정리

  • 인스턴스(Instance):
    클래스로부터 실제로 만들어진 '객체'를 가리킨다.
  • 멤버(Member):
    클래스에 속한 필드, 메서드, 생성자 등 모든 구성 요소의 총칭.
  • 참조 변수:
    객체의 메모리 주소(참조값)를 저장하는 변수.
  • this:
    현재 객체 자기 자신을 가리키는 키워드(필드와 매개변수 이름이 같을 때 구분).

7. 접근 제어자 (Access Modifier) - 기초

  • What
    클래스의 멤버(필드, 메서드 등)에 대한 접근(사용) 허용 범위를 지정하는 키워드.
  • Why
    데이터 은닉, 정보 보호(캡슐화) 등
    객체지향 원칙을 지키기 위해 반드시 필요하다.
  • 종류
    • public: 어디서나 접근 가능
    • default(생략시): 같은 패키지 내에서만 접근 가능
    • private: 클래스 내부에서만 접근 가능(외부에서 직접 접근 불가)

8. 포인트

  • 클래스(설계도)와 객체(실체)의 차이와 관계
  • 클래스의 구성 요소(필드/메서드/생성자)와 각각의 역할/필요성
  • 생성자의 특징(이름, 리턴 타입 없음, 오버로딩 가능, 기본 생성자 자동 제공)
  • 객체 배열 생성 시 각 칸마다 new로 객체 생성 필요
  • 접근 제어자 기본 사용법 및 구분(특히 public/private)
  • this의 의미와 사용 예시