본문 바로가기

면접질문[CS]/알고리즘 & OS

클래스(class), 객체(Object), 인스턴스(Instance)의 차이점. [ Java & OOP 면접 질문1]

Why

 

대부분의 시스템이 객체지향 개발론을 통해 개발된다.

 

그 이유는 복잡성을 제어하면서 유지보수성을 높여야 하기 때문이다. 

유지보수성을 왜 높여야 할까? 그 이유는 소프트웨어를 다루는 프로그래머의 가치가 컴퓨터의 가치보다 높기 때문이다.

 

기존의 시스템을 이해하고 수정 및 확장하기가 쉬울수록 해당 시스템에 들어가는 유지보수 비용이 낮게 측정된다.

 

OOP는 비즈니스의 관점에서 보면 프로그래머로 하여금 비용 효율적으로 시스템을 개발하게 해주는 방법이다.

 

OOP는 유지보수성을 위해서 기존의 개발 패러다임(절차지향 패러다임)에서 한 단계 발전한 패러다임이다.

 

객체지향 개발론에도 절차지향적인 부분이 존재하지만 "객체"를 중심으로 사고해야 한다는 점에서

 

기존의 절차지향적인 개발 방법론과는 다른 사고방식으로 이끌어준다.

 

OOP를 이해하기 위한 첫 걸음은 "객체"라는 개념을 받아들이는 것이다.

 

그와 동시에 객체와 땔 수 없는 관계에 있는 "클래스"와 "인스턴스"라는 개념도 이해해야 한다.

[개인적으로 객체 > 클래스 >>>> 인스턴스 중요도가 있다고 생각 ]

 

해당 면접 질문은 정형화된 답변으로 끝내기에는 아쉬운 지식이 담겨있다.

[ 개인적으로 면접관과 자유롭게 대화하면서 답변하는 게 좋을 것이라 생각한다. ]

 

생각나는 대로 적은 나의 첫 답변은 다음과 같다.

 

클래스는 객체를 생성해주는 엄마라고 메타포 하고 싶다.

 

기본적으로 객체의 생성과 폐기를 클래스가 담당해야 하지만 메모리 관리의 효율성을 얻기 위해서

객체의 폐기에 대해서는 가비지 컬렉터가 담당해주고 있다.

 

객체의 관점에서 보면 클래스는 자신을 생성해주는 존재이다.

 

실제 프로그램이 동작할 때 객체를 런타임에서 생성하게 되는데 이를 "인스턴스화"한다고 표현한다.

 

프로그램의 동작이 new 연산자를 만나고 클래스의 생성자로 넘어가서 객체를 메모리에 할당하는 것이다.

 

클래스는 객체를 묶어주는 추상화된 틀이며

 

객체는 현실과 소프트웨어를 연결해주는 개념이다.

 

인스턴스는 객체의 실제 구현(동작)상태를 의미한다.

 

이렇게 대답했을 것 같다.

 

중구난방의 대답이라 생각되며 추상적인 부분도 많다고 생각된다. [ 뭔가 말끔하지 않다 ] 

 

흐음.. 잘 모르겠다. 대답하면서 점점 더 난해 해지는 기분이 든다.

 

참고 : https://blog.naver.com/satyee/140128005527

 

객체(Object)

객체지향의 사실과 오해에서 객체를 다음과 같이 소개해준다. [ 그래디 부치의 정의 인용 ]

 

"하나의 개별적인 실체로 식별 가능한 물리적인 또는 개념적인 사물어떤 것이든 객체가 될 수 있다.

인간의 인지 능력 안에서 셀 수 있고, 다른 사물과 구분할 수 있으며, 생성 시점을 알 수 있고, 독립적인 하나의 단위(타입, 분류)로 인식할 수 있는 모든 사물은 객체이다."

 

요점만 뽑으면 객체는 "상태", "행동", "식별자"를 지닌 실체로 보는 것이다.

여기까지가 객체이다.

 

객체보다 좀 더 구체화된 개념인 인스턴스는 다음과 같이 표현할 수 있다.

 

소프트웨어 안에서 "객체"는 저장된 상태와 실행 가능한 코드로 구현된다.

이 구현체를 우리는 "인스턴스"라고 표현한다.

 

인스턴스는 클래스에서 객체를 인스턴스화한 것이라고 말할 수 있다.

 

좀 더 구체적으로 말하면 new 연산자와 생성자를 통해서 객체를 구체화했다고 말할 수 있다. 

 

개발자가 OOP에서 집중해야 하는 부분은 객체를 "현실"과 "소프트웨어"의 중간 지점으로 바라보는 것이다. 

 

현실세계의 문제점을 해결하기 위해서 필요한 개념이나 사물을 소프트웨어로 담아내야 하는데 이것을 "객체"로 대상화하는 것이다. 

 

클래스(Class)

 

클래스는 객체의 추상적인 영역을 담당한다.

 

