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.03java로 작성된 프로그램이 실행되면 JVM은 OS로부터 memory 공간을 할당받고, 이 할당받은 공간을 용도에 따라서 여러 영역으로 나눠서 관리하게 된다. 여기서 주목해서 공부해봐야할 부분은 3가지 영역인데 그 세 가지 영역은 아래와 같다. 1. method area 2. heap 3. call stack or execution stack method area 프로그램 실행 중 사용되는 class에 대한 정보를 저장하는 위치 프로그램 실행 중 특정 class가 사용되면 JVM은 해당 class의 ".class" file을 분석하여 class에 대한 정보를 해당 영역에 저장한다. 그리고 이 때 해당 class의 class variable도 이 위치에 저장된다. heap 프로그램 실행 중 생성되는 ins… -
Variable 과 Method
Variable 과 Method
2021.06.29변수(variable)는 다음 세 가지 종류가 존재함을 기억하도록 하자. 1. Class variable 2. Instance variable 3. Local variable 다른 프로그래밍 언어들과 마찬가지로 변수의 종류를 결정짓는 요소는 "변수가 선언되는 위치" 이다. 이 각각의 변수들을 구분하고자 할 때에는 다음의 기준을 적용해서 구분하면 된다. member variable을 제외한 나머지 변수들 모두 local variable 이며, member variable 중 static이 붙은 것은 class variable, 붙지 않은 것은 instance variable에 해당 아래의 예시 코드를 보면 위의 기준을 통해서 각 변수들을 어떻게 구분할 수 있는 지 이해할 수 있을 것이다. class Fis… -
OOP(Object Oriented Programming language) 개념
OOP(Object Oriented Programming language) 개념
2021.06.29컴퓨터 공학을 공부한다면 어렵지 않게 들을 수 있는 이 OOP라는 용어는 우리말로 "객체지향언어"로서 java가 가지는 핵심적인 기능 중 하나이다. java의 모든 내용들을 잘 이해하기 위해서는 이 OOP에 대한 이해가 대단히 중요하기 때문에 OOP의 개념에 대해 공부해야할 가치는 충분하다. OOP는 다음과 같은 아이디어에서 시작 되었다. 우리가 있는 실세계를 모델링하여 이와 굉장히 유사한 가상세계를 컴퓨터 속에서 구현할 수 없을까? 그리고 이 과정에서 우리가 위치한 실세계를 다음과 같이 표현하였다. 우리가 위치한 실세계는 Object로 이뤄져 있으며, 세계에서 발생하는 모든 이벤트는 이 Object 간의 상호작용으로 발생한다. OOP가 가지는 장점은 다음과 같다. 1. 높은 코드 재사용성 2. 용이한 … -
Java 에 대한 기본적인 정리
Java 에 대한 기본적인 정리
2021.06.29Java 의 장점 1. 운영체제에 독립적 2. 객체지향 언어 3. 비교적 낮은 입문장벽 4. Garbage Collector 5. 네트워크와 분산처리 6. 멀티스레드 지원 7. Dynamic Loading 지원 운영체제에 독립적 java는 일종의 애뮬레이터인 JVM(= Java Virtual Machine)을 사용한다. 그렇기 때문에 java로 작성된 코드는 운영체제나 하드웨어가 아닌 JVM과만 통신이 이뤄지기 때문에 java 코드 관점에서는 운영체제나 하드웨어에 대한 차이 없이 동일한 java 코드를 사용할 수 있다. 운영체제가 해당 내용을 이해할 수 있도록 애플리케이션의 명령들을 변환하는 것은 JVM이 수행한다. 그렇기 때문에 java로 작성된 프로그램 자체는 운영체제에 독립적이지만, JVM은 운영체…
댓글을 사용할 수 없습니다.