Sam Story

객체지향 프로그래밍 본문

개발지식

객체지향 프로그래밍

Sam H 2024. 9. 23. 17:29

오늘은 객체지향 프로그래밍 (OOP)에 대해서

간단히 포스팅 해보려 한다.


이제막 프로그래밍을 배우기 시작한 내수준 에서는

단순히 객체는 실제로 존재하는 것들이고

내가 원하는걸 객체로 만들고 이러한 객체들을 이용해

프로그래밍을 한다 정도로 이해했던것 같다.

 

하지만 조금 더 공부하면 공부할수록 더욱 심오한 내용들이 있다는 걸

오늘 포스팅 해보려 한다.

 

객체지향 프로그래밍이란?

 

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라,
프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 
이들의 상호 작용으로 서술하는 방식이다. 

 

왜 객체지향 프로그래밍을 사용하게 되었는가?

 

초기 프로그래밍 방식은 절차적 프로그래밍 방식이었다.

프로그램 자체가 가지는 기능에 대해서만 신경을 썼지, 

이 프로그램이 대체 어떤 데이터를 취급하는 것인가에는 그다지 관심이 없었던 것이다.


조금만 복잡해지면 순서도로 나타내는 것이 불가능할 정도로 꼬인 "스파게티 코드"를 만들게 된다.

대표적인 예시로 본인이 이제막 Java를 배울 때 만든 프로젝트다.

놀랍게도 메인 메서드의 내용이다. 600줄 정도 , 좌측 클래스는 대략 60개 정도됨.

 

이렇게 꼬여버린 코드는 다른 사람이 보고 이해하는 것이 거의 불가능할뿐더러

심지어는 작성한 본인조차도 유지 보수에 어려움을 겪게 된다.

(이는 개발공부 하는 모두가 본인 예전 프로젝트를 보면 느낄 것이다..)

 

코드의 양이 많아지는 것은 기본이고,

특정 코드 부분은 어디에 사용되는 코드고

해당 코드 부분은 어디까지 이어지는지의 흐름을 파악하기도 힘들어지며,

중복 코드 대처도 매우 골치 아프다.

 

이러한 프로그램을 작은 단위로 나뉘어 호출을 하는 방식으로 바뀌었다가

 

최종적으로 이를 극복하기 위한 대안으로 등장한 것이 바로 객체 지향 프로그래밍이다.

큰 문제를 작게 쪼개는 것이 아니라, 

먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 

이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것이다. 

 

이 객체란 것을 일단 한번 독립성/신뢰성이 높게 만들어 놓기만 하면 

그 이후엔 그 객체를 수정 없이 재사용할 수 있으므로 개발 기간과 비용이 대폭 줄어들게 된다.

 

이런 객체지향프로그래밍이 복잡해지면서 이를 간결하게 정리할 필요성이 생겨서 나온게 디자인 패턴이다.

프로그래밍 형식을 정하는 일종의 약속으로, 

이는 협업을 전제로 한 환경에서 특히 강조되고 있다.

 

 

이러한 객체지향 프로그래밍에는 4가지 특징과 5가지 원칙이 있다.

오늘 포스팅에는 4가지 특징에 대해서만 다루고

5가지 원칙에 대해서는 다음 포스팅에서 다루어 보겠다.

 

특징

 

1. 캡슐화

캡슐화란 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호한다.

 

자바 객체 지향 프로그래밍에서 이렇게 캡슐화를 하는 이유로 크게 두 가지를 언급할 수 있다.

  • 데이터 보호(data protection) – 외부로부터 클래스에 정의된 속성과 기능들을 보호
  • 데이터 은닉(data hiding) – 내부의 동작을 감추고 외부에는 필요한 부분만 노출

자바 객체 지향 프로그래밍에서 캡슐화를 구현하기 위한 방법은 크게 두 가지가 있다.

 

1. 접근제어자(access modifiers)를 활용하는 것

 

접근제어자는 클래스 또는 클래스의 내부의 멤버들에 사용되어 해당 

