오브젝트 오리엔티드 프로그래밍

진제랄·2023년 5월 31일
0
post-thumbnail

객체지향언어란 무엇일까?

우선 우리나라 단어들은 80%이상이 한자어로 구성되어있다. 즉 한자말을 이해하면 단어를 어느 정도 이해할 수 있다.
客體指向 손님 객 자에 몸 체 자를 써 객체라는 것은 하나의 개성을 가진 것이며 사람이나 물건, 개념이 될 수 있다. 어떠한 문제를 해결해 나갈 때 기본이 되는 단위라 할 수 있다. 그렇다면 이 객체를 지향한다는 뜻은 프로그램을 만들어 나갈 때 기능을 수행을 하거나 받는 물건, 개념, 사람 등 객체가 바로 주요 관점이 된다는 뜻이다.

그래서 이 객체지향언어가 처음 만들어진 이유도 매우 흥미롭다. 군사모의실험(워게임)을 할 때 병사, 무기, 전차, 지형, 날씨 등을 객체로 표현하여 가상세계를 구현하려고 만들어졌다고 한다. 이렇게 만들어진 객체지향 방식을 일상적인 상황에서도 용이하게 쓸 수 있기에 컴퓨터 프로그래밍 언어로 발전되어졌다. 자바같은 언어는 그중 개발자들에게 가장 사랑받는 언어라고 할 수 있다.


그렇다면 객체지향언어에는 어떠한 장점이 있어서 사람들이 널리 사용하는지 알아보도록 하자. 우선 첫번째는 재사용성이 높다는 것이다.
위에 군사모의실험을 예시로 든다면 내가 ‘병사’를 계급, 능력, 권한 등의 특징으로 객체를 정의해놓았다고 가정을 하겠다. 그럼 이등병, 일병, 상병, 병장 등 생성하기 용이롭게 만들어 놓았을 것이다. 그렇다면 이제 새롭게 ‘간부’라는 객체를 추가하기 위해서 또 다시 계급, 능력, 권한 등의 특징을 새로히 정의할 필요 없이 ‘병사’라는 객체를 정의해 놓은 내용을 이어 받아서(상속) ‘간부’라는 객체에 맞게 재사용할 수 있는 것이다. 이렇게 하면 기존의 코드를 재사용하여 새롭게 코드를 작성할 필요가 없기 때문에 쉽고 시간이 절약된다. 이를 객체지향프로그래밍의 상속이라고 표현하며 보통 부모클래스로부터 자식클래스가 변수나 메서드를 상속받을 때 쓰는 표현이다.

더불어 재사용성을 높히는 특징 중 하나인 다형성이 있다. 다형성이란 단어 역시 한자로 이루어 져있다. 多形性 많을 다에 모양 형자를 써서 여러 형태를 띄는 성질이라는 뜻이다. 이 뜻대로 객체지향프로그래밍에서 다형성이란 객체가 다양한 형태를 가지는 성질을 말한다. 이를 통해 하나의 메서드가 다양한 객체에 의해 호출될 수 있으며 코드의 재사용성을 높힐 수 있다. 또한 객체의 타입에 상관없이 동일한 메서드를 호출할 수 있으며 유지보수성을 높힐 수 있다. 다형성의 예로는 개발자 스터디 그룹에 직장인과 대학생이 있고 이 사람들을 게임의 캐릭터로 만들어 자기 소개를 하는 상황을 만든다고 하였을 때 각각 Worker클래스와 Student클래스로 정의하고 나이, 직업, 취미 등의 속성을 가지고 있고 introducible이라는 인터페이스를 상속받아 introducing()이라는 메서드를 통해 공통적으로 자기소개를 할 수 있다고 가정해보자. 이때 갑자기 스터디 그룹에 어떠한 회사 사장님도 참가를 하여 같이 공부를 하기로 하였다. 그래서 Owner클래스를 추가하였고 해당 클래스에는 나이, 직업, 취미 뿐만아니라 사장님의 재산, 직원 수 등의 기존 클래스들과 다른 속성들을 가지고 있다. 하지만 introducible이라는 인터페이스를 상속받으면 다른 클래스와 같이 introducing() 이라는 메서드를 사용하여 자기소개를 똑같이 할 수 있게 된다. 이처럼 하나의 메서드가 여러 객체에서 사용될 수 있는 다형성을 띄게 된다.


