It Study/POWER JAVA(기본서)

POWER JAVA (개념) - 객체 지향 프로그래밍이란?

prlkt5200 2022. 9. 29. 19:26
반응형

power java 책을 읽으면서, 제 나름대로 핵심을 요약해 봤습니다! 

(요약이라 해놓고 글이 많아 읽기 힘드시겠으나 그래도 완전 생초짜분들에게는 도움이 안되지는 않을 것이니 정독해주시면, 감사하겠습니다.)

많은 분들께 그리고 저 자신에게도 도움이 되길 바라면서 글을 시작하겠습니다.

(이 글은 power java의 4.1 객체지향 프로그래밍이란? 에서 인용하고 참고한 글입니다.)

 

 

객체: 객체 지향 기술의 핵심개념입니다. 이 객체란 것은 상태와 동작을 가지고 있는데,

예를들어 TV로 비유하면, 상태는 채널 번호, 볼륨, 전원 상태와 같은 것들을.

기능은 켜기, 끄기, 채널 변경하기, 볼륨 변경하기를 의미합니다.

 

즉 말 그대로 상태와 기능을 의미하니 복잡하게 생각할 필요는 없습니다.

그리고 프로그래밍에서 객체란 이 상태와 기능을 묶어놓은 하나의 단위라고 생각하시면 편합니다.

 

그렇다면!! 이 객체지향이 왜 중요한지 설명해 보겠습니다.

 

객체지향을 설명하기 전에 절차지향을 설명해야할 듯 싶은데...사실 제가 읽어도 잘은 모르겠더라고요

그래서 간단히 말하면

절차지향은 위에서 아래로 순서대로 흘러가는 프로그래밍 기법이라 이해하시면 됩니다. 이러한 기법을 사용하는 언어는

c언어가 대표적으로 있겠습니다!

절차지향 프로그래밍에서 프로그래밍을 설계할 때는 탑다운 방식을 사용한다고 합니다. 이는 복잡한 문제를 더 간단한문제로 잘게 부숴서 그 간단한 문제를 하나의 함수로 구현하는 것입니다. 마치 우리가 음식물을 소화하기 쉽게 저작활동을 하는 것처럼요.

대신 이 기법에는 문제가 있습니다. 이 기법은 객체지향의 객체처럼 데이터와 함수를(아! 여기서 데이터는 객체의 상태. 함수는 기능이라고 보시면 됩니다.) 묶어놓을 방법이 없습니다. 

 

그렇다면 데이터와 함수가 분리되어 있는 것은 왜 단점일까요??

그것은 IT 프로그래밍 세계?에서는 수많은 그리고 다양한 코드들이 있다는 점 때문일 거라 저는 생각합니다. 

절차지향은 복잡한 문제를 가장 단순한 문제로 분해해서 1개의 단순한 문제를 함수로 구현하는 방식입니다. 그런 상황에서 데이터 없이는 동작할 수 없으니까 데이터는 있되, 묶어주지 못하기에 데이터와 함수는 분리되어 있는 상황입니다. 그리고 프로그램이란 것은 특히 컴퓨터 친화적인 저수준 언어에서는 가뜩이나 코드가 길고 복잡한데, 이 데이터와 함수가 지저분하게 혼잡하게 있으니

개인이나 기업이 새로운 프로그램을 만들기 위해서 다름 사람의 코드. 그중에서도 함수들의 일부만 떼오고 싶어도 그러지를 못하는 상황이 발생하게 됩니다.(책에서는 함수를 분리하는 게 상당히 힘들다고 했으니 완전히 불가능한 것은 아니나 아주 힘들다는 얘기인듯 싶습니다.)

따라서 프로그램을 만들기 위해서 1부터 10까지 다시 처음부터 작성해야 하는 비효율적이고 힘든 상황이 오게 되는 것입니다.  

 

그래서 이를 해결하기 위한 방식이 바로 객체 지향 방식입니다!

이 객체지향 프로그래밍은 관련 있는 데이터와 함수를 하나로 묶은 형태. 즉 객체를 다른 객체와 상호 작용하게 프로그래밍을 하고 활용하는 방식의 기법입니다.

