JAVA - 객체 지향 프로그래밍

2021. 4. 13. 20:58코 딩 공 부/J A V A

728x90
반응형

절차지향과 객체지향

 

절차지향 프로그래밍(Procedural Oriented Programming)

 

● 개요

- 절차적 프로그래밍은 "루틴", "서브루틴", "메소드", "함수" 등 "프로시저"를 이용한 프로그래밍 패러다임을 의미. 루틴(Routine)이란 "틀에 박힌 일"로 우리가 할 일에 대한 순서가 정해저 있고, 그것이 변하지 않는다는 의미. 프로시저는 어떤 행동을 수행하기 위한 일련의 작업 순서를 의미한다. 프로시저는 루틴이나, 서브루틴 및 함수와 같은 뜻으로 특정 작업을 수행하기 위한 프로그램의 일부이다.

- 문제를 해결하는 절차(알고리즘)에 따라서 순차적인 처리가 중요시 되는 구조

- 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법

- C언어, 베이직 등이 대표적 절차지향 프로그래밍에 속한다.

 

● 장점

컴퓨터의 처리 방식과 유사하며 처리속도가 빠르다.

 

● 단점

- 코드의 양이 증가할 수록 재사용성과 유지보수의 어려움이 급격하게 증가

- 대형 프로젝트에 부적합

 

● 특징

- 행동(코드) 중심

- 처리해야할 명령어를 결정하고, 필요한 데이터 요청

- Top-Down 방식으로 설계

- 대규모 프로그래밍 환경에 대응이 미흡

- 관련 데이터나 함수를 분류하는데 문제가 많음

- 데이터(속성)의 종류에 따라 함수(기능)가 달라짐. 즉 데이터와 함수가 분리됨

- 새로운 데이터(속성) 추가 시 전체 프로그래밍 수정이 요구됨. 이것이 반복되면 유지보수가 어렵다.

 

객체지향 프로그래밍(Object-Oriented Programming)

 

● 개요

- 객체지향이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방법

- 현실세계에 존재하는 실체 및 개념들을 객체(Object)라는 독립된 단위로 구성하고 이 객체들이 메세지 교환을 통해 상호작용함으로써 전체 시스템이 운영되는 개념

- 현실 세계의 개체(Entity)를 속성(Attribute)과 메소드(Method)가 결합된 형태의 객체(Object)로 표현

- 객체 지향 프로그래밍에서는 데이터와 절차를 하나의 덩어리로 묶어서 생각한다. 이는 마치 컴퓨터 부품을 하나씩 사다가 컴퓨터를 조립하는 것과 같은 방법이다.

- 객체지향 언어 종류 : JAVA, C++, C#, Python 등

 

● 특징

- 데이터(상태) 중심

- 관리하는 데이터를 정의하고 이에 필요한 명령어를 추가

- 성능보다는 개발의 편리성과 효율성을 높이는데 목적이 있음

- 쉬운 프로그램의 개발로 인한 생산성을 향상 시킬 수 있다.

- 프로그램 모듈을 재사용 할 수 있다.

- 프로그램의 확장 및 유지 보수가 용이하다.

 

절차지향과 객체지향

 

 

객체 및 객체지향 구성 요소

 

객체(Object)

 

● 객체란?

- 자동차, 컴퓨터, 책 등과 같이 우리 주위에서 손쉽게 접할 수 있는 모든 물리적 사물 또는 실체를 가리키는 말

- 객체는 특성과 행위, 정체성 등 세가지 특징이 있다.

· 특성(속성)은 해당 객체에 저장되어 있는 정보

· 행위는 해당 객체가 행동하거나 반응하는 방법을 결정

· 정체성은 해당 객체를 다른 객체와 구별짓게 하는 식별 값

 

● 객체(Object)

- 객체는 그 객체의 상태를 나타내는 변수와 행동을 구현하는 메소드의 소프트웨어적인 모듈이다.

- 관련있는 데이터와 코드를 하나로 묶는 구성 단위

- 객체는 개발 시간(design-time)에는 래퍼런스 변수로 정의

- 객체는 실행 시간(run-time)에는 클래스의 인스턴스를 의미

- 효율적으로 정보를 관리하기 위하여, 사람들이 의미를 부여하고 분류하는 논리적인(개념적인) 단위

- 실 세계에 존재하는 하나의 단위에 대한 소프트웨어적 표현

 

● 객체의 구성

- 속성의 값을 나타내는 데이터(상태)와 데이터를 변경하거나 조작할 수 있는 메소드로 구성