두번째 특징으로 ‘캡슐화’ 라는 특징이 있는데 이는 클래스의 데이터와 기능을 하나의 캡슐처럼 묶고 외부의 접근으로 부터 데이터를 보호하는 기능이라고 할 수 있다. 이 역시 어떠한 특징인지 이해가 힘들기 때문에 은행의 예금을 예시로 들어 보겠다. 예금이란 개인이 소유하고 있는 재산이기 때문에 본인의 지출과 수입 등이 아닌 다른 이유로 액수가 달라지면 안된다. 여기서 캡슐화라는 특징을 사용할 수 있다. 캡슐화를 시켜 보호해야하는 데이터를 개인의 예금이라 할 수 있고 그 기능을 지출(출금)과 수입(입금)이라고 할 수 있다.
Account라는 클래스를 정의하고 balance라는 예금을 뜻하는 멤버변수를 private이라는 접근제한자를 통해 외부에서 접근할 수 없도록 선언해놓고 deposit이라는 입금 메서드와 withdraw라는 출금 메서드를 정의해놓구 리턴으로 잔액(balance)을 표시해줄 수 있게끔 해놓는 다면 외부에서 balance라는 멤버변수를 호출하여 임의로 데이터를 바꾸는 것을 방지 할 수 있고 오직 Account라는 클래스에서 정의해놓은 메서드를 통해서만 해당 데이터에 영향을 줄 수 있기때문에 데이터의 무분별한 변경과 문제를 예방할 수 있다.


세번째 특징으로는 ‘추상화’라는 특징이 있다. 추상 역시 한자어가 있다. 抽象
뽑을 추자에 꼴, 모양 상자를 쓰고 있다. 즉 모양이나 특징을 뽑아 낸다는 뜻인데 사전적 의미는 “여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용” 이라는 뜻이다. 이처럼 추상화란 복잡한 세부사항은 감추고 핵심적인 속성과 기능만을 표현하는 기술이다.추상화를 사용하면 프로그램의 복잡성을 낮추고 필요한 요소에만 명확하게 집중할 수 있다.
예를 들어, 차량을 조작하는 프로그램에서 기본적인 차량 기능에 대한 추상클래스 Vehicle을 생성하고 여기에 차량의 필수적인 공통 속성과 기능이 정의되어 있고 구체적인 차량은 이 클래스를 상속받아 구현한다. 추상클래스 Vehicle은 brand라는 속성을 가지고 있고 start()와 stop()이라는 추상 메서드가 정의되어 있다. 이제 Car라는 클래스와 Motorcycle이라는 클래스는 Vehicle 추상클래스를 상속받아 brand속성을 정의하고 start()와 stop()이라는 메서드를 구체적으로 정의하여 사용할 수 있다. 여기서 Car 클래스는 자동차라는 특징을 살려 메서드를 구체적으로 정의할 수 있을 것이고 Motorcycle 클래스는 오토바이라는 특징을 살려 메서드를 구체적으로 정의할 수 있다. 뿐만아니라 여러가지 다양한 이동수단이 Vehicle이라는 추상클래스를 상속받아 공통된 코드는 수정할 필요없이 사용할 수 있어 유지보수에 효과적이라고 할 수 있다.

이로써 객체지향프로그램밍에 대해 알아보았다. 단어가 가진 어려운 느낌때문에 처음엔 다소 낯설어보였지만 여러가지 예시를 들어 공부하여보니 어렵다는 느낌보다는 이렇게 만들어질 수 밖에 없는 이유가 있었구나 라는 느낌이 훨씬 더 지배적으로 들었다. 나라도 이런 여러가지 객체들을 정의하고 계속해서 용이하게 사용하려면 이런식으로 프로그래밍을 할 수 밖에 없었겠다라는 생각? 이 들곤 한다. 앞으로 자바 코드를 작성하면서 내가 충분히 객체지향적으로 코드를 쓰고 있는지 어떠한 로직을 정의할 때도 충분히 객체지향적 특징을 고려하여 효율적으로 접근하고 있는지 체크하면서 작업을 한다면 건강한 코드와 미래가 다가올 것 같다.

profile
코딩 잘하고 싶다 우헤헤헹

0개의 댓글