고민하기

객체(Object), 클래스(Class), 인스턴스(Instance)를 구분할 수 있을까

pythaac 2021. 6. 29. 16:22
단어는 많은 것을 포함하고 있다. 무언가를 설명하거나 말을 할 때는 용어 선택에 따라 이해가 달라질 수 있다. 따라서 단어를 명확히 정의하고 올바른 단어선택을 해야한다고 생각한다. 이에 나는 단어가 갖는 의미를 깊게 생각하는 일이 빈번하다.

클래스와 인스턴스의 정의

  처음 객체지향(Object-Oriented)를 접할 때 헷갈리는 용어는 클래스(Class)와 인스턴스(Instance)였다. 클래스와 인스턴스의 정의는 다음과 같다.

  • 클래스 (https://ko.wikipedia.org/wiki/클래스_(컴퓨터_프로그래밍))
    - 클래스는 객체 지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀이다. 객체를 정의하기 위한 상태(멤버변수)와 메서드(함수)로 구성된다.
  • 인스턴스 (https://ko.wikipedia.org/wiki/인스턴스)
    - 인스턴스는 일반적으로 실행중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트를 가리킨다.
    - 객체의 인스턴스는 광범위한 컴퓨터시스템 자원의 접근에 할당된 물리 메모리의 일부를 가리킨다.
  • 클래스=설계도 / 인스턴스=제품
  • 클래스=붕어빵틀 / 인스턴스=붕어빵
  • 클래스=자동차 / 인스턴스=롤스로이스

즉, 클래스는 틀이고 인스턴스는 context를 가진 클래스라고 생각한다. 일반적으로 대부분 사람은 공통적으로 손을 가지고 있지만, 그 손으로 무엇을 했는지에 따라 상태가 다르다. 피아노나 프로게이머처럼 손이 빠를 수도 있고, 공사나 농사같은 궂은 일로 손이 거칠어질수도 있도 있다. 사람이 손이 있다는 공통점은 있지만, 겪어온 경험에 따라 그 상태는 사람마다 다르다는 것이다.

 

객체는 무엇일까?

  그러면 이 때 사용되는 객체는 무엇일까? 클래스, 인스턴스와 객체를 구분할 수 있을까? 아래 글에서 이러한 문구가 있었다.

 

클래스와 인스턴스 그리고 객체 - 생활코딩

클래스와 인스턴스 이전의 프로그래밍 객체를 만들기 전에 이미 익숙한 코드로 돌아가보자. 아래 예제는 간단한 더하기 프로그램이이다. 그런데 이 예제를 잘 활용하기 위해서는 상상력이 필요

opentutorials.org

 

일반적으로 클래스가 구체적인 실체인 인스턴스가 되었을 때 객체라고 부른다. 보통은 구체적인 코드 상에서 나타나는 객체를 인스턴스라 부르고, 로직을 설계할 때 나타나는 인스턴스를 객체라고 부른다. 또는 클래스, 인스턴스의 구분없이 포괄적으로 객체라는 말을 쓰기도 한다.

결론적으로 이들을 나누기에 명확한 정의는 없다는 의미로 파악된다. 좀 더 명확히하자면, 정의가 다양하다. 인스턴스를 객체라고 할 수도 있고, 어디에도 속하지 않는 다른 의미가 객체일 수 있다. 그리고 이를 명시하기 위해 고민하고 토의한 흔적도 해당 부분에 연결된 링크(생활코딩 페이스북 그룹)를 통해 확인할 수 있다.

  또다른 글을 보았다. 해당 글은 코드를 포함하여 클래스, 객체, 인스턴스를 명확하게 구분하고 있었다.

 

[Java] 클래스, 객체, 인스턴스 차이 구분

클래스 - 일종의 설계도로써 예를들자면, 휴대폰의 특성과 기능들을 정의해놓은 것 - 연관되어있는 메소드...

blog.naver.com

이 글을 읽고 이렇게 구분한 이유를 생각해보았다. 클래스는 여전히 설계를 위한 도면, 정의이다. 여기서 객체는 식별해주는 변수(Variable)이다. 변수에 클래스는 명시되었지만, 아직 인스턴스, context가 없는, 어떻게보면 인스턴스화 되기 중간단계일 수 있겠다. 처음에는 납득이 됐다. '객체'라 하면 아무리 같은 클래스여도 서로가 '유별'해야한다고 생각하는데, 이에 타당하다 생각했다. 이 글에서는 Phone 클래스의 Galaxy20, IPhone11로 2개의 객체를 나타냈다.

  그런데 의문점이 하나 생겼다. Galaxy20은 변수이다. 이는 다른 인스턴스를 참조할 수 있다. 즉, 내가 쓰던 스마트폰도, 너가 쓰던 폰도 Galaxy20이면 이를 객체로 받아들여야하는가? 혼란이 오기 시작했다. 마음을 진정시키고 객체의 정의를 찾아보기로 했다.

  • 객체 (https://terms.naver.com/entry.naver?docId=844903&cid=42346&categoryId=42346)
    객체 지향 프로그래밍(OOP)이나 설계에서, 데이터(실체)와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 모두 포함한 개념. 예를 들어 기차역에서 승차권을 발매하는 경우, 실체인 '손님'과 동작인 '승차권 주문'은 하나의 객체이다. 실체인 '역무원'과 동작인 '승차권 발매'도 하나의 객체이다.

처음에 오잉?했다. 동작인 '승차권 주문'이 객체라고? 아무래도 '승차권 주문'이 '손님'의 동작으로 포함되어 이 둘은 하나의 객체다 라는 의미인 듯 하다. 이 때 나는 객체에서 중요한 것은 '구분'이라는 생각이 들었다.

 

객체를 추상적으로 보는게 맞지 않을까

객체를 추상적 개념으로 볼 때

  왜 객체를 지향할까? 아무래도 '편해서' 그러는 것 같다. 객체는 거대한 소프트웨어에서 더 modulation하기 좋다. 소프트웨어는 하나의 거대한 context인데, 그 안에서 작은 context들을 나누어 바라볼 수 있다. 이로 인해 내가 몰라도 되는 일들이 많아진다.

  내가 원하는 것은 커피인데, 핸드드립을 직접 내리기보다 카페가서 사먹는 것이 편하다. 심지어 커피를 만들 줄 모르고 먹을 줄만 아는 나도 커피를 구할 수 있다. 다시 말해, 카페직원이 내부적으로 어떤 동작을 하는지 몰라도, 나라는 객체는 내가 원하는 결과값을 카페직원 객체에게서 얻어낼 수 있다. 어떻게보면 내 인생이라는 거대한 context에서, 카페는 자신들만의 context로 나에게 '커피'라는 부분을 해결해줬다.

  서론이 길었다. 객체를 지향한다는 것은 이러한 분리, 구별, 구분을 지향한다는 의미로 나는 해석했다. 데이터와 메소드를 포함하는 하나의 context를 지칭할 수 있고, 이들을 나눌 수 있는 것. 이렇게 보면 객체란 단어는 추상적이다. 그게 맞다고 생각했는데, 객체라는 말을 코드를 보면서 사용하면 또 다르다.

객체 단어를 코드에서 사용할 때

  "1은 Integer 객체다"라는 말을 사용할 때, 위에서 말한 어떤 추상적인 의미로 사용되지 않은 것 같다. "객체를 변수로 받는다", "이 객체가 처리한다" 등등에서 말하는 객체는 클래스로 정의된, 또는 인스턴스를 의미한다. 변수 타입 중 객체를 뜻하는 Object도 있다. 이 때 클래스나 인스턴스라는 용어를 사용하지 않는 것은, 이로 표현할 수 없는 그 어떤 상태가 있다는 의미일 수도 있다.

 

뭐야 결론이 왜이래 - '객체'는 그냥 다의어로 남겨두자

  그렇다. 잘 모르겠다. 처음에는 이와 관련된 내용들을 읽으면서 무언가 느끼는 것들이 생겼고, 그래서 이 글을 쓰기 시작했다. 이 난제에 뭔가 멋지게 "객체는 추상적 개념으로 받아드려야한다"고 결론을 내릴 수 있을 것 같았다. 근데 너무 어렵다. 흐지부지한 결론이 되어 너무 슬프지만... 현재로써 내릴 수 있는 결론은 여러 의미로 쓰인다고 받아드리면 될 것 같다. 언젠가는 누군가 명확하게 정의하여 결론을 맺어주는 날이 오면 좋겠다....