※[컬러잇 자바] 시리즈는 "왜?"라는 질문을 중심으로 자바의 기초문법에서 고급 자바기술까지 알아보는 컬러잇 개발블로그 시리즈입니다.
https://color-it.tistory.com/1
[컬러잇 자바] #1. 왜 자바를 배워야할까?
※[컬러잇 자바] 시리즈는 "왜?"라는 질문을 중심으로 자바의 기초문법에서 고급 자바기술까지 알아보는 컬러잇 개발블로그 시리즈입니다. 컬러잇 자바시리즈 1편. 그 시작으로는 왜 자바를 알
color-it.tistory.com
컬러잇 자바시리즈 2편. 저번시간에는 자바를 왜 써야하는지, 그리고 왜 배워야하는지에 대해서 다뤄봤습니다. 이번에는 자바 세계의 근간을 이루고 있는 자바의 객체에 대해서 다뤄보려합니다.
그 전에, 오늘 배우는 내용들은 자바의 문법을 알기 전, 객체에 대해서 알아보면서 객체로 무엇을 할 수 있는지 알아보는 글입니다. 뒤에서도 얘기하겠지만 모든 내용을 이해하려하지 않아도됩니다. 나중에 다시 되짚어볼 내용들이며, 모든 코드들은 실제 자바문법이 아닌 의사코드입니다.
1. 객체란 무엇인가?
자바 세계에 오신 여러분을 환영합니다!
자바 세계의 근간을 이루고 있는 가장 중요한 개념은 바로 '객체'입니다. 자바는 '객체 지향 프로그래밍 언어'이기 때문이죠.
자바를 처음 배우는 입장에서는 굳이 객체 지향 프로그래밍이 뭔지, 객체가 어떤 매커니즘으로 동작하는지까지는 알 필요가 없습니다. 중요한 것은 자바 세계를 이루고 있는 객체가 무엇이며, 객체가 자바 내에서 어떤 역할을 담당하는지만 알면 됩니다.
자바에서 '객체'란, '현실에 있는 모든 것들'을 나타냅니다. 즉, 개, 사람, 건물, 피자, 자동차 등이 모두 객체에 해당할 수 있습니다.
간단한 회원가입 기능을 만든다고할 때, '회원'은 하나의 객체가 되는 것입니다. 피자주문 기능을 만든다고하면 '피자'가 하나의 객체가 되는 것입니다. 이처럼 자바에서는 현실에 존재하는 모든 것, 그리고 자바 프로그램이 다루는 거의 모든 대상들을 객체라고 칭합니다.
뿐만 아니라 '주문', '날짜', '숫자'와 같이 추상적인 개념들 역시 객체가 될 수 있습니다. 자바 프로그램이 다루고 있는 거의 모든 것들이 객체에 해당합니다.

그래서 자바 프로그램의 내부를 들여다보면 객체로만 이루어져있습니다. 자바 세계는 객체들의 상호작용으로 이루어지고, 자바 프로그램이 실행된다고 보면 좋겠습니다.
물론 객체와 자바를 처음 접한다면 아직 이해가 힘든 부분이 있습니다. 이는 직접 자바를 통해 개발하면서 얻을 수 있는 감각과 경험에 해당하기 때문에, 자바 프로그래밍에 익숙해지다보면 이 말의 뜻을 이해할 수 있을 것입니다. 우선은 피자, 개, 사람과 같이 현실에 있는 것들을 표현하는 용도라고 이해해도 좋습니다.
그렇다면 자바에서는 객체가 매우 중요한 편인데, 자바에서 객체는 어떻게 생겼을까요?
개발 일을 하다가 라면을 너무 많이 먹은 나머지 작은 라면가게를 개업해서 라면 만드는 프로그램을 개발했다고 칩시다. 라면은 종류별로 신라면, 진라면, 안성탕면을 팔고 있습니다. 여기서 객체란, 자바 프로그램이 다루고 있는 것. 그러니까 라면 만드는 프로그램이 끓일 라면이 객체라고 볼 수 있겠습니다.
각 객체에는 라면의 이름, 라면을 만든 회사와 같이 객체가 고유하게 가지는 정보들이 있습니다.
그리고 각 객체에는 라면 끓이기와 같이 객체가 고유하게 할 수 있는 행동들이 있습니다.
이처럼 자바에서 객체는 객체가 고유하게 갖는 정보들과, 객체가 고유하게 할 수 있는 행동이 들어있습니다. 객체가 갖는 정보를 변수(필드), 객체가 할 수 있는 행동을 메서드라고 칭합니다.

