객체지향 프로그래밍 (Object-Oriented Programming, OOP)
시작하기에 앞서 객체지향에 대해서 조사하지않고 지금 내 생각을 정리하고 자료를 조사해보기로 한다.
그리고 누군가가 나에게 "객체지향이란게 뭐예요?" 라고 묻는다면 나는 아래와 같이 대답할 것 같다.
( 막 떠오르는 대로 작성이 필수 )
"제가 생각하는 객체지향은 어떠한 무언가를 만들 때,
그것을 일체형으로 만들지 않고 부품별로 나눠서 부품별로 역할을 주는 것이라고 생각합니다.
부품 하나 하나가 객체이며,
객체에 대해 문제가 발생했을 경우 쉽게 유지보수가 가능하게 하며,
무언가에 어떠한 요소를 추가하려고 할 때 쉽게 추가가 가능하게 하는 것 입니다."
지금 당장 내가 생각하는 객체지향이란 다른 사람에게 이렇게 설명할 수 있다.
자 그럼 이게 맞는지 조사를 해본다.
객체지향 프로그래밍(OOP)
은 현실 세계의 개념을 객체(Object)라는 단위로 추상화하여, 객체들 간의 상호작용을 통해 프로그램을 설계하고 구현하는 프로그래밍 패러다임입니다.
객체지향 프로그래밍은 재사용성, 유지보수성, 확장성을 높이는 것을 목표로 하며, 다음과 같은 핵심 개념을 기반으로 합니다.쉽게 설명하면? 객체지향 프로그래밍은 객체를 중심으로 설계하고, 객체 간의 관계를 설정하여 소프트웨어를 유연하고 효율적으로 만드는 방법론입니다.
역시 어렵다. 객체지향이란 이해하기에 참 어렵다...
하지만! 이렇게 정의된 내용을 내 스타일 대로 변경을 시도해보겠다.
내가 위해서 설명한건 자바 핵심 개념중 아래를 만족한다.
"모듈화(Modularity)" : 체형으로 만들지 않고 부품별로 나눠서 부품별로 역할을 주는 것 -> 객체지향의 유연성과 책임 분리의 결과
"유지보수성(Maintainability)" : 객체에 대해 문제가 발생했을 경우 쉽게 유지보수가 가능하게 하며
"확장성(Extensibility)" : 무언가에 어떠한 요소를 추가하려고 할 때 쉽게 추가가 가능하게 하는 것 입니다.
위에 3개는 개념이 아니다. OOP 의 목표이자 장점이다...
즉 나는 개념을 하나도 작성하지 않고 목표이자 장점만 넣었던 것이다.
(멍청하게도...)
내 스타일대로 정리하는 객체지향이기 때문에 나만의 이해방식을 사용합니다.
캡슐화(Encapsulation): 자동차 내부의 엔진, 변속기, 전자 시스템 등의 복잡한 구조는 외부에서 직접 접근할 수 없고, 운전자는 핸들과 페달 등의 인터페이스만을 통해 제어한다.
상속(Inheritance): 차량( 전기차 / 스포츠카 / 일반 )
다형성(Polymorphism): 차량( 일반차량 브레이크 / 스포츠카 브레이크 )는 개념은 같지만 작동방식은 다름
추상화(Abstraction): 운전자는 자동차가 움직이는 원리를 알 필요가 없다. 악셀을 밟으면 가속 만 알면 된다.
최종적으로 개념을 추가해서 조금더 보충한 내 생각
객체지향이란, 무언가를 만들 때 일체형으로 만들지 않고 여러개의 부품처럼 나눈 것 입니다.
예를 들어,
음악 재생기를 만든다고 하면,
음악 파일, 재생 버튼,일시 정지 버튼,볼륨 조절기
같은 각 부품들이 자기 역할을 가지고 있어요. 이때 각 부품이 객체가 됩니다.
볼륨 조절기는 볼륨 값을 내부에서 관리하면서,
외부에서는 올리거나 내리거나 직접적으로 하는게 아닌 인터페이스로 조절을 합니다.
이게 캡슐화 입니다.
음악 재생기는 MP3로 실행하고 싶다면 그게 맞는 방식, WAV 형식이면 또 다른 방식으로 처리하는 것 입니다.
즉, 같은 메서드로 다양한 동작을 만드는 것
이게 다형성 입니다.
음악 재생기가 기본적인 기능을 제공한다면 이를 사용하여 고급 재생기를 만들 수 있습니다.
가사 표시, 셔플 재생을 추가한다고 해도 기본적인 기능을 제공을 하면서 추가적인 기능을 제공하는 걸 상속이라고 합니다.
음악 재생기의 재생 버튼을 누른다고 사용자가 어떻게 작동하는지 알 필요는 없습니다.
그냥 음악이 실행되면 되는거예요.
기능이 실행되고 세부적인 구현은 감춰지는 것이 추상화입니다.
결국, 객체지향은 시스템을 작은 부품들로 나누고,
각 부품이 독립적으로 역할을 하면서도 서로 협력할 수 있게 해줍니다.
그리고, 문제가 생기면 한 부품만 고치면 되고,
새로운 기능을 추가할 때도 기존 기능에 영향을 주지 않으면서 유연하게 확장할 수 있습니다."
이렇게 설명은 했지만, 완벽하게 이해하려면 시간을 걸릴 것 같다.
아직 누군가에게 설명할때는 개념적인 부분까지 설명해야할까 싶기도 하다.