Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

forest_moon

객체지향이란? 본문

JAVA

객체지향이란?

rokga 2023. 2. 6. 14:48

그 놈 의  객 체 지 향 이 란 ?  하하하하하

가장 많이 들어본 단어 인거 같다

또 면접에서 꼬리 물리면서 제일 진땀을 빼게 했던 단어이다. 

 

객체 지향(Object oriented) 프로그래밍이란? 

우리가 실생활에서 쓰는 모든 것을 객체라 하며, 객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다. 객체는 클래스라는 틀에서 생겨난 실체(instance)이다. 따라서 객체 지향 프로그램은 객체와 객체 간의 연결로 되어 있으며 각각의 객체 안에 자료구조와 알고리즘이 들어있는 것이다.

 

 

객체 지향(OOP)의  개념과 특징

객체 지향 프로그래밍 이란, 많은 객체(Objcet)들이 모여서 상호 협력하면서 데이터를 처리하는 방식의 프로그래밍 설계 방법을 일컫는다.

좀더 쉽게 말하면, 프로그램을 묶음 단위로 잘게 쪼개서, 추후에 가져다 쓰기 편하게 만들어 놓은 프로그래밍 방식이라고 보면 된다.

이처럼 레고 블럭 조립하듯이 컴포넌트를 유연하고 변경이 용이하기 때문에, 현업에서 대규모 소프트웨어 개발에 많이 사용된다.

 
객체지향 프로그래밍의 4가지 특징을 가지고 있다.
 
 

1. 추상화 (Abstraction)

객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업

추상적인 개념에 의존하여 설계해야 유연함을 갖출 수 있다. 즉, 세부적인 사물들의 공통적인 특징을 파악한 후, 하나의 묶음으로 만들어내는 것이 추상화다.

 

'평생 못 사는 자동차'라는 추상화 집합을 만들고 '평생 못사는 자동차'들이 가진 공통적인 특징을 만들어서 활용하기.

(높은 가격,배기량,제로백, 배기음 등등)

예를 들면 일반 슈퍼카가 아니라 하이퍼카가 추가된다면 , 이때 추상화로 구현해둔다면, 다른부분은 건들지 않고

하이퍼카의 특징들만 추가로 하면 해결된다 !

 

2. 캡슐화 (Encapsulation)

정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것

 

쉽게 말하면, 한 곳에서 변화가 일어나도 다른 곳에 미치는 사이드 이펙트를 최소화 시키는 것을 의미한다. 즉, 객체 내부의 어떤 동작에 대한 구현이 어떻게 되어있는지 감추는 것이다. 이를 통해 외부에서 뭔가 잘못 건드려 객체를 손상시키는 일을 방지할 수 있다.

 

특징으로는

1. 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.

2. 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것

3. 코드가 묶여있어서 오류가 없어 편리하다.

4. 데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신을 한다.

보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.

 

3. 상속 (inheritance)

자바에서의 상속이란 객체들 간의 관계를 구축하는 방법을 말한다.

즉, 상위 클래스의 속성(변수)과 기능(메소드)을 재사용하여(상속) 하위 클래스가 전부 물려받는 것을 말한다.

 

상속 기능을 이용하게 되면, 상위 클래스의 특징을 하위클래스에서 상속받아 코드의 중복 제거, 코드 재사용성 증대 효과도 누릴 수 있다.

즉, 자주 사용될 것이 예상되는 기능을 모아놓은 클래스를 한번 만들어 놓으면 편하게 재사용을 함으로써 유지보수 효율화를 추구할 수 있는 것이다.

 