클래스나 멤버들을 외부에서 접근하지 못하도록 접근을 제한하는 역할을 한다

 

2. getter() setter()를 활용

 

모든 속성값들이 private 접근 제어자로 선언되어 있고, 

getter/setter 메서드의 접근제어자만이 public 으로 열어놓고

선택적으로 외부에 접근을 허용할 속성과 그렇지 않을 속성을 getter/setter 메서드를 통해 설정해줄 수 있다.

 

이러한 캡슐화를 하지않고 작성하게 되면 객체 간의 결합도가 높은 상태가 될 수 있다.

객체간 결합도가 높아지게 되면 유지보수 하는데 여러 문제가 발생할 수 있기 때문에

 

이렇게 캡슐화를 활용하면, 객체 내부의 동작의 외부로의 노출을 최소화하여 각 객체의 자율성을 높이고,

이를 통해 객체 간 결합도를 낮추어 앞서 설명한 객체 지향의 핵심적인 이점을

잘 살리는 방법으로 프로그램을 설계하는 일이 가능하다.

 

2. 상속

상속 기존의 클래스를 '재사용'하여 새로운 클래스를 작성하는 기법

 

파생 클래스가 기초 클래스의 기능을 받아 쓰는 것이라고 이해하면 쉽다.

이럴 땐 파생 클래스는 기초 클래스의 기능을 받았으므로 기초클래스의 기능도 쓸 수 있게 된다.

상속하는 클래스는 '슈퍼 클래스', '부모 클래스' 등으로 부르고,

상속받는 클래스는 '서브 클래스', '자식 클래스' 등으로 부른다.

 

보통 상위 객체가 있고 그 상위 객체들의 속성,메서드를 상속받는

하위 클래스스들을 만들어서 각 클래스들의 결합도를 낮춰서 유지보수성을 높인다.

 

3. 다형성

다형성 이름 그대로 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미한다.

대표적인 예로 메서드 오버라이딩 메서드 오버로딩(method overloading)이 있다.

 

1. 메서드 오버라이딩

부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 것을 말한다.

이를 통해 자식 클래스는 부모 클래스의 메서드를 재활용하면서, 독자적인 기능을 추가할 수 있다.

 

2. 메서드 오버로딩

같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용하는 것을 말한다.

오버로딩은 메서드 이름을 동일하게 유지하면서도, 다양한 상황에서 유연하게 대응할 수 있는 방법을 제공합니다.

 

다형성을 사용하는 것은 코드의 재사용성과 유연성을 높여주지만,

코드의 복잡성과 디버깅 어려움, 성능 손실 등의 단점이 발생할 수 있으므로,

다형성을 적절하게 사용하는 것이 중요하다.

 

적절한 다형성을 사용하면 코드의 재사용성과 유연성을 높이고,

불필요한 코드 중복과 결합도를 낮춰 유지보수성을 높일 수 있다.

 

4. 추상화

추상이라는 용어의 사전적 의미를 보면

 “사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”이라 정의한다.

여기서 핵심이 되는 개념은 “공통성과 본질을 모아 추출”한다는 것이다.

 

객체 지향 프로그래밍에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는것을 의미

인터페이스에는 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 

실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것을 의미

 

 

이러한 객체지향 프로그래밍의 특징의 내용들을

처음 프로그래밍을 하는 단계에서는 응용하거나 상황에 맞게 사용하지 않았었고

 

공부를 하면서 점차 은연중에 의식하게 되었었던것 같다.

 

다음은 객체지향의 원칙5가지

SOLID에 대해서 포스팅 해보겠다.

'개발지식' 카테고리의 다른 글

객체지향 프로그래밍 SOLID 원칙  (1) 2024.09.24
REST,REST API  (0) 2024.08.21
엔진엑스 (NGINX)  (0) 2024.05.08
아파치 (Apache)  (1) 2024.05.01
동기 , 비동기 (Synchronous , Asynchronous)  (0) 2024.04.24