목록으로

[자바 기초] 8강. 붕어빵 틀과 붕어빵: 클래스(Class)와 객체(Object) 입문

지난 시간 복습과 이번 강의 목표

지난 7강(배열)까지는 데이터를 다루는 **'문법'**을 배웠다면, 오늘부터는 프로그램을 설계하는 **'철학'**을 배웁니다.

지금까지 우리는 학생의 이름과 점수를 따로 관리했습니다.

String[] names = {"철수", "영희"};
int[] scores = {90, 85};

하지만 생각해보면 **'이름'**과 **'점수'**는 **'학생'**이라는 한 사람의 데이터죠? 이걸 따로 관리하려니 순서가 꼬이면 철수 점수가 영희에게 가는 사고가 발생합니다.

"관련된 데이터를 하나로 묶어서 관리할 수는 없을까?" 이 질문에서 탄생한 것이 바로 **클래스(Class)**입니다.


1. 붕어빵 이론: 클래스 vs 객체

객체지향을 설명할 때 전설처럼 내려오는 비유가 있습니다.

  • 클래스(Class): 붕어빵 틀 (설계도)
    • 하나만 있으면 됨.
    • 직접 먹을 수 없음.
    • "밀가루와 팥이 들어간다"는 규칙을 정의함.
  • 객체(Object): 붕어빵 (실체)
    • 틀을 이용해서 무수히 많이 찍어낼 수 있음.
    • 실제로 먹을 수 있음.
    • 각각의 붕어빵은 서로 다른 팥 양과 굽기를 가짐.

자바 프로그래밍은 1. 클래스(틀)를 먼저 만들고, 2. 그 틀로 객체(붕어빵)를 찍어내서 사용하는 과정입니다.


2. 클래스 만들기 (설계도 그리기)

학생 데이터를 묶어서 관리할 Student라는 설계도를 만들어보겠습니다. src 폴더에 Student.java 파일을 새로 만드세요. (Main.java 옆에)

// Student.java
public class Student {
    // 이 설계도로 만드는 객체는 아래 두 가지 정보를 가집니다.
    String name; // 이름표
    int score;   // 점수표
}

끝입니다. 아주 간단하죠? 이건 "학생이라면 이름과 점수가 있어야 해"라고 정의만 한 상태입니다. (아직 실체는 없습니다.)


3. 객체 생성하기 (붕어빵 찍어내기)

이제 다시 Main.java로 돌아와서, 방금 만든 설계도를 써먹어 봅시다. 이때 사용하는 마법의 주문이 바로 **new**입니다.

// Main.java
public class Main {
    public static void main(String[] args) {
        // 1. 첫 번째 학생(객체) 생성
        // 해석: Student 설계도로 새로운(new) 붕어빵을 만들어서 student1 변수에 담아라.
        Student student1 = new Student();
        
        // 2. 데이터 채워 넣기 (점 접근 연산자 . 사용)
        student1.name = "철수";
        student1.score = 90;

        // 3. 두 번째 학생(객체) 생성
        // 설계도(Class)는 하나지만, 객체(Object)는 여러 개 만들 수 있습니다.
        Student student2 = new Student();
        student2.name = "영희";
        student2.score = 85;

        // 4. 확인하기
        System.out.println(student1.name + "의 점수: " + student1.score);
        System.out.println(student2.name + "의 점수: " + student2.score);
    }
}

실행 결과

철수의 점수: 90
영희의 점수: 85

보이시나요? namescore 배열을 따로 쓸 필요 없이, student1이라는 덩어리 안에 이름과 점수가 같이 묶여 다닙니다. 이게 바로 객체지향의 시작입니다.


4. 왜 이렇게 쓰나요? (장점)

"그냥 변수 쓰는 거랑 뭐가 달라요? 더 복잡한데?" 라고 생각할 수 있습니다. 하지만 학생 정보가 이름, 점수뿐만 아니라 전화번호, 주소, 학번, 동아리... 등 100개로 늘어난다면?

  • 배열 방식: 배열 100개를 만들어야 함. (끔찍)
  • 클래스 방식: Student 클래스에 필드만 추가하면 됨. student1 하나만 들고 다니면 그 안에 100개 정보가 다 들어있음. (깔끔)

5. 자주 하는 실수 (NullPointerException)

객체를 다룰 때 초보자가 가장 많이 만나는 에러입니다.

Student s1; // 변수(그릇)만 만들고, new(내용물)를 안 넣음!
System.out.println(s1.name);
  • 에러: NullPointerException
  • 이유: 붕어빵 봉투(s1)는 준비했는데, 안에 붕어빵(new Student())이 없는 상태에서 "붕어빵 팥 맛 어때?"라고 물어본 겁니다.
  • 해결: 항상 new 키워드로 객체를 생성(초기화)했는지 확인하세요.

6. 마무리

오늘은 자바 세상의 창조주가 되어 **설계도(Class)**를 그리고 **생명체(Object)**를 탄생시켜 보았습니다.

그런데 지금 만든 Student는 이름과 점수라는 **데이터(상태)**만 가지고 있습니다. 진짜 학생이라면 "공부를 한다", "시험을 본다" 같은 **행동(기능)**도 할 수 있어야 하지 않을까요?

다음 **[9강]**에서는 클래스 안에 기능을 불어넣는 **메소드(Method)**와, 이 객체가 언제 어디까지 살아있는지 결정하는 **변수의 생존 범위(Scope)**에 대해 알아보겠습니다.

👉 9강 바로가기: 객체의 행동, 메소드(Method)와 변수의 범위