[OOP] OOP 개념 정리 (객체, 클래스, 인스턴스)

이석환·2024년 2월 11일
0

개념 정리

목록 보기
2/6
post-thumbnail

Object-Oriented Programming

데이터가 "객체"내에 캡슐화되고 구성 요소 부분이 아닌, 객체 자체가 운용되는 프로그래밍 접근 방식이다.

즉, 명령어들의 집합이 아닌 "객체"들의 모임이며, 이러한 각각의 객체들이 메시지를 주고받고 데이터를 처리하는 방식의 컴퓨터 프로그래밍의 패러다임 중 하나이다.

객체 지향 프로그램은 좀 더 유연하고 변경이 쉬운 특징을 가지고 있다.

객체

제일 중요한 객체에 대해서 알아야할 필요성이 있을 것 같다.
'객체'는 흔히 상태(State)와 행동(Behavior)을 가지는 것을 의미한다.
예를 들어, 자동차, 책상, 사람 등은 상태와 행동을 가지고 있는 '객체'라고 생각할 수 있다.

객체지향 프로그래밍 관점에서 객체는 무엇일까 ?

An object is a class instance or an array.
-James Arthur Gosling-

제임스 고슬링은 본인의 저서 'The Java Language Specification'에서 객체를 클래스의 인스턴스나 배열을 의미한다고 정의한다.

객체 지향 프로그래밍에서 객체는 변수, 함수, 자료 구조 등의 조합이다.
객체 지향 프로그래밍에서 클래스를 기반으로 한 변수를 클래스의 인스턴스라고 지칭한다.

클래스

멤버 변수와 메서드를 가지는 객체를 만들기 위한 확장이 가능한 코드 양식을 의미한다.

즉, 객체를 찍어내기 위한 틀, 설계도이다.

예를 들어, 붕어빵 장사를 한다고 생각해 보자.
나는 붕어빵 장사를 하기 위해 붕어빵틀을 샀다.
그리고 최신 유행에 맞춰 안에는 팥 앙금을 제외하고도 슈크림, 콘치즈, 고구마, 피자 등등 다양한 토핑을 추가했다.
10개의 붕어빵을 주문에 따라 만들었다. 안에 들어있는 내용은 10개 모두가 다르다.
하지만, 공통적인 속성으로 만들어지는 과정(기능)과 맛(팥, 슈크림, 콘치즈) 등을 가지고 있다.

여기서 '붕어빵을 구워내는 틀'이 클래스이며, 생성된 각 붕어빵 객체들을 붕어빵 클래스에서 생성되었다고 말할 수 있다.

인스턴스

인스턴스는 클래스(설계도)를 바탕으로 실체화되어 메모리에 할당된 실체를 의미한다.

이렇게 설명이 끝난다면, 객체와 똑같은 것 아닌가? 라고 생각할 수도 있다.
객체는 소프트웨어 세계에 구현할 대상이고, 설계도에 따라 소프트웨어 세계에 구현된 실체가 인스턴스이다.

즉, 인스턴스는 객체에 포함된다고 볼 수도 있다.

OOP의 장점

객체 지향적으로 프로그래밍할 때의 장점은 서두에 언급했듯이, 프로그램을 보다 유연하고 변경이 용이하게 만들수 있다는 점이다.

예를 들어, 컴퓨터 본체의 성능을 업그레이드 하고 싶은 경우에 특정 부품만을 교체하고 나머지 부품들을 건드리지 않아도 되는 것과 같다.

소프트웨어를 설계할 때, 객체 지향적 원리를 제대로 활용한다면 프로그램은 각각의 부품이 독립적으로 행동을 하기 때문에 코드의 변경을 최소화하고 유지보수 하는 데에 굉장한 이점을 가진다.

또한, 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현할 수 있다.

여기서 객체 지향 프로그램의 특성을 최대한 살리기 위해 여러 방향으로 발전해 왔는데, 대표적인 4가지 특징으로 추상화, 상속, 다형성, 캡슐화가 있다.

OOP의 단점

절차지향언어에 비해서 실행속도가 느리다.
설계 초기 단계에서 많은 시간이 필요하다.
해당 부분에 대해서는 실제로 우테코 프리코스를 진행하며 많이 느꼈다.
제대로 설계하지 않고 개발을 시작하면 오히려 코드의 가독성이 더욱 안 좋아졌던 경험이 있다.

OOP의 단점을 해결하려면 제대로 된 설계와 최적화를 최대한 잘하는 것이 중요한 것 같다.

References
https://developer.mozilla.org/ko/docs/Glossary/OOP
https://ko.wikipedia.org/wiki/객체_지향_프로그래밍
https://facingissuesonit.com/2019/09/21/java-oops-concepts/

profile
반갑습니다.

0개의 댓글