자바 세계는 클래스(Class)와 객체(Object)로 이루어져 있다. 클래스는 단순히 문법이 아니라, 프로그램을 구조화하고 유지보수하기 위한 핵심 개념이다. 이번 글에서는 변수와 배열만으로는 해결할 수 없는 문제를 클래스가 어떻게 해결하는지 살펴보고, 객체·인스턴스의 개념까지 정리해보겠다.
클래스가 필요한 이유
문제: 학생 정보 관리
String student1Name = "학생1";
int student1Age = 15;
int student1Grade = 90;
String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 80;
학생이 늘어날수록 변수도 기하급수적으로 늘어난다. → 유지보수를 한다고 생각하면 끔찍하다.
배열의 도입과 한계
String[] names = {"학생1", "학생2"};
int[] ages = {15, 16};
int[] grades = {90, 80};
- 배열을 쓰면 반복문으로 출력할 수 있어 코드가 단순해진다.
- 하지만 한 학생의 데이터가 여러 배열에 분리되어 관리된다는 단점이 있다.
- 한 학생의 데이터를 수정하려다 다른 값을 수정하게 될 수 있으며 이는 곧 인덱스 불일치 문제로 이어진다.
- 즉, 데이터 무결성 깨질 위험이 있다.
- 우리에게는 "학생"이라는 개념 자체를 하나의 단위로 묶는 방법이 필요하다.
클래스의 도입
public class Student {
String name;
int age;
int grade;
}
- class 키워드로 새로운 데이터 타입(사용자 정의 타입)을 정의할 수 있다.
- 클래스에 포함된 변수를 멤버 변수(필드, Field)라고 한다.
- 이제 학생은 Student라는 타입으로 관리할 수 있게 되었다.
객체 생성과 사용
Student student1 = new Student();
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
- 참조값을 변수에 저장해 객체 접근 (student1.name)
- 변수에 저장되는 것은 객체 자체가 아니라 참조값(주소)이다.

- Student 클래스 정보를 기반으로 new 키워드로 메모리에 새로운 Student 객체를 생성한다.
- 이때 Student 클래스의 멤버 변수를 사용하는 데 필요한 메모리 공간도 함꼐 확보된다.
- 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)을 반환한다.
- 이 반환된 참조값이 선언된 변수인 student1에 저장된다.
참조값을 변수에 보관해야 하는 이유
객체를 생성하는 new Student() 코드 자체에는 아무런 이름이 없다.
생성된 객체에 접근하기 위해 참조값을 어딘가에 보관해두어야 하고, 그 장소가 바로 변수인 것이다.
클래스, 객체, 인스턴스
- 클래스(Class): 설계도 (예: Student)
- 객체(Object): 실제 메모리에 만들어진 실체 (예: student1)
- 인스턴스(Instance): 특정 클래스에서 생성된 객체를 지칭할 때 사용
- 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지를 강조할 때 사용한다.
- student1은 객체이면서 동시에 Student 클래스의 인스턴스인 셈이다.
- 인스턴스는 좀 더 관계에 초점을 맞춘 단어이다. (예) student1은 Student의 인스턴스이다.
- 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때이다.
배열과 클래스의 결합
Student[] students = new Student[2];
students[0] = student1;
students[1] = student2;
for (Student s : students) {
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}
- 배열 + 클래스 → 대량의 데이터도 깔끔하게 관리할 수 있다.
- 향상된 for문(for-each)을 활용하면 가독성이 극대화된다.
정리하자면...
- 배열만으로는 데이터 무결성을 보장하기 어려움
- 클래스는 데이터와 관련 속성을 하나의 단위로 묶어줌
- 객체(인스턴스)를 통해 실제 데이터를 다룸
- 배열과 함께 쓰면 대량 데이터도 깔끔히 처리 가능
클래스는 단순한 문법이 아니라, 데이터를 사람이 이해하기 좋은 구조로 바꾸는 도구이다.
이 단계부터 자바는 절차지향을 넘어서 객체지향 프로그래밍(OOP)으로 들어간다.
'java' 카테고리의 다른 글
| Java 객체 지향 프로그래밍(OOP) 정리 (0) | 2025.09.14 |
|---|---|
| Java 기본형(Primitive) vs 참조형(Reference) 정리 (0) | 2025.09.14 |
| Java 메서드(Method) 정리 (0) | 2025.09.10 |
| Java 배열(Array) 정리 (0) | 2025.09.10 |
| Java 스코프(Scope)와 형변환(Type Casting) 정리 (0) | 2025.09.09 |