그러나, 상속을 통한 재사용을 나타나는 단점이 명백하다. 따라서 객체지향 프로그래밍에서코드재사용 목적으로 하는 상속 행위는 금하도록한다

 

   1. 부모 클래스의 변경이 불편해진다.

    — 부모 클래스에 의존하는 자식 클래스가 많을 때 부모클래스의 변경이 필요하면, 이를 의존하는 자식 클래스들이 모두 영향을 받음.

   2. 불필요한 클래스의 증가

    — 유사 기능 확장시, 필요 이상의 불필요한 클래스를 만들어야 할 수 있다 . 

   3.잘못된 상속 사용

    —같은 종류가 아닌 클래스의 구현을 재사용하기 위해 상속을 받게되면 문제가 발생할수 있다.

 

4. 다형성 (Polymorphism)

  서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 때, 각자의 특성에 맞는 방식으로 동작하는 것

객체지향 패러다임의 핵심이다. 다형성은 상속과의 시너지가 엄청나다. 다형성 구현을 통해 코드를 간결하게 해주고, 유연함을 갖추게 해준다. 또한, 구체적으로 현재 어떤 클래스 객체가 참조되는 지는 무관하게 헐렁하게 프로그래밍하는 것이 가능하다.

 

상속 관계에 있다면, 새로운 자식 클래스가 추가되어도 부모 클래스의 함수를 참조해오면 되기 때문에 다른 클래스는 영향을 받지 않게 된다.

 

이러한 방법으로는 오버라이딩(Overriding), 오버로딩(Overloading) 이있다.

  • 오버라이딩(Overriding) - 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
  • 오버로딩(Overloading) - 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것

 

 

객체 지향 프로그래밍의 장점

1. 소프트웨어의 생산성 향상

객체지향 프로그래밍은 다형성, 객체, 캡슐화 등 소프트웨어의 재사용을 지향한다. 이미 만들어진 클래스를 상속받거나 객체를 가져다 재사용하거나, 부분 수정을 통해, 소프트웨어를 작성하는 부담을 대폭 줄일 수 있다.

  • 신뢰성 있는 소프트웨어를 손쉽게 작성할 수 있다. (개발자가 만든 데이터를 사용하기 때문에 신뢰할 수 있다.)
  • 코드를 재사용하기 쉽다 (상속, 캡슐화, 다형성으로 인해 재사용할 수 있다.)
  • 업그레이드가 쉽다.
  • 디버깅이 쉽다.

 2. 실세계에 대한 쉬운 모델링 

컴퓨터가 산업 전반에 다양하게 활용되는 요즘 시대에는 응용 소프트웨어를 하나의 절차로 모델링하기 어렵다. 산업 전반에서 요구되는 응용 소프트웨어 특성상, 절차나 과정보다 관련된 많은 물체(객체)들의 상호 작용으로 묘사하는 것이 더 쉽고 적합하다.

  • 실세계에 대한 모델링을 좀 더 쉽게 해준다. (모든 것을 객체들의 상호작용으로 생각)

3. 보안성 향상

객체 지향적 프로그래밍의 캡슐화 특징으로 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.

  • 보안성이 높다 (캡슐화, 데이터 은닉, 다형성으로 인해 필요한 정보를 재정의하거나 getter, setter를 이용하기 때문에 보안성이 높다.)

 

객체 지향 프로그래밍의 단점

느린 실행 속도

객체 지향 프로그래밍은 캡슐화와 격리구조에 때문에 절차지향 프로그래밍과 비교하면 실행 속도가 느리다. 또한, 객체지향에서는 모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어가게 된다.

  • 절차지향 프로그래밍에 비해 느린 실행 속도
  • 필요한 메모리양의 증가

 

 

Reference

http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5

 

https://jeong-pro.tistory.com/95

https://velog.io/@haero_kim/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

'JAVA' 카테고리의 다른 글

[JAVA]래퍼 클래스(Wrapper Class)?  (0) 2023.02.27
[JAVA] 자바의 HashMap  (0) 2023.02.18
가비지컬렉션(Garbage Collection)이란?  (0) 2023.02.01
Spring Web MVC의 Dispatcher Servlet의 동작 원리  (0) 2022.12.12
ORM 이란?  (0) 2022.11.28