즉, 객체는 변수(정보)와, 메서드(행동)으로 이루어져 있습니다.
"객체 간의 상호작용"은 이 변수와 메서드를 통해서 이루어집니다.
2. 객체의 설계도, 클래스
모든 객체는 '변수'와 '메서드'로 이루어져있습니다. 그리고 다른 객체와 상호작용하려면 객체가 갖는 고유한 변수와 메서드를 통해서 이루어집니다.
그렇다면 이 변수와 메서드는 어떻게 이루어져있는지 정의할 필요가 있습니다.
신라면의 경우에는 라면이름을 "신라면"으로, 회사이름을 "농심으로", 조리하기 메서드는 "물을 550ml 넣고 끓인 후 후레이크과 분말스프, 면을 넣고 4분 30초간 끓이기"라고 정의해야합니다.
이럴 때 사용되는 것이 바로 클래스입니다.
클래스는 객체가 갖는 모든 변수와 메서드를 미리 선언해두는, '객체의 설계도'라고 할 수 있습니다.
class 신라면 {
name = "신라면";
company = "농심";
MakingRamyun() {
//신라면 조리하기
}
}
class 진라면 {
name = "진라면";
company = "오뚜기";
MakingRamyun() {
//진라면 조리하기
}
}
class 안성탕면 {
name = "안성탕면";
company = "농심";
MakingRamyun() {
//안성탕면 조리하기
}
}
위의 예시처럼 클래스에 변수와 메서드를 정의할 수 있습니다.
진라면.MakingRamyun();
앞으로 객체와 상호작용할 때에는 이 클래스에 정의된 변수와 메서드를 가지고 상호작용이 이루어지게됩니다.
이처럼 객체가 갖는 고유의 변수와 메서드를 미리 선언해두는, 설계도와 같은 역할을 하는 것이 바로 '클래스'입니다.
3. 왜 객체를 쓸까?
만약, 라면 만드는 프로그램을 만들었는데, 객체를 사용하지 않았다고 칩시다.
라면만드는메서드() {
//만약 라면의 이름이 신라면이라면
//물을 550ml 넣고, 끓인 후에 신라면 분말스프와 면을 넣고 4~5분 간 더 끓인다.
//만약 라면의 이름이 진라면이라면
//물을 550ml 넣고, 끓인 후에 진라면 분말스프와 면을 넣고 4~%분 간 더 끓인다.
//만약 라면의 이름이 안성탕면이라면
//물을 550ml 넣고, 끓인 후에 안성탕면 분말스프와 면을 넣고 4~5분 간 더 끓인다.
}
코드를 짤 때 위와 같은 방향으로 짜야합니다.
그런데 만약 손님들의 많은 요청으로 라면에 추가적인 재료를 넣는다면 어떻게될까요?
라면만드는메서드() {
//만약 라면의 이름이 신라면이라면
//물을 550ml 넣고, 끓인 후에 신라면 분말스프와 면, 계란을 넣고 4~5분 간 더 끓인다.
//만약 라면의 이름이 진라면이라면
//물을 550ml 넣고, 끓인 후에 진라면 분말스프와 면, 파를 넣고 4~%분 간 더 끓인다.
//만약 라면의 이름이 안성탕면이라면
//물을 550ml 넣고, 끓인 후에 안성탕면 분말스프와 면을 넣고 4~5분 간 더 끓인다.
}
위와같이 코드를 수정해야합니다.
그런데 만약 이번에는 짜파게티 라면이 추가된다면 어떻게해야할까요?
라면만드는메서드() {
//만약 라면의 이름이 신라면이라면
//물을 550ml 넣고, 끓인 후에 신라면 분말스프와 면, 계란을 넣고 4~5분 간 더 끓인다.
//만약 라면의 이름이 진라면이라면
//물을 550ml 넣고, 끓인 후에 진라면 분말스프와 면, 파를 넣고 4~%분 간 더 끓인다.
//만약 라면의 이름이 안성탕면이라면
//물을 550ml 넣고, 끓인 후에 안성탕면 분말스프와 면을 넣고 4~5분 간 더 끓인다.
//만약 라면의 이름이 짜파게티라면
//물을 600ml 넣고, 끓인 후에 짜파게티 면을 넣고 5분 간 끓인다.
//물이 끓으면 8 스푼 정도만 남기고 물을 버린 후에, 짜파게티 분말스프와 올리브오일을 넣고 잘 버무린다.
}
이렇게해야합니다.
결국에는 프로그램의 확장이 계속된다면, 코드의 길이는 늘어나고, 이전의 코드들끼리 꼬일 수도 있습니다. 어떻게하면 코드도 간결하게 줄이고, 각각의 레시피 메서드들이 서로 독립적으로 돌아갈까요?
class 신라면 {
라면이름 = 신라면;
회사 = 농심;
조리하기()
}
class 진라면 {
라면이름 = 진라면;
회사 = 오뚜기;
조리하기()
}
class 안성탕면 {
라면이름 = 안성탕면;
회사 = 농심;
조리하기()
}
만약 객체를 사용한다면 각 객체의 클래스들을 위와같이 나타낼 수 있습니다. 그래서, 조건에 따라서 라면 조리법을 줄줄이 표시하는 것이 아니라, 조건에 따라서 원하는 라면 객체를 불러온 다음에 조리하기 메서드를 호출하면 되는 것입니다.
객체지향프로그래밍의 장점은 이것 뿐 만이 아닙니다.
라면가게를 하다가 너무 장사가 잘 된 나머지 라면카페를 만들어서 정보를 공유하려 했다고 칩시다.
그렇다면 카페 내에서 '카페의 회원'이 하나의 객체가 될 수 있겠죠. 회원 객체는 변수값으로 닉네임, 나이, 가입일과 같은 고유한 데이터를 가질 것이고, 메서드로는 회원탈퇴, 회원정보수정 등과 같은 고유한 행동들을 가질 것입니다.

