[IT]/JAVA

[JAVA] OOP(객체 지향 프로그래밍)의 개념과 특징 (장단점/추상화/다형성/캡슐화/상속)

ee2ee2 2022. 5. 4. 10:57
728x90
반응형

 

OOP(Object Oriented Programming)이란?

더보기

객체 지향 프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나이다.

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

출처 : https://ko.wikipedia.org/wiki/객체_지향_프로그래밍

OOP(객체 지향 프로그래밍)이란 문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로 객체들이 서로 상호작용하는 프로그래밍 이론이다. 위와 같이 프로그램을 "객체"들의 모임으로 파악하는 것에 의미를 둔다.

또한, OOP는 코드 재사용성과 생산성의 향상 효과를 볼 수 있고, 유지보수의 편의성으로 인해 규모가 큰 프로젝트에 사용된다.

 

객체(Object) : 세상에 존재하는 모든 것

Ex.) 사물, 생명체 등

프로그래밍에서의 객체는 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹으로 생각하면 쉽다.

예를 들어, 자동차(Car) = 데이터 (색, 종류, 바퀴, 핸들 등) + 기능(움직임, 정지, 입력, 출력 등)


OOP의 특징

객체 지향 프로그래밍의 특징은 클래스를 이용하여 관련있는 처리(기능) 부분과 데이터 부분을 하나의 객체(인스턴스)로 묶어 생성하여 사용한다는 점이다.

객체 지향 프로그래밍은 아래와 같이 캡슐화, 추상화, 상속, 다형성 네 가지 특성을 가진다.

 

1) 캡슐화 (Encapsulation)

캡슐화란 데이터와 코드의 형태를 함께 묶어 외부에서 알 수 없도록 하고, 데이터의 구조와 역할/기능을 하나의 캡슐형태로 구현하는 방법이다. 

캡슐화의 중요한 목적은 변수를 private 으로 선언하여 데이터를 보호하고, 보호된 변수는 getter()/setter() 메소드를 통해서만 간접적으로 접근을 허용하는 것이다. (이 캡슐형태를 사용하는 데 필요한 인터페이스만 외부에 공개하는 것)

캡슐화를 하면 불필요한 정보를 감출 수 있다. 숨기는 목적은 클래스 내부 구현의 응집도(cohesion)를 높이고 외부 다른 클래스와의 결합도(coupling)낮추는 데 있다. 다만, 캡슐화와 정보은닉은 다른 개념이다.

 

그렇다면, 정보은닉과 캡슐화의 차이점은?

< 정보은닉 vs 캡슐화 >

  정보은닉(Information hiding) 캡슐화(Encapsulation)
개념 - 데이터 캡슐화가 아닌 외부에 감춰야하는 비밀에 따라 시스템을 분할하는 모듈 분할의 원리
- 잘 정의되고 쉽게 변경되지않는 공용 인터페이스를 외부에 제공하여 내부의 비밀에 함부로 접근할 수 없도록 하는 것
- 데이터를 공용 메소드를 통해서만 접근 허용(= 데이터 캡슐화)
은닉 내용 - 캡슐 내의 요소들에 대한 세부 구현사항들을 외부로부터 숨김 - 관련된 요소들을 묶음으로써 캡슐 내부와 외부를 구별지어 특정 객체 속에 있는 데이터와 함수들을 다른 객체 속에 있는 데이터와 함수들과 구별이 이뤄짐
결론 정보은닉의 개념이 캡슐화 개념안에 포함되기 하지만, 캡슐화가 되어있다고 해서 반드시 정보은닉이 되는 것이 아니다.

출처 : http://wiki.hash.kr/index.php/정보은닉


2) 추상화 (Abstraction)

추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.

실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악해 필요없는 특성을 제거하는 과정을 뜻한다. 객체들은 실제의 모습이지만, 클래스는 객체들이 어떤 특징이 있어야 한다고 정의하는 추상화된 개념이다.

추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 코드 설계도라고 이해하면 된다. (즉, 구체적인 개념을 정의하는 것이 아닌, 추상적 개념으로 작성하여 설계에 유연한 변경을 할 수 있도록 함)


3) 상속 (Inheritance)

상속이란 존 상위 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것이다. (재사용성 Up! / 코드의 중복은 Down!)

OOP에서는 상속을 한 클래스를 부모 클래스, 상속을 받은 클래스를 자식 클래스라고 표현한다.

상속을 하게되면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.


4) 다형성 (Polymorphism)

다형성이란 상속과 연관있는 개념으로 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러 형태(객체)로 재구성 되는 것을 의미한다. 즉, 한 부모 밑에서 태어난 자식을이 조금씩 다르다는 것이다.

그 예로, 오버로딩(Overloading), 오버라이딩(Orverriding)가 있다.

오버로딩(Overloading)?

하나의 클래스 안에서 같은 이름의 메소드를 사용하지만, 각 메소드마다 다른 용도로 사용되는 것이다. (메소드명은 같지만, 파라미터 타입/갯수가 다른 형태)  단, Reutrn Type은 같아야 함.

오버라이딩(Orverriding)?

하위(자식) 클래스가 상위(부모) 클래스에서 만들어진 메소드를 재정의 하는 것을 의미한다.

 

다형성을 사용하면 같은 이름의 속성을 유지함으로서 속성을 사용하기 위한 인터페이스는 유지하고, 메소드 이름을 낭비하지 않는다. (코드의 재사용성을 늘려 유비보수가 용이하도록 도와준다!)


즉, OOP는 위 4가지 특성을 통해 어떤 대상을

추상화(Abstraction)하여 공통점을 찾고,

 캡슐화(Encapsulation) 한 군데에 모아 객체를 만들고,

새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 준다.

상속받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용할 수 있다.

 

참고 사이트

- OOP(객체 지향 프로그래밍)