우리가 조립식 컴퓨터를 위해 호환되는 부품을 조립하는 것처럼, 또는 자동차 기존 모델의 다른 기능을 추가하거나 불필요한 기능을 삭제시키는 것처럼, 이 객체지향 프로그래밍은 객체끼리 조합하고 해서 더 효율적이고 더 간다하거나 복잡하게 만들 수 있게 된 것입니다.

그래서 절차지향에서 객체 지향 프로그래밍을 사람들이 선호하게 되고 발전하게 되었다고 합니다.(그랬던 것 같습니다...)

 

 

 

객체지향이 왜 중요한 건지 설명했으니 이것의 중요한 속성들을 소개하고 글을 마치겠습니다!!

캡슐화, 다형성, 상속, 추상화

 

캡슐화: 관련있는 데이터와 함수를 하나로 묶은, 마치 캡슐과 같은 형태를 유지함으로써 필요시 원하는 때에 원하는 약을 먹는 것처럼.  필요시 원하는 데이터와 기능을 쓸 수 있게 만든다는 특징이 있으며, 캡슐화에는 한가지 더 중요한 특성이 있는데 그것은 정보 은닉입니다.

객체 안의 데이터값들(데이터와 함수.)을 외부에서 접근 못하도록 해서 훼손되지 못하게 막고, 공개된 이터페이스를 통해서만 객체에 접근시키는 것. 즉 외부 객체는 메소드를 통해 간접적으로 값을 전달받아야 합니다.

(설명하는 게 늦었는데, 프로그래밍에서 데이터, 객체의 상태, 필드, 속성은 다 같은 의미로 생각하셔도 무방할 것 같습니다. 또 함수, 객체의 기능, 메소드도 같은 의미로 생각하시면 좋을 것 같습니다.)

 

다형성: 같은 이름의 동작임에도 객체가 무엇이냐에 따라서 동작의 내용이 달라지는 것을 말합니다. 예를들어 

speak();라는 메소드(동작, 기능, 함수)가 있는데 객체가 강아지냐 그 밖에 다른 동물이냐에 따라 짖는  소리가 틀려지는 것이죠!

 

상속: 부모 클래스로 부터 모든 속성과 기능들을 물려받는 것을 의미합니다. 하지만 자식이 부모를 닮을 수는 있어도 세부적인 부분은 틀릴 수도 있겠죠?? 그처럼 자식 클래스는 부모 클래스와 공통 속성과 기능은 가지되 고유 속성과 기능을 가질 수도 있습니다. 그리고 꼭 부모 클래스 뿐만 아니라 다른 사람의 클래스를 상속받는 것도 가능합니다ㅎㅎ

 

추상화: TV나 자동차처럼 실제 세상에 있는 이 객체들은 (그 밖에도 여러 객체들은) 많은 법칙과 순서를 가지고 작동할 것입니다. 파고들면 그 내부 기능이나 작용은 엄청나게 복잡하겠죠 ;; 

그것을 프로그래밍으로 전부구현한다고 생각하면 끔찍하기도 할거고, 불가능에 가까울 수도 있을 것 같습니다. 그것을 방지하기 위한 것이 추상화라 합니다. 

우리가 알고 있는 실객체의 핵심적인 기능만을 구현화 한다는 것입니다. 예를들어 TV를 구현하면 그 내부 부품 전부 구현이 아닌 기본적인 속성(볼륨, 화면 상태 등등)과 기본적인 기능(볼륨 업-다운, 화면 온-오프)들로 대략적으로 무엇이다!를 나타내는 것입니다. 한마디로 복잡한 실객체를 그보다 간단하게 추상화 하는 것입니다.

예를 들어 사람 얼굴을 캐리커쳐로 그리는 것과 비슷한 것입니다.

 

ps: 어떻게 제 나름대로 공부 내용을 요약해 봤는데, 정확한지는 잘모르겠내요 ㅎㅎ... 만약 수정이 필요한 부분은 말씀해주세요 기꺼운 마음으로 고쳐나가겠습니다!! 그리고 클래스의 개념은 이곳에서 참고해주시길 바라겠습니다. - https://forfire700.tistory.com/32)

반응형