[자바 기초] 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
보이시나요? name과 score 배열을 따로 쓸 필요 없이, 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)**에 대해 알아보겠습니다.