Class와 Object
Class
Object를 정의한 것
class는 위의 정의 그대로 "Object"를 정의한 것 이다. 실제로 Class는 Object의 정의를 바탕으로 Object를 생성하는 데 사용되며, Class를 통해서 생성된 각 객체들은 Class가 담고 있는 Object의 정의를 그대로 담게 된다.
Object
실존하는 것, 사물 또는 개념
Object는 우리말로 "객체"라고 표현하며 실제로 존재하는 것을 가리켜 말한다. Object는 사물과 같이 실제로 그 형태가 존재하는 "유형의 객체"일 수 있고, 개념과 같이 형태가 존재하지는 않지만 실제로 존재하는 "무형의 객체"일 수도 있다. 프로그래밍에서 Object는 class에 정의된 내용대로 메모리에 생성된 것을 가리켜 말한다.
Class와 Object의 관계?
class와 object의 관계는 다음과 같이 정리하면 아주 쉽게 이해할 수 있다.
Class는 붕어빵 틀, Object는 붕어빵 틀을 통해 찍어져 나오는 붕어빵들
붕어빵의 관점으로 이해해본다면 붕어빵틀은 반죽을 부어주면 동일한 모양의 붕어를 찍어낸다. 하지만 그 내용물로 팥을 넣을 것인지, 슈크림을 넣을 것인지에 따라서 붕어빵의 맛은 달라진다. 이와 같이 붕어빵 틀처럼 붕어빵의 모양을 잡아주고 이를 그대로 만들어낼 수 있도록 해주는 역할을 Class가 수행하는 것이고, 이 붕어빵 틀과 같은 Class를 통해서 찍어져 나오는 붕어빵 하나하나가 객체가 되는 것이다. 그리고 여기서 붕어빵이 가질 수 있는 밭, 슈크림은 각각의 객체가 가질 수 있는 "속성"으로서 이해하면 된다.
Object 와 Instance
Class로부터 객체가 만들어지는 과정 = Instantiate
Class로부터 만들어진 Object = 해당 Class의 Instance
위의 정의에서 설명한 것처럼 Class로부터 객체가 만들어지는 과정을 "Class의 instantiate" 라고 표현하며, 이 과정을 통해 생성된 Object를 가리켜서 해당 Class의 "instance" 라고 표현한다. 위의 붕어빵 예시로 생각해보면 붕어빵 틀을 사용해서 붕어빵을 굽는 과정을 Instantiate, 그리고 이 붕어빵틀을 통해서 구워낸 붕어빵을 instance 라고 표현할 수 있는 것이다.
그래서 이를 이해해보면 다음과 같은 생각을 해볼 수 있다.
그렇다면 Object와 Intance는 완전히 동일한 개념인가?
맞다. Object와 Instance는 동일한 의미이다. 하지만 이 둘의 내포하는 의미가 약간 다르다.
Object는 모든 instance를 대표하는 표괄적인 의미를 가지고 있는 것이고, instance는 class로부터 만들어진 것이라는 것을 강조하는 의미하는 성향이 강한 용어이다. 그렇기 때문에 Object와 Instance는 같은 의미이기 때문에 이 둘을 엄격하게 구분할 필요는 없지만 문맥에 따라서 적절히 구분해서 사용하는 것이 좋다.
즉, 다음과 같은 느낌으로 이해하는 것이 좋다. 마찬가지로 이전의 붕어빵 예시를 사용해서 정리해보면
"붕어빵은 instance 이다" 보다는 "붕어빵은 object 이다" 가 문맥상 자연스럽다.
"붕어빵은 붕어빵 틀의 Object 이다" 보다는 "붕어빵은 붕어빵 틀의 instance 이다" 가 문맥상 자연스럽다.
따라서, "엄격하게 부분해서 사용할 필요는 없지만, 문맥에 따라서 적절히 구분해서 사용하기를 권장한다" 정도로 이해하고 넘어가면 좋을 것 같다.
Object의 구성요소 (Property & Function)
Object를 크게 나누면 아래와 같이 속성과 기능 (Property & Function) 으로 구분할 수 있으며, Object는 다수의 속성과 기능을 가질 수 있다. 그리고 여기서 Object가 가지는 다수의 속성과 기능들을 가리켜서 해당 Object의 "Member" 라고 표현한다.
그리고 여기서 속성(Property)과 기능(Function)은 아래와 같이 같은 뜻의 여러가지 용어로 표현될 수 있다.
Property = member variable, attribute, field, state
Function = method, function, behavior
이것들을 모두 외울 필요까지는 없지만 문헌에 따라서 다음과 같이 여러가지 표현들이 사용될 수 있으니 이를 어느정도 알아두는 것이 좋다.
Instance의 생성과 사용
"new [Class명]"의 형식을 사용함으로서 reference variable에 해당 class에 대한 instance 생성할 수 있으며, 이 instance는 reference variable을 통해서만 다룰 수 있고, type은 instance의 type과 일치해야 한다.
이 때, 하나의 instance는 여러 개의 reference variable에 의해서 참조될 수 있지만 refernce variable에는 하나의 address만 저장될 수 있다는 점을 잘 기억하자. 즉, 하나의 reference variable이 동시에 여러 개의 instance를 가리킬수는 없다.
Object의 Array
프로그램에서 여러 개의 Object를 다룬다고 할 때 이 여러 개의 Object를 Array를 통해서 관리할 수 있다. 그리고 이 때 Array에 저장되는 것은 Object 자체가 아니라 해당 Object에 대한 address가 저장된다. 그렇기 때문에 사실 Object의 Array는 Object Address의 Array로 이해해도 무방하다.
여기서 말하는 Object의 Array는 같은 type의 object에 대해서만 저장할 수 있음을 기억하자. 여기서 Object Array를 초기화한 뒤에는 해당 Array의 각각의 element들에 대해서 instance를 생성하고 할당해주는 과정이 필요하다. 그리고 이를 다음과 같은 방법들로 수행할 수 있다. 가장 기본적으로 할 수 있는 방법은 다음과 같다.
아래의 예시는 붕어빵을 의미하는 "Fish"라는 Class에 대한 instance array를 만드는 것에 대한 예시이다.
Fish[] fishArr = new Fish[3];
fishArr[0] = new Fish();
fishArr[1] = new Fish();
fishArr[2] = new Fish();
하지만 이렇게 처리하면 코드라인 수가 길어져서 보기 좋지 않다. 그래서 이를 다음과 같이 개선할 수 있다.
Fish[] fishArr = { new Fish(), new Fish(), new Fish() };
그리고 만약 생성해야할 intance의 갯수가 많은 상황이라면 아래와 같이 for loop를 사용함으로써 이를 간단하게 표현할 수 있다.
Fish[] fishArr = new Fish[1000];
for(int i=0 ; i<1000 ; i++)
fishArr[i] = new Fish();
Class의 다른 정의
이전에 OOP의 이론 관점에서 Class의 정의를 살펴봤다면 이번에는 프로그래밍적인 관점에서 Class의 개념을 정리해보겠다. 간단하게 다음과 같은 과정을 통해서 Class 라는 개념이 프로그래밍 내에서 자리잡게 되었음을 기억하도록 하자.
변수 (Variable) | 하나의 데이터를 저장할 수 있는 공간 |
배열 (Array) | 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간 |
구조체 (Structure) | 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간 |
클래스 (Class) | 데이터와 함수의 결합 (Structure + Function) |
또한 Class는 프로그래밍 내에서 사용자 정의 타입(user defined type)의 의미를 가진다는 점을 기억해두도록 하자.
'Web Backend > Java' 카테고리의 다른 글
JVM의 메모리 구조 (0) | 2021.07.03 |
---|---|
Variable 과 Method (0) | 2021.06.29 |
OOP(Object Oriented Programming language) 개념 (0) | 2021.06.29 |
Java 에 대한 기본적인 정리 (0) | 2021.06.29 |
Optional (0) | 2021.06.28 |
댓글
이 글 공유하기
다른 글
-
JVM의 메모리 구조
JVM의 메모리 구조
2021.07.03 -
Variable 과 Method
Variable 과 Method
2021.06.29 -
OOP(Object Oriented Programming language) 개념
OOP(Object Oriented Programming language) 개념
2021.06.29 -
Java 에 대한 기본적인 정리
Java 에 대한 기본적인 정리
2021.06.29