그럼 객체가 이런 모양을 갖게 되겠죠.
그런데 어느날 회원이 너무 많아지고 카페도 활성화됨에 따라서 회원을 여러 등급으로 나누기로 했습니다. VIP - 정회원 - 준회원으로 나누기로한 것이죠.

그러면 이렇게 여러 개의 객체로 나눌 수 있습니다.
하지만 자세히보면 '탈퇴하기'와 '닉네임 수정'과 같이 여러 객체들이 나눠가지는 고유의 메서드가 있습니다.

그래서 이 겹치는 메서드를 뽑아서 '회원'이라는 새 클래스를 만들었습니다.
위 그림과 같은 관계를 "VIP 회원, 정회원, 준회원 클래스들이 회원클래스를 상속한다 또는 상속받는다"라고 표현할 수 있습니다. 위와 같은 관계에서는 VIP회원, 정회원, 준회원 객체들은 회원객체가 갖는 모든 변수와 메서드값을 사용할 수 있습니다.
즉, 회원클래스에서 탈퇴하기 기능과 닉네임수정 기능을 단 한 번만 정의하면, 회원클래스를 상속하는 모든 클래스들이 그 기능을 사용할 수 있습니다.
이처럼 객체를 사용하면, 객체지향언어를 사용하면 상속관계를 사용하여 코드도 줄이고, 각 객체들이 독립적으로 상호작용하여 코드가 문제를 일으킬 가능성도 줄어듭니다. 또 새로운 회원등급제가 만들어져도 회원객체를 상속하면되니까 시스템의 확장에도 유연한 편입니다.
상속, 메서드, 변수 등의 개념은 앞으로 차차 배워나갈 개념입니다. 오늘은 그저 객체란 무엇인지, 객체는 고유의 정보를 갖는 변수와, 고유의 행동을 갖는 메서드로 구분되어있고, 변수와 메서드를 정의한 것이 클래스라는 것을 이해했다면, 이 블로그의 글을 잘 읽은 것입니다.
클래스와 객체가 아리송해도 좋습니다. 앞으로 메서드, 변수, 자바의 타입들을 배우고 다시 클래스를 정의하러 돌아올 예정입니다. 개념이 어렵더라도, 자바를 통해 여러차례 개발해보고 프로그램을 만들다보면 언젠가는 그 개념을 충분히 이해할 수 있다고 생각합니다.
마무리 정리를 해보자면,
자바는 객체로 이루어져있습니다. 객체는 실제로 존재하는 모든 것들을 자바에서 표현한, 자바 프로그램이 다뤄야할 대상입니다. 그래서 객체도 실제 사물과 같이 객체 고유의 정보를 표현하는 변수와 고유한 행동을 갖는 메서드로 이루어져있습니다. 그리고 이것을 정의하는 곳이 바로 클래스입니다.
이제 객체의 껍데기에 대해 알아봤으니, 다음 글에서는 그 껍데기를 파고 들어가 객체를 이루고 있는 첫 번째 요소, 변수, 그리고 자바의 타입에 대해서 알아보도록하겠습니다. 감사합니다!
'Language > ColorIt_Java' 카테고리의 다른 글
| [컬러잇자바] #6. 왜 main 메서드를 사용할까? (0) | 2026.02.02 |
|---|---|
| [컬러잇자바] #5. 왜 생성자를 사용할까? (0) | 2026.01.26 |
| [컬러잇자바] #4. 왜 메서드를 사용할까? (1) | 2026.01.19 |
| [컬러잇자바] #3. 왜 변수와 타입을 사용할까? (1) | 2026.01.12 |
| [컬러잇 자바] #1. 왜 자바를 배워야할까? (0) | 2025.12.29 |
