본문 바로가기
자바과정/Java

객체 지향 프로그래밍이란

by Parkej 2021. 9. 9.

IDE : Eclipes - vesion : 2021.3

객체 지향 프로그래밍

" 객체 지향 프로그래밍은 (이하 OOP)는 컴퓨터 프로그래밍 패러다임 중 하나로 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. "

 

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

 

** 절차지향과의 비교

절차지향과 객체지향은 패러다임을 뜻하는 단어로써,

어떠한 견해나 관점을 용어로 만든 것 뿐이다.

 

절차지향 언어를 사용한다면, 말 그대로 실행 순서, 즉 절차가 더 중점이 되고,

객체지향 언어를 사용한다면, 필요한 객체들의 종류와 속성 등이 더 중점이 된다.

 

 

이렇게 객체형식으로 프로그래밍을 하는것이다. 

 


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

장점 단점
코드 재사용 용이 처리속도가 상대적으로 느림
유지보수가 쉬움 객체가 많으면 용량이 커질 수 있음
대형 프로젝트에 적합 설계시 많은 시간과 노력이 필요
직관적인 코드 분석 가능 실세계의 모습을 그대로 반영 못한다는 비판도 있음.

 

* 코드 재사용 : 누군가 만든 클래스를 가져와서 사용할 수도 있고 상속을 통해 코드 확장이 가능하다.
* 유지보수 쉬움 : 절차 지향 프로그래밍에서는 코드를 수정해야 할 때 일일이 찾아 수정해야하는데 OOP는 수정 부분이 클래스 내부의 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다.
* 대형 프로젝트에 적합 : 클래스 단위로 *모듈화 시켜 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담이 쉽다.

 

* 모듈(Module)

모듈 : 소프트웨어 설계에서 기능단위로 분해하고 추상화 되어 재사용 및 공유 가능한 수준으로 만들어진 단위

모듈화 : 소프트웨어의 성능을 향상시키거나 시스템의 디버깅, 시험, 통합 및 수정을 용이하도록 하는 소프트웨어 설계 기법

 

소프트웨어의 생산성 향상 #

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

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

실세계에 대한 쉬운 모델링 #

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

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

보안성 향상 #

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

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

 


객체 지향 프로그래밍의 기본 구성 요소

# 위키백과

1. 클래스(Class) : 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형(user defined data type)이라고 할 수 있다. 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다. 프로그래머는 아니지만 해결해야 할 문제가 속하는 영역에 종사하는 사람이라면 클래스를 사용할 수 있다.

 

자바의 클래스 생성시 기본 형태

 

2. 객체(Object) : 클래스의 인스턴스(실제로 메모리상에 할당된 것이다.) 객체는 자신 고유의 속성(attribute)를 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다. 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.

 

 

new를 통한 객체 생성

 

 

 

3. 메서드(Method), 메시지(Message) : 클래스로부터 생성된 객체를 사용하는 방법으로써 객체에 명령을 내리는 메시지라 할 수 있다. 메서드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. 또 객체간의 통신은 매시지를 통해 이루어진다. 

 


FLOW

 

구 성 설 명
클래스
(Class)
- 객체의 타입을 정의하는 템플릿
- 같은 부류(개념, 문제해결 등)에 속하는 속성(Attribute)과 행위(Method)를 정의
- 재사용 가능하며, 외부 클래스와 독립적으로 설계
객체
(Object)
- 클래스를 실제 사용하기 위해 생성한 인스턴스 (실제 메모리상에 할당)
- 자신의 고유 속성(Attribute)를 갖고 있으며, 클래스에 정의된 행위(Method) 수행
속성
(Attribute)
- 클래스에 속한 객체들이 갖고 있는 데이터 값을 단위 별 정의
- 성질, 분류, 분류, 식별, 수량, 상태 등
메소드
(Method)
- 클래스로부터 생성된 객체를 사용하는 방법
- 메소드를 통해 객체의 속성을 조작
메시지
(Message)
- 객체 간 상호작용하기 위한 방법으로, 객체에 특정 행위를 요청하는 신호
- 객체명 / 메소드명 / 매개변수로 구성

 

 


객체 지향 프로그래밍의 키워드 5가지(4대 특징이라고도 할 수 있음)

 

클래스 + 인스턴스(객체)

- 클래스 : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것.

- 인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터

 

추상화

- 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.

* 객체지향 관점에서 클래스를 정의하는 것 (abstract 클래스, abstract 메서드와는 다른 것)

 

캡슐화

- 코드를 재수정 없이 재활용 하는 것.

- 캡슐화를 통해 관련되 기능과 특성을 한 곳에 모으고 분류하기 때문에 재활용이 원활해졌다.