- 객체 = 상태(state) + 동작(behaviors)

         = 속성(property, attribute) + 프로시저

         = 필드(멤버변수) + 메소드(method)

 

● 상태와 행동

- 상태(state) : 메모리 내부에 정의된 데이터

속성(property), 특성(attribute), 필드(field), 멤버변수(member variable)

- 행동(action) : cpu를 통한 명령 실행의 집합 - 코드집합

동작(behavior), 메소드(method), 멤버함수(member function)

 

객체지향 구성 요소

 

● 클래스(Class)

클래스는 객체지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 속성(필드)과 메소드를 정의하는 일종의 틀(template)이다. 즉, 클래스는 객체를 정의하기 위한 속성(필드)과 메소드로 구성된다.

 

● 객체(Object)

클래스의 인스턴스(실제로 메모리상에 할당된 것)이다. 즉 클래스라는 일종의 설계도를 기반으로 실제로 생성된 그 실체가 바로 객체이다. 객체는 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다.

 

● 속성(attribute)

객체의 데이터(필드)

 

● 메소드(Method)와 메세지(Message)

클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 행위라고 할 수 있다. 메소드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는데 사용된다. 메세지는 객체간의 통신이 이루어지는 방법이며 이 메세지를 통해 메소드가 호출되어 사용된다.

 

객체지향 특징

 

추상화(Abstraction)

 

● 개요

- 객체에서 공통된 속성과 행위를 추출하는 것을 추상화라고 한다. - 모델링

즉, 현실 세계의 사물을 데이터적인 측면과 기능적인 측면을 통해서 정의하는 것 - 데이터 추상화

- 객체지향적 관점에서 클래스를 정의하는 것도 추상화라고 정의가 가능하다.

 

캡슐화(Encapsulation)

 

● 개요

- 객체의 속성과 행위를 하나로 묶고 실제 구현 내용을 외부에 감추어 은닉한다.

- 객체 외부에서는 개체 내부 정보를 직접 접근하거나 조작할 수 없고 외부에서 접근할 수 있도록 정의된 오퍼레이션을 통해서만 관련 데이터에 접근할 수 있다. (getter / setter)

- 시스템의 구성 단위를 외부와 소통하는 인터페이스 부분과 실제로 동작하는 구현부를 분리하여 인터페이스는 공개하고 구현부는 감추는 것

- 해당 객체의 기능과 사용법만 제공하고 내부는 감추어(변경할 수 없게 함) 쉽게 사용할 수 있게 하는 개념

 

● 장점

- 데이터 보호 : 이용자가 데이터에 직접 접근하는 것을 차단하므로 객체 내 데이터 및 코드의 손상과 오용을 막고 안전하게 보호할 수 있다.

- 추상화 용이 : 추상화를 통해 프로그래밍 문제를 쉽게 개념화 할 수 있다.

- 제공자와 이용자를 명확히 분리 : 객체 제공자와 객체 이용자(외부 객체)의 분담을 명확히 할 수 있다.

- 이용자에게 편리성 제공 : 메소드의 구현 방법이 바뀌어도 사용방법은 바뀌지 않는다.

- 사용법이 쉬움 : 메소드의 기능만 알면 객체를 사용할  수 있다.

- 변화에 대한 국지적 영향 : 객체 내의 데이터 구조가 바뀌어도 다른 객체에는 영향을 주지 않는다.

- 객체 간의 독립성 보장 : 캡슐화(데이터+메소드)로 인해 객체 사이의 독립성이 구조적으로 보장된다.

- 변경 용이성과 재사용성 증대 : 설계의 변경 용이성과 재사용성을 높여준다.

 

● 정보 은닉(information hiding)

- 캡슐화는 소프트웨어 모듈인 객체 내부의 관련된 데이터와 메소드를 함께 포장하는 방식으로, 캡슐 내부와 외부를 구별 짓는다. 그러나 캡슐화했다고 해서 그 자체로 내부의 정보가 외부에 숨겨지지는 않는다.

- 정보 은닉은 한 모듈에서 인터페이스와 구현을 명확히 분리하여 각 모듈의 내부 항목에 관한 정보는 감추고 인터페이스를 통해서만 메세지를 전달함으로써 다른 모듈을 변경하지 못하도록 한다.

- 모듈 안에 있는 자료 구조와 메소드에 사용된 알고리즘은 외부에서 그 값을 직접 변경할 수 없고, 공개 인터페이스로 정의된 메소드를 통해서만 접근할 수 있다.

 

● 정보 은닉의 장점

