객체 지향 프로그래밍이란?
우리가 보고 느끼고 인지할 수 있는 모든 것을 객체(Object)라고 한다.
객체 지향 프로그래밍(OOP, Object Oriented Programming)은 현실 세계에서의 객체를 모델링하여 프로그래밍하는 방이다. 즉, 객체 지향 언어는 프로그램을 객체라는 작은 조각으로 나누고, 이러한 객체들이 서로 상호 작용하며 프로그램을 구성하는 방식을 의미한다.
“어떤 기능을 어떤 순서로 할 것인가?”에 초점을 둔 절차 지향 언어와 달리 객체가 중심이 되어 “어떤 객체가 어떤 기능을 할 것인가?”가 중심이 된다.
프로그래밍에서 필요한 데이터를 한 데 모아 속성(attribute)과 행위(behavior)를 가진 객체를 만든다. 속성은 객체의 상태를 나타내며, 행위는 객체가 수행할 수 있는 동작을 나타낸다. 이렇게 객체의 특징을 찾아 간단하게 만드는 것, 복잡한 시스템 또는 문제를 간소화하여 이해하기 쉽도록 만드는 과정을 추상화라고 한다.
예를 들어, 휴대폰을 추상화 하면 휴대폰의 복잡한 내부 동작과 기술적인 부분을 모두 숨기고 전화걸기, 문자 보내기, 어플 켜기 등의 기능을 중심으로 생각한다는 것이다. 휴대폰 객체를 생성할 때는 휴대폰의 내부 구조나 동작 방식, 즉 모바일 통신망, 라우팅, 데이터 패킷 전송 등에 대한 지식이 필요하지 않다. 휴대폰 객체의 전화 걸기 메소드를 호출하면, 휴대폰은 내부적으로 전화를 걸고 통화가 이루어 진다. 휴대폰을 추상화하면, 사용자는 휴대폰의 기술적인 부분을 신경쓰지 않고, 휴대폰의 기능을 쉽게 사용할 수 있다.
객체 지향 언어에서는 이러한 객체를 클래스(class)라는 템플릿으로 정의한다. 클래스는 객체의 속성과 행위를 정의하며, 이를 기반으로 객체를 생성할 수 있다. 예시로 위의 휴대폰 클래스를 정의하면 이를 기반으로 여러 휴대폰 객체를 생성할 수 있다.
객체 지향 언어의 장점은 코드의 재사용성과 유지 보수성이 뛰어나다는 것이다. 객체 지향 언어를 사용하면 여러 개의 객체를 만들어서 각각의 객체가 독립적으로 동작하며, 객체 간의 상호작용을 통해 프로그램을 구성할 수 있다. 이렇게 객체 지향적인 방식으로 프로그램을 작성하면 코드의 재사용성과 유지 보수성이 증가하며, 코드의 가독성도 좋아진다.
객체 지향 프로그래밍의 속성
객체 지향 프로그래밍은 크게 총 다섯가지의 속성을 가진다.
- 추상화
- 객체들의 공통적인 특징(기능, 속성)만 모아놓은 것
- 클래스를 정의하는 것을 할 수 있다. - 캡슐화
- 데이터와 데이터를 처리하는 행동을 하나로 묶어 관리하는 것이다.
- 추상화와 연관된 개념으로 실제로 구현되는 부분으로 외부에 드러나지 않도록 정보를 은닉할 수 있다.
- 객체들 간 메세지를 주고받을 때, 해당 객체의 세부 내용을 알 필요가 없기에 인터페이스가 단순해지고 결합도가 낮아진다.
- 캡슐화된 객체들은 이로 인해 재사용이 편리하다 - 정보 은닉
- 다른 객체에 자신의 데이터를 숨기고 정의한 행동만을 통해 접근을 허용한다. - 상속성
- 상위 클래스가 가진 특징(함수, 데이터)을 하위 클래스가 그대로 물려받는 것
- 상위 클래스의 데이터와 행동을 다시 정의하지 않아도 된다.
- 기존 코드를 재활용함으로 재사용을 증대시킨다. - 다형성
- 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
- 오버라이딩(Overriding)과 오버로딩(Overloading)이 있다.
- 오버라이딩 : 같은 이름을 사용함으로 재정의 시키는 것
- 오버로딩 : 같은 이름의 함수를 여러 개 정의 후 매개변수를 다르게 하여 호출
객체 지향 프로그래밍이 무엇인지 이해하는 것만으로도 매우매우매우 오랜 시간이 걸린다. 🫠 클래스, 메소드, 등 뒤에서 더 공부 해봐야지~ 화이팅
개념을 하나 이해하는데 시간이 매우매우 오래 걸리는 편이기도 하고 모르는 단어가 나오면 또 검색하고 검색하다 보면 시간이 언제 훅~ 지나가버리는지 모르겠다!
추상화에 대해 원래 알던 것과 조금 다른 부분이 있어 이해하는데 시간이 꽤 걸렸다. 정처기 공부하면서는 사실 왜 객체 지향 프로그래밍이 모두 연관성이 있는 거고 추상화랑 연관이 있는 거지? 라고 생각했던 것들 또한 정리가 쉽게 된 것 같아 좋다 : )
'LANGUAGE > JAVA' 카테고리의 다른 글
[JAVA] 필드(Field)와 메서드(Method) / 변수의 구분 (0) | 2023.04.22 |
---|---|
[JAVA] 클래스(Class) 와 객체(Object) / 객체와 인스턴스의 차이 (0) | 2023.04.21 |
[JAVA] JAVA 배열(Array) 기본 개념 / 배열이란? 배열 생성 방법 (0) | 2023.04.21 |
[JAVA] JAVA 제어문 - 반복문(while) / do-while구문 (0) | 2023.04.19 |
[JAVA] JAVA 제어문 - 반복문(for) (2) | 2023.04.19 |