본문 바로가기
Java

객체지향의 기본 다시 다지기 - 01

by 돈민찌 2021. 11. 8.
반응형

객체지향프로그래밍 (Object Oriented Programming)은 파이썬을 배울 때부터 지속적으로 자주 나타나는 개념인데, 이번에 한번 정리하고 넘어가보자. 자 우선 객체지향의 정의부터 알아보자.

객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

프로그램을 명령어, 코드의 뭉치로 보는 시각에서 벗어나서, 여러 개의 독립된 단위들의 모임, 그리고 그 사이에서 일어나는 현상과 작용에 대한 시각으로 옮겨가는 시점이다. 파이썬을 배울 당시에 기본으로 배운 개념이기는 하지만 자바 공부를 하면서 한번 더 되새겨 보는 시간을 가진다. 

Simula67  모든 것이 객체로 표현되는 프로그래밍 패러다임을 가진, 최초의 객체 지향 프로그래밍 언어로 여겨진다.
Smalltalk 최초의 진정한(실질적인 원조) 객체 지향 프로그래밍 언어로 여겨진다.

자바는 모든 코드가 객체로 구성된 객체지향언어의 대표격이다. 그 외에 C#, C++(C에 클래스를 더함), 파이썬, PHP 등이 있다. 이 중에 파이썬을 할 줄 아는 입장에서 파이썬이 자바에 비하면 객체 지향적인 성격이 꽤 약한 편이라는 생각이 든다. 마음만 먹으면 class를 한번도 안 쓰는 "명령어뭉치" 코드만으로 프로그램을 짤 수 있는 파이썬은 객체지향언어와 절차지향언어의 성격을 모두 가지고 있는 것 같다.

객체 지향 프로그래밍의 주요 목적은 무엇일까? 코드만 복잡해지는 것 같은데 왜 이런 것을 쓰는 걸까?

실제 세상에 모든 사물과 생물들은 하나의 객체이다. (사람이 말로 표현할 수 있는 어떤 대상은 유형이든 무형이든 객체이다!!!) 어떤 종의 개라도 짖고, 네 발로 뛰어다니고, 꼬리를 흔들 줄 알 것이다. 그것은 그 개의 부모로부터, 또, "개"라는 종으로부터 상속받은 것이고, 그 상속은 계속 이어질 것이다. 프로그램에서 개를 구현한다고 하면, 모든 개마다 어떤 소리로 짖고, 어떻게 뛰어다니고 하나하나를 기록하는 것보다 개라는 종에 대해 정의한 후에 그것을 참조하고, 또 어떤 개는 그것에 더해서 발에 물갈퀴가 있다! (골든 리트리버)라던가, 사실은 짧은 토끼 꼬리가 아니라 풍성한 여우꼬리를 가졌다! (웰시코기) 같은 속성을 추가하는 것이 더 효율적이고 실제와 흡사할 것이다. 이처럼 객체 지향 프로그래밍(OOP)의 주요 목적은 모든 객체가 가진 추상적 개념과 상속의 개념, 다형성의 개념 등을 프로그램에서 똑같이 구현하기 위한 접근 방식이라고 할 수 있다.

  • 객체 Object
  • 클래스 Class
  • 상속 Inheritance
  • 다형성 Polymorphism
  • 추상화 Abstraction
  • 캡슐화 Encapsulation

이외에도 객체지향을 다룰 때 언급되는 몇가지의 단어들이 더 있는데, Coupling, Cohesion, Association, Aggregation,  Composition이 있다. 당장 다루기엔 조금 어려운 개념이라 뒤로 미뤄둔다.

객체 지향의 기본 구성 요소 3가지

객체(Object)

클래스의 인스턴스(실제로 메모리상에 할당된 것)이다. 객체는 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다. 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.

클래스(Class)

같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형(user defined data type)이라고 할 수 있다. 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인해야 한다. ((속성 -> Property, 행위 -> Method))

메소드(Method) :: message

클래스로부터 생성된 객체(인스턴스)를 사용하는 '방법'으로, 객체에 내리는 명령이라고 할 수 있다. 메소드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. 또 객체 간의 통신은 메시지(메소드)를 통해 이루어진다.

객체 지향의 주요 특징들

상속

상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스를 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다.
예: 동물이라는 부모 클래스가 있다면, 그 아래의 자식 요소로는 사람도 포함될 수 있고, 곤충들도 포함될 수 있다. 그리고 숨을 쉬고 움직인다-라는 공통점을 제하고는 각자의 고유한 특징을 가질 수 있다.

다형성

다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나 오버로딩(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다. 
예: 동물의 메소드 중에 "물다"라는 것이 있다고 가정하면, 어떤 동물은 날카로운 이빨로 먹잇감을 제압하는 것일 수도 있지만, 모기 따위가 물다-라고 하는 것은 그 개념을 상속받기는 했지만 주사바늘 같은 입으로 고등생물의 혈액을 빨아먹는 것일 수도 있는 것이다.

추상화

추상화는 프로그래머가 복잡성을 줄이고 사용자가 프로그램과 더 효율적으로 상호작용할 수 있도록 객체 또는 인스턴스화된 클래스에 대한 관련 없는 데이터를 숨길 때 발생한다. 휴대폰의 예를 들자면, 당신이 안드로이드 운영체제를 사용하든 iOS를 사용하든, 당신은 당신의 전화기가 인터넷에 접속하거나, 문자 메시지를 보내거나, 비디오 게임을 할 수 있도록 하는 코드와 직접 상호작용하지 않는다. 대신 사용자 환경을 간소화하고 작업을 완료하는 데 필요한 기능과 방법에 쉽게 액세스할 수 있도록 설계된 사용자 인터페이스를 통해 코드와 상호 작용합니다. 이 경우, 인터페이스는 코드의 실제 구현으로부터 추상화되었다고 말할 수 있다.

캡슐화

객체 지향 프로그래밍 언어에서 캡슐화의 개념은 데이터를 하나의 단위로 묶는 방법과 함께 사용자가 특정 객체의 모든 변수와 알고리즘에 대해 접근할 수 없도록 객체의 일부 구성 요소에 대한 직접적인 액세스를 제한하는 매커니즘을 의미하기도 한다. 캡슐화를 사용하여 인스턴스화된 클래스 또는 객체는 내부적인 데이터 멤버 변수와 주요 메소드, 함수를 숨길 수 있다. 
예: 우리가 로봇을 조종한다면 로봇이 어떻게 동작하고 어떻게 에너지를 발생시키는지 모두 알아야 할까? 물론 알 수 있다면 더 좋겠지만, 당장 그것을 조종하는 것이 우선일 수 있다. 그리고 로봇을 만든 사람은 다른 사람들이 그것을 복제할 수 없도록 내부의 동작 구현을 숨길 수 있다.

"추출과 캡슐화는 상호 보완적인 개념이다: 추상화는 관찰 가능한 물체의 행동에 초점을 맞춘다. 캡슐화는 이러한 행동을 발생시키는 구현에 초점을 맞춘다."
Object-Oriented Analysis and Design, Grady Booch.
참고 자료.
https://www.sumologickorea.com/glossary/encapsulation/
https://www.javatpoint.com/java-oops-concepts
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788989383116
https://www.geeksforgeeks.org/association-composition-aggregation-java/
https://stackabuse.com/data-transfer-object-pattern-in-java-implementation-and-mapping/

 

반응형

댓글