본문 바로가기
공부

클래스 , 객체 , 인스턴스

by 개발고구마 2024. 4. 20.

김영한님의 실전 자바 기본편 수강을 하면서 나는 어떻게 이 세 가지를 쉽게 설명할지 고민해봤다.

그렇게 나온 생각을 적어봤다.

출처 : https://www.leemekyeoung.com/%EA%B5%AC%EB%A9%8D%EA%B0%80%EA%B2%8C-STORE


옛날 어느 슈퍼 사장이 물건들을 팔았다.
매 번 수기로 어떤 것을 팔았는지 적다 컴퓨터라는 세상을 깨닫고 컴퓨터에 판매한 물건들을 저장하려고 시도한다.

사장은 과자, 음료수, 아이스크림 등 여러 물건을 팔았다.

사장은 이것을 "품목" 이라고 정의하고 목록을 정리했다.

목록 중 일부는 아래와 같다.

이름 가격
홈런볼 1000
초코바 2000
포카리 1500
감자깡 1000
... ...

 

이 목록을 컴퓨터에 저장하려고 한다. 

그럼 어떻게?

사장은 컴퓨터를 배웠으므로 소스를 다음과 같이 짰다.

 

String[] nameList = ["홈런볼", "초코바", "포카리", "감자깡"]

int[] priceList = [1000, 2000, 1500, 1000]

 

위와 같이 작성하고 사용하다보니 품목을 추가, 제거하다가 실수들이 나왔다.

초코바를 지우면서 2000을 지워야하는데 1500을 지우고

감자깡의 가격을 수정해야하는데 포카리의 가격을 수정해버리는 일이 발생했다.

 

위에는 품목이 4개밖에 없어서 느낌이 안오면 아래와 같이 품목이 많을 경우를 보자

 

String[] nameList = ["홈런볼", "초코바", "포카리", "감자깡" , "고구마깡" , "피자칩" , "OOO" , "XXX" , "AAA" , "SSS" , "DDD" , "FFF" , "QQQ" , "WWW" , "DDD" , "FFF" , "초코바" , "초코바" , "WWE" , "초코바2" , "초코바7" , "초코바" , "초코바" , "초코바" , " 고구마깡 " , "초코바" , "초코바" , "ASC" , "초코바" , "GGW" , "EEW" , "초코바3" , "초코바6" , "초코바9" , "초코바" , "초코바" , "초코바" , " 고구마깡 " , " 감자깡 " , "ASD" , "QWR" , "FFW" , "초코바" , "초코바4" , "초코바5" , "초코바10" , "초6코바" , "초코5바" , "초코3바" , "초코4바" , "초코바11" , "초코바" , " 홈런볼 " , "초코바" , " 홈런볼 " , "초코7바" , "초코바" , "초코3바" , "초코2바" , " 고구마5깡 " , "초코바" , " 고구마깡 " , "초코6바" , " 홈런볼 " , "초코바" ]

int[] priceList = [1000, 2000, 1500, 1000 , 2000 , 2000 , 2000 , 2000 , 2000 , 2000 , 2000 , 5700 , 2000 , 2000 , 65500 , 2000 , 2000 , 2000 , 2000 ,35000 , 4000 , 2200 , 2100 , 3000 , 5000 , 6000 , 7000 , 800 , 2000 , 2000 , 2000 , 9700 , 5670 , 7000 , 3000 , 2000 , 2000 , 2000 , 6400 , 35000 , 344000 , 540 , 24000 , 4300 , 120 , 2000 , 2740 , 4700 , 6800 , 3450 , 2000 , 2000 , 2000 , 2000 , 2000 , 2000 , 3500 , 2000 , 2000 , 2000 , 2000 , 2000 , 2000 , 2600 , 2000 , 2000 , 23000 , 4500 , 2000 , 2000 , 2000 , 2000 ]

 

품목이 많아지니 관리가 어려워지면서 계속 실수가 발생했다.

어떻게 하면 이름과 가격을 하나로 묶어서 관리할 수 있을까?

그렇게 알게 된 것이 "클래스"라는 것을 깨달았다.

사장은 아래와 같이 고쳤다.

 

Class Product{

    public String name;

    public int price;

}

 

Product[] productList = [new Product("홈런볼", 1000), new Product("초코바", 2000),  ...이하생략]

 

위와같이 정리해서 초코바의 가격을 수정하거나 감자깡이 단종되어 제거할 때 관리가 편해졌다.

 

우리는 이런 실생활에서 볼 수 있는 "품목"이란 것을 "객체"라 부르기로 했다.
"객체"를 컴퓨터에 소스로 작성해야하는데 그 소스로 작성한 틀을 "클래스"라고 부른다

 

그럼 "인스턴스"는 뭘까?

모두가 알다시피 컴퓨터에 무언가를 저장할 때 그 용량이 제한되어 있다는 것을 알 것이다.

위처럼 품목목록을 생성할 때 이것을 무한대로 생성할 수 없다

 

Product[] productList = [new Product("홈런볼", 1000), new Product("초코바", 2000),  ....무한대 불가능]

 

어느순간 한계가 올 것인데 이 한계의 용량이 "메모리"라고 보면 된다

그럼 "인스턴스"품목이 메모리에 등록되는 것이라고 보면 된다.

위 소스 처럼 new Product("홈런볼", 1000) 이라고 썼을 때

실제 컴퓨터 내부에서는 어느 저장 공간에다가 컴퓨터 코드로 저장했다

 

XXX XXX 홈런볼 1000 XXX

위처럼 눈에 보이진 않지만 컴퓨터 어딘가에 메모리에 등록된 것을 "인스턴스"라 한다