Java - 클래스(Class)

develkkm·2025년 9월 10일

0부터 시작하는 Java

목록 보기
10/27

클래스와 데이터


클래스가 필요한 이유

자바의 세상은 클래스와 객체로 이루어져 있다.
학생 정보를 다루는 예시를 통해 클래스를 왜 도입해야 하는지 살펴보자.

변수만 사용했을 때

String student1Name = "학생1";
int student1Age = 15;
int student1Grade = 90;

String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 80;

System.out.println("이름:" + student1Name + " 나이:" + student1Age + " 성적:" + student1Grade);
System.out.println("이름:" + student2Name + " 나이:" + student2Age + " 성적:" + student2Grade);

학생이 늘어날 때마다 변수를 추가해야 하고, 출력 코드도 계속 늘어난다.

배열을 사용했을 때

String[] studentNames = {"학생1", "학생2"};
int[] studentAges = {15, 16};
int[] studentGrades = {90, 80};

for (int i = 0; i < studentNames.length; i++) {
    System.out.println("이름:" + studentNames[i] + " 나이:" + studentAges[i] + " 성적:" + studentGrades[i]);
}

배열 덕분에 반복문을 적용할 수 있게 되었지만, 한 학생의 정보가 세 개의 배열에 분리되어 있어 관리가 불편하다.


클래스 도입

학생의 정보를 하나로 묶기 위해 Student 클래스를 정의한다.

package class1;

public class Student {
    String name;
    int age;
    int grade;
}

이제 학생 객체를 생성해서 데이터를 담을 수 있다.

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;

System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성적:" + student2.grade);

클래스, 객체, 인스턴스

  • 클래스(Class): 객체를 생성하기 위한 설계도 (예: Student)
  • 객체(Object): 클래스에서 정의한 속성과 기능을 가진 실체
  • 인스턴스(Instance): 특정 클래스에서 생성된 객체

모든 인스턴스는 객체이지만, 특정 클래스에서 나왔음을 강조할 때 인스턴스라고 한다.


클래스가 어떻게 작동하는가?

클래스를 이해하려면 객체가 생성되는 과정을 살펴보는 것이 중요하다.

1. 변수 선언

Student student1;

Student 타입의 변수를 선언한다.
이는 정수를 담는 int, 문자를 담는 String과 비슷하게, Student라는 타입의 객체를 담을 수 있는 공간을 만든 것이다.


2. 객체 생성

student1 = new Student();
  • new 키워드는 새로운 객체를 생성한다는 의미다.
  • new Student()를 실행하면 설계도(Student 클래스)를 기반으로 메모리에 실제 객체가 만들어진다.
  • 이 과정에서 name, age, grade에 필요한 메모리 공간도 확보된다.

3. 참조값 보관

Student student1 = new Student();
  • 객체가 생성되면 자바는 해당 객체의 메모리 주소(참조값)를 반환한다.
  • 그 참조값을 student1 변수에 보관한다.
  • 따라서 student1은 객체 자체가 아니라 객체의 위치(참조값)를 저장한다.
student1 → x001 (참조값) → 실제 Student 객체

즉, student1을 통해 메모리에 있는 실제 객체에 접근할 수 있게 된다.


4. 멤버 변수 접근

객체에 접근할 때는 .(dot) 연산자를 사용한다.

student1.name = "학생1";
student1.age = 15;
student1.grade = 90;

System.out.println(student1.name);

동작 순서:
1. student1이 가진 참조값(x001)을 읽는다.
2. 참조값이 가리키는 실제 객체에 접근한다.
3. 객체 안의 name, age, grade 멤버 변수에 접근하거나 값을 읽고 쓴다.


출력 시 참조값 확인

객체 변수를 그대로 출력하면 참조값이 나온다.

System.out.println(student1);

예시 출력:

class1.Student@7a81197d
  • class1.Student: 패키지와 클래스 이름
  • @7a81197d: 객체의 참조값(16진수)

배열과 클래스 함께 사용

클래스와 배열을 결합하면 여러 객체를 손쉽게 관리할 수 있다.

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;

Student[] students = {student1, student2};

for (Student s : students) {
    System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}

배열에는 객체 자체가 아니라 객체의 참조값이 들어간다.
따라서 배열을 통해서도 각 객체에 접근할 수 있다.

profile
알던것을 더 확실하게

0개의 댓글