개발쿠키

[JAVA]클래스, 객체, 인스턴스 본문

개발/java

[JAVA]클래스, 객체, 인스턴스

쿠키와개발 2023. 7. 20. 02:32

들어가기전...

개발자로서 과연 나는 OOP를 얼마나 알고 있나를 곰곰히 생각해보면 정확하게 설명하기 힘들겠다는 부분에서 두루뭉실하게 알고 있다고 느꼈다.  

그래서 OOP에 대하여 공부를 하고 이해를 하는 과정에서 클래스, 객체, 인스턴스는 왜 나왔는가라는 의문이 들었다. OOP 관점에서 아직도 이들이 무엇이고 어떤 역할인지를 딱 명확하게 정의할 수는 없지만 이 기록을 통해 어느정도 가닥을 잡고 정리를 하고싶어 작성한다. 아마 해당 글은 계속해서 수정이 되면서 이해한 부분들이 추가되어 어느정도 완성되지 않을까 싶다.


클래스, 객체, 인스턴스

 

객체 

다른 글들을 보면 프로그래밍에서 객체라는 것은 소프트웨어 세계에서 구현될 대상, 클래스에 정의된 그대로 생성된 실체라고들 한다

사실 이 부분이 많이 이해가 안갔다 누군가는 실세계에 존재하는 것이 객체라고도 하며 누군가는 소프트웨어에서 생성된 실체 라고 하는데 뭐가 맞고 틀린지는 크게 중요하지 않은 것 같다. 

 

우선 우리는 개발자다. 개발자 관점에서라면 소프트웨어를 구현하는 과정에서 어떤식으로 바라볼지가 중요하다. 

이런 의미에서 내가 생각한 객체라는 것은 실세계의 구현할 객체를 소프트웨어 세계에 실체화 한 것을 객체라고 생각한다. 

즉 다시 말해 우리가 만들고자 했던 실세계의 어떠한 객체를 프로그램에 실제로 생성된 것을 객체라고 본다는 의미이다. 

 

이러한 맥락에서 객체가 가지는 '클래스의 인스턴스'라는 특징을 본다면 이해가 좀 편하다. 결국 객체라는 것이 실세계에서 처럼 동작하기 위해서는 코드로 실행 될 수 있어야 하고 인스턴스화 하여 실제 메모리에 A 라는 객체를 실체화가 되어야 한다. 이러한 이유로 객체는 클래스의 인스턴스 라는 특징을 가지는 것이다. 

 

하지만 반대로 실세계의 객체가 과연 클래스의 인스턴스라는 특징을 가진다고 하면 이해가 되지 않는다. 정상적이라고 생각한다. 이는 바라보는 관점의 차이이지 틀린 것이 아니기 때문이다. 하지만 우리는 객체 지향 프로그래밍을 하는 개발자의 시점이다. 어느 시점으로 바라볼지는 자유이지만 지금은 개발자의 관점에서 보는 것이 맞다고 본다. 

 

여기서 한가지 의문이 들었던 것이 소프트웨어 세계에서 클래스와 인스턴스는 직관적으로 표현을 할  수 있지만 객체는 어떻게 표현할 수 있을까라는 의문이였다. 사실 이렇다 한 답을 내릴 수는 없지만 내가 생각한 답은 굳이 표현하지 말고 그저 프로그램상에서 실세계에 존재하듯이 나타내면 그것이 객체를 표현했다고 할 수 있지 않을까 한다. 비슷한 맥락에서는 흔히들 이것을 타입만 선언된 상태라고도 한다. 

 

 

클래스 

앞서 객체를 실체화 하기 위해서는 어떤 정의된 무언가가 필요하다. OOP의 관점에서 보자면 객체지향적인 프로그래밍을 하는데 우리가 실체화 하고자 하는 객체가 어떠한 건지 정의도 하지 않은 채 사용하기는 어려울 것이다. 

 

클래스를 간단히 정의하자면 객체를 실체화 하기 위해 필요한 틀이다. 그리고 이러한 틀을 어떻게 정의할 수 있는가 하면 실세계에 존재하는 객체를 관찰하거나 하여 해당 객체가 가지는 속성이나 기능들을 코드로 정의하면 된다. 

 

자바에서는 class 키워드를 통해 이러한 틀을 정의할 수 있다. 또한 클래스는 실제로 존재하는 것이 아닌 그저 하나의 정보라고 할 수 있다. 

 

다른분들은 클래스는 그저 틀을 정의하는 것이 아니라 더 다양한 역할을 할 수 있다고 하지만 지금 나의 머리로는 한계가 있는 것 같다...

우선은 클래스라는 것이 객체를 생성하기 위한 틀이라는 개념을 넣어놓고 확장이 가능할 때 도전해봐야겠다

 

인스턴스

인스턴스라는 것은 비교적 이해하기 쉬울 수 있다. 물론 소프트웨어 관점에서 봐야지 쉬운 것이다. 

 

우선 인스턴스를 정의하자면 실세계의 객체를 정의한 틀인 클래스가 소프트웨어 세계에서 실체화 된 상태를 인스턴스라고 할 수 있다. 이를 좀 더 개발자에게 쉽게 설명하면 메모리를 할당 받아 동작하는 구체적인 실체이다.

 

앞서 객체를 정의할 때 객체를 어떻게 표현할지를 보면 실세계에 존재하듯이 나타내면 표현했다고 했다. 이러한 흐름에서 인스턴스와 객체 둘 다 실체화 되었다고 볼 수 있지만 차이점이 무엇이냐 보면 인스턴스는 좀 더 구체적이다라는 차이점을 들 수 있다. 

 

그저 실체하는 것이 객체라고 한다면 인스턴스는 독립적으로 존재하고 각각의 속성들을 가지고 있어 구분할 수 있다라는 점이다. 그리고 결국 인스턴스는 진짜로 실체화 되기 전에 객체로 먼저 나타나져야 하기 때문에 객체에 포함된다는 특징을 가진다. 물론 객체를 표현함과 동시에 인스턴스로 만들 수도 있기 때문에 객체와 인스턴스를 혼용해서 사용하기도 한다. 

 


요약

클래스 - 객체를 실체화 하기 위한 틀

객체 - 클래스의 타입으로 명시만 된 상태

인스턴스 - 메모리를 할당 받아 실체화 된 객체

 

참고

https://murphymoon.tistory.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4class-%EA%B0%9D%EC%B2%B4Object-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4Instance%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-Java-OOP-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B81

https://joy-baek.tistory.com/7

https://javakid.tistory.com/8

'개발 > java' 카테고리의 다른 글

[JAVA]객체지향과 객체지향 프로그래밍(OOP)  (0) 2023.07.31
[JAVA]Call By Reference, Call By Value  (0) 2023.07.14
[JAVA]JVM  (0) 2023.07.06
[JAVA]String  (0) 2023.07.04
[JAVA]JVM, JRE, JDK  (0) 2023.07.03