- OOP에서 기능과 특성의 모음을 클래스라는 캡슐에 분류해서 넣는 것이 캡슐화이다.

- 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다.

* 접근 제어를 통해 자료형의 정보를 은닉할 수 있다. (public, private, protected ...)

* 정보 은닉 : 객체의 상세한 내용을 객체 외부에 철저히 숨기고, 단순히 메시지만으로 객체와의 상호작용을 하게 하는 성질

 

상속

- 상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 한다.

- 다중상속은 불가능하다.

 

다형성

- 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다는 것이다.

- 오버라이딩(Overriding) 오버로딩(Overloading)이 가능하다.

* 오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것

* 오버로딩 : 같은 이름의 함수를 여러 개 정의하고 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.

 


* getter, setter 를 사용하는 이유는 무엇인가?
 
멤버변수에 직접접근하지 못하게 private으로 접근지정자를 설정하고 public으로 getter, setter 메서드를 만드는 것을 많이 해왔다.
그러면서 이럴꺼면 어차피 아무나 접근가능한데 왜 private을 할까? 라고 생각했었다.
 
결론부터 말하면 getter, setter를 사용하면 메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문이다.
 
예를들면 setter에서 유효범위를 넘은 정수가 들어왔을 때의 처리를 하고나서 set하거나 예외처리를 해버릴 수 있는 것이다.
getter도 마찬가지로 굳이 예를들자면 자료에 무언가 더하거나 빼고 준다든지가 가능하다.

 

CODE

 

RESULT

 


 

추상 클래스와 인터페이스의 비교
항목 추상클래스 인터페이스
공통점 -객체생성 불가,선언부만 있는 메소드는 이를 상속하는 하위 클래스에서 반드시 구현 필수
차이점 -일반 클래스에 추상메소드가 추가된 형태 -모든 메소드가 추상 메소드
-속성을 가질 수 있음 -일부 속성(상속)만 가질 수 있음
-단일상속 가능 -다중구현 가능

 

오버라이딩과 오버로딩 비교
구분 오버라이딩(Overriding) 오버로딩(Overloading)
메소드 이름 같아야 함 같아야 함
파라미터 개수
자료형
같아야 함 달라야 함
같을 경우 자료형이 달라야 함
리턴 타입 같아야 함 상관없음
기타 상위 클래스에 메소드 존재 상위 클래스에 같은 이름의 메소드가 없어야 함

 

재사용성 향상을 위한 객체지향 프로그래밍 기법
요약 내용
Refactoring사용 코드의 가독성 및 올바른 객체지향 설계 원칙을 위한 코드수정 기법
관계 구현,클래스 및 메소드 재사용성 향상,구현의존도를 낮추어 상속 재검토
Design pattern사용 상속은 수직적 재사용 가능,상황적으로 다른 접근방식 필요
동일한 비즈니스로직 등은 Design pattern을 사용하여 재사용성 향상
CBD, Product Line, SOA사용 Component 사용 및 Product Line을 이용한 Core asset의 재사용 고려
재사용 단위를service Level까지 고려한architecture측면에서 접근

객체지향 프로그래밍의 설계원칙(5원칙 SOLID)

구분 설명
단일 책임의 원칙
(SRP)
-Single Responsibility Principle
-하나의 객체는 하나의 책임만을 수행하는데 집중
-높은 응집도(High Cohesion),느슨한 결합도(Loose Coupling)
개방 폐쇄의 원칙
(OCP)
-Open Closed Principle
-확장에 열림(Open) :객체의 수직관계(Is-a)에서는 열림
-변경에 닫힘(Closed) :객체의 수평관계(Has-a)에서는 유연
리스코프 치환의 원칙
(LSP)
-Liskov Substitution Principle
-상위 클래스 타입이 사용되는 곳에 하위 클래스 타입으로 대체 가능
-메소드의 매개변수를 추상 클래스 또는 인터페이스로 사용
인터페이스 분리의 원칙
(ISP)
-Interface Segregation Principle
-하나의 일반적인 인터페이스 보다, 여러 개의 구체적인 인터페이스가 좋음
-외부에서 꼭 필요한 메소드들만 이용할 수 있는 환경 마련
의존관계 역전의 원칙
(DIP)
-Dependency Inversion Principle
-파생 클래스 대신 추상 클래스에 대한 의존관계를 생성
-파생 클래스 또는 추상 클래스는 오직 추상 클래스만 참조

 

 

* 추후 4대특징과 5원칙에 대한 실습을 한 뒤 자세하게 포스팅할 예정입니다. 

반응형

댓글