6일 전
썸네일은 제가 예전에 구웠던 쿠키입니다. 진짜 맛있었어요.
우리가 앞으로 배울 Spring 프레임워크는 철저하게 '객체지향(Object-Oriented)'을 중심으로 설계되어 있습니다. 객체지향에는 클래스, 인스턴스, 상속, 다형성 등 수많은 개념이 있지만, 오늘은 가장 기초적이면서도 중요한 '클래스와 객체, 그리고 왜 이것이 필요한가?'에 대해 직관적인 비유를 통해 정리해 보았습니다.
우리가 흔히 쓰는 계산기를 떠올려 봅시다. 3 + 4를 하면 7이 나오고, 거기에 다시 + 3을 하면 10이 나옵니다. 즉, 계산기는 이전에 계산한 결괏값을 항상 메모리 어딘가에 유지하고 있어야 합니다.
만약 자바에서 계산기를 만든다면 어떨까요? 전역 변수(static)를 사용해 값을 저장할 수 있습니다. 하지만 계산기가 2대, 3대, 10대로 늘어나야 한다면요? 각 계산기는 서로 독립적인 결괏값을 유지해야 하므로, 코드를 짤 때마다 Calculator1, Calculator2, Calculator3... 처럼 똑같은 클래스를 무한정 찍어내야 할 것입니다.
이런 어지러운 상황을 단번에 해결해 주는 것이 바로 객체(Object)입니다. 객체를 사용하면 하나의 계산기 설계도만 만들어 두고, 필요할 때마다 새로운 계산기를 공장에서 뽑듯이 생성하기만 하면 됩니다.
위에서 말한 '설계도'가 바로 클래스입니다. 가장 유명한 비유를 들어볼까요?
코드로 아주 간단한 Animal 클래스(틀)를 만들고, 이 틀을 통해 동물 객체(과자)를 찍어내 보겠습니다.
// 과자 틀 (클래스)
class Animal {
}
public class Sample {
public static void main(String[] args) {
// 과자 찍어내기 (객체 생성)
Animal cat = new Animal();
Animal dog = new Animal();
}
}여기서 new 키워드를 사용해 만들어진 cat과 dog가 바로 객체입니다. 참고로 '인스턴스(Instance)'라는 말도 자주 듣게 되실 텐데요. "cat은 객체다", "cat은 Animal의 인스턴스다"라고 표현합니다. 즉, 인스턴스는 특정 객체가 어떤 클래스로부터 만들어졌는지 '관계'를 강조할 때 쓰는 표현이라고 생각하시면 됩니다!
이제 껍데기뿐인 틀에 내용물을 채워보겠습니다. 동물 객체들이 각자의 '이름'을 가질 수 있게 해볼까요?
class Animal {
// 1. 객체 변수 (상태)
String name;
// 2. 메서드 (행동)
public void setName(String name) {
this.name = name;
}
}여기서 등장하는 this가 매우 중요한데요! this는 메서드를 호출한 객체 자기 자신을 가리킵니다. 만약 cat.setName("boby")라고 호출했다면, 내부적으로 this.name = "boby"는 곧 cat.name = "boby"가 됩니다.
이 글의 내용 중 가장 중요한 핵심입니다. 만약 두 개의 객체를 만들고 각각 다른 이름을 지어준다면 어떻게 될까요?
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("boby");
Animal dog = new Animal();
dog.setName("happy");
System.out.println(cat.name); // 출력: boby
System.out.println(dog.name); // 출력: happy
}dog의 이름을 happy로 지어줬다고 해서, 먼저 지어둔 cat의 이름이 happy로 바뀌지 않습니다.
너무 당연해 보이지만 이것이 바로 클래스 존재의 궁극적인 이유입니다. 클래스로 찍어낸 객체들은 각자의 객체 변수를 다른 객체와 절대 공유하지 않고 철저하게 독립적으로 유지합니다. 앞서 계산기 예시에서 계산기를 10개 만들어도 각자의 결괏값이 섞이지 않는 이유가 바로 이 '독립성' 덕분입니다.
이번 글은 계산기와 과자 틀 비유를 통해 객체가 왜 필요한지, 그리고 객체 변수의 독립성이 얼마나 중요한지 알아보았습니다.
우리가 무언가를 설계할 때 "이 데이터(상태)는 누구의 것이며, 누가 독립적으로 관리해야 하는가?"를 고민하며 클래스를 나누는 것, 그것이 객체지향 사고방식의 핵심이자 존재 이유입니다.
댓글 0