- 독립성 향상 : 다른 모듈과 관계가 적어 모듈의 독립성을 높여준다.

- 수정 용이 : 인터페이스가 바뀌지 않는 한 다른 모듈에 미치는 영향을 고려할 필요가 없다.

- 이해도 증진 : 프로그램을 개발할 때 다른 모듈의 구현 내용을 자세히 알 필요 없이 제공하는 기능만 알면 메세지를 통해 사용할 수 있어 프로그래머가 모듈을 이해하기 쉽다.

- 확장성 증가 : 모듈 내의 데이터와 알고리즘을 변경하기 쉬워 기능을 추가하기도 쉽다.

 

상속(Inheritance)

 

● 개요

상속은 클래스의 속성과 행위를 하위 클래스에 물려주거나, 상위 클래스에서 물려 받는 것을 지칭한다.

 

● 장점

- 이해 용이 : 개별 클래스를 상속관계로 묶음으로써 클래스 간의 체계화된 전체 구조를 파악하기 쉽다.

- 재사용성 증대 : 데이터와 메소드의 오버로딩을 피하고 기존 클래스에 있는 것을 재사용할 수 있다.

- 확장 용이 - 새로운 클래스, 데이터, 메소드를 추가하기가 쉽다.

- 유지보수 용이 : 데이터와 메소드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지할 수 있다.

 

다형성(Polymorphism)

 

● 개요

- 다형성이라는 단어는 원래 '여러 개의 형태를 갖는다' 라는 의미의 그리스어에서 유래했다. 또 사전에서 찾아보면 poly(하나 이상), morph(형태)가 합성된 단어로 '하나 이상의 형태'를 뜻한다.

- 객체지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 메소드를 여러 개 정의하거나 상위 클래스의 오퍼레이션을 하위 클래스에서 다시 정의하여 사용할 수 있기 때문에 바로 이 다형성 이라는 특징을 갖는 것이다.

 

● 특징

- Overloading : 동일한 이름의 Operation 사용 - 수평적

- Overriding : 슈퍼 클래스의 메소드를 서브 클래스에서 재정의 - 수직적

 

객체지향의 설계 원칙

 

설계 원칙

 

● 단일 책임의 원칙(SRP : The Single Responsibility Principle)

하나의 클래스에는 한가지 종류의 책임(혹은 기능)을 두어야 한다는 원칙이다. 이는 각 클래스의 Cohesion(응집력)을 높이기 위함이다.

 

● 개방/폐쇄의 원칙(OCP : The Open-Closed Principle)

개방/폐쇄의 원칙은 확장에 대해서는 개방되어야 하지만 변경에 대해서는 폐쇄되어야 한다는 원칙이다. 이러한 원칙을 통해 얻고자 하는 것은 기능을 확장했을 때 기존 클래스의 변경을 최소화하는 것이다. 이는 디자인 패턴을 적용하는 이유이기도 하다.

 

● 인터페이스 분리의 원칙(ISP : Interface Segregation Principle)

인터페이스 분리의 원칙은 클라이언트는 자신이 사용하지 않는 메소드와 의존 관계를 갖지 않도록 해야한다는 원칙이다. 이는 각 메소드의 변경에 따른 클래스의 변경을 최소화하기 위함이다.

 

● 리스코프 치환의 원칙(LSP : Liskov Substitution Principle)

리스코프 치환의 원칙은 서브타입은 언제나 기반타입으로 대체할  수 있어야 한다는 원칙이다.

 

● 의존 관계 역전의 원칙(DIP : Dependency Inversion Principle)

의존 관계 역전의 원칙은 고차원 모듈은 저 차원 모듈에 의존하면 안된다는 원칙이다. 한마디로 말하면 추상클래스나 인터페이스를 쓰라는 말이다. 일반적으로 추상 클래스와 인터페이스를 변경하기 보다는 콘크리트 클래스를 변경해야 하는 경우가 더 많이 있다. 그러나 콘크리트 클래스에 의존하면 그 클래스에 의존하는 클래스를 수정해야 하는 경우가 많기 때문에 추상클래스나 인터페이스에 의존할 것을 권고하는 원칙이다.

728x90
반응형

'코 딩 공 부 > J A V A' 카테고리의 다른 글

JAVA - 배열  (0) 2021.04.12
JAVA - 제어문  (0) 2021.03.24
JAVA - 연산자  (0) 2021.03.16
JAVA - 기본 프로그램(2)  (0) 2021.03.08
JAVA - 기본 프로그램(1)  (0) 2021.03.05