현실세계의 문제점을 해결하기 위해 도출한 개념이나 사물을 객체로 도출했을 때 객체가 가지는

 

공통적인 속성과 행동을 클래스에 정의하게 된다.

 

클래스는 객체를 생성해주는 생성자, 객체가 공통적으로 가지는 속성, 공통적인 기능들을 정의한다.

 

클래스 자체로는 의미가 없다. 실제 소프트웨어에서는 클래스로부터 생성된 객체(인스턴스)가 의미가 있다. 

 

객체들의 공통점들을 기반으로 객체들을 묶기 위한 그릇이 클래스이다. [ 객체지향의 사실과 오해 인용 ]

 

객체와 클래스의 관점으로 보면 위와같이 설명할 수 있을 것이다.

 

클래스는 이외에도 다양한 역할을 한다. [ 분류와 타입(type) ] 이 개념들은 OOP의 핵심 개념인 다형성과 상속과 관련된 개념이기에 여기서 다루지는 않는다. ]

 

클래스를 객체와 관련되어 설명하자면 클래스는 객체들의 공통점을 묶어주며 객체를 생성하는 메커니즘을 소유한 코드라고 볼 수 있다.

 

인스턴스(Instance)

 

객체와 클래스라는 개념만 있으면 객체지향 개발 방법론을 이해하기가 뚜렷해진다.

 

문제는 인스턴스이다. 객체와 인스턴스는 같게 쓰이는 경우도 있고 다르게 쓰이는 경우도 많기 때문이다.

 

객체를 "인스턴스"라고 표현할 때는 바로 소프트웨어를 바라보는 시점이다.

 

객체는 현실과 소프트웨어의 중간 지점에 있기에 순수하게 소프트웨어적으로 해석하기가 어렵기 때문이다. 

 

실제 런타임환경(메모리에 올라온)의 객체를 표현하기 위한 용어를 생각해야 했는데

 

나는 그게 바로 "인스턴스(Instance : 실체)"라 생각한다.

 

실제 런타임에 동작하는 객체로 구체적인 실체이다. 각 인스턴스는 다른 변수명을 가지며 다른 속성, 식별자를 가진다.

 

인스턴스에 집중해야 할 때는 "구현"에 집중할 때이다.

 

현실 문제점을 들여다보고 현실과 소프트웨어를 연결해줄 대상을 찾을 때에는 "객체"에 집중해야 한다.

 

 

핵심 요약

객체는 실세계의 엔티티(Entity)를 대표한다. 인스턴스는 소프트웨어에서 활동하는 객체의 실재이다.

 

클래스는 실세계의 엔티티를 추상화한 속성과 기능을 가지며 객체를 생성하기 위한 생성자를 제공한다.

 

클래스(Class)

- 객체가 가지는 공통된 속성과 기능을 정의한다. 

- 객체를 생성할 수 있는 생성자를 가진다. 

- 객체를 해제하는 메서드를 가진다. [ 현대 언어에서는 GC가 호출해준다. ] 

 

객체(Object)

- 클래스를 통해 생성할 대상이다. 

- 소프트웨어적인 관점에서 보면 생성자를 통해 구현체가 되지 않았으며 클래스의 타입으로 명시된 상황이다.
메모리에 올라올 구현체를 위한 참조만 가진다.

- 이해관계자를 위한 현실세계의 문제점을 소프트웨어로 해결하기 위한 매개체이다.

 

인스턴스(Instance)

- new 연산자를 통해 생성자를 호출해서 메모리에 올라온 객체의 상태를 의미한다.

- 세부적인 속성값, 유일 값을 지니며 소프트웨어의 생애주기에 참여하여 동작한다.

[ 꼭 유일해야 하는 것은 아니다. 객체의 동일성. 프로그램에서의 동일성에 대해선 나중에 살펴본다. ]

- 객체는 인스턴스보다 더 포괄적인 단계이다. 런타임에 작동하는 객체를 인스턴스라고 말할 수 있다.

객체는 인스턴스의 묶음이라고 볼 수 있다.

 

내가 요약한 바는 위와 같다.

 

너무도 추상적이면서 깊게 들어가면 철학적으로 접근할 수도 있는 부분이기에 자신에게 맞는 정답을 고민해봤으면

하는 질문이다.

 

이게 정답이야!!로 처리하기엔 다양한 정답이 될 수 있는 사례가 많으니 한 번 고민해보시길 바란다.

다양한 사람들의 의견을 살펴보는 것을 추천한다.

 

참고자료

개인적으로 OOP의 관점을 넓혀주는 책으로 "객체지향의 사실과 오해"와 "오브젝트"를 추천한다.

  • 객체지향 사실과 오해 & 오브젝트 [조영호 저자] 
  • 몽구의 우당탕탕 개발 공부 : link
  • 오브젝트에 대해서 : link
  • 깃헙 면접 질문 모음 Java 클래스, 객체, 인스턴스 편 : link
반응형