Language/Java

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

simDev1234 2022. 7. 18. 16:39

|  객체지향 프로그래밍 / 절차지향 프로그래밍

  절차 지향 프로그래밍(PP) 객체 지향 프로그래밍(OOP)
특징 일련의 동작(모듈, 함수)를 순차적으로 실행 객체(속성 + 기능) 간의 상호작용을 이용
포커스 명령어의 순서와 흐름 데이터의 속성(필드)과 기능(메서드)
장점 컴퓨터의 처리구조와 비슷해 속도가 빠르다 재사용성(상속), 유지보수 용이, 자연스러운 모델링*
단점 규모가 커질 수록, 추가 개발 및 유지보수 어려움 느린 개발 속도와 실행 속도. 높은 난이도

 

* 객체지향 프로그래밍은 하나의 방법론이지, 그것이 언어나 제품을 의미하는 것은 아니다.

* OOP나 PP 외에 CBD(Component-based development), SOA(Service-orient development)등 프로그래밍 방법론은 많다.

* OOP가 방법이라면, 자바는 언어이고, 스프링 프레임워크는 일종의 제품이다.

* OOP의 장점 중 자연스러운 모델링이라는 것은, 현실 세계와 가깝게 자연스러운 구현이 가능하다는 의미

 

[참조] 기계어 -> 어셈블리어 -> 컴파일언어(C언어) -> 자바 -> 스프링 프레임워크

더보기

- 기계어 : 0과 1의 나열이며, 컴퓨터 기종마다 쓰는 방식이 다르다.

  - 기계어는 컴퓨터를 움직이는 명령 소스 그 자체이다.

 

- 어셈블리어 : 기계어를 니모닉(ex.ADD)을 통해 사람이 이해할 수 있는 단어로 변경한 언어.

  - 슬프게도 이 또한 컴퓨터 기종마다 쓰는 단어가 다르다.

  - 다만 어셈블리어는 기계어와 1 : 1 로 대응하기 때문에 명령시 반응은 즉각적.

 

- 컴파일어 : 수학적인 기호를 통해 코딩을 하면, 그걸 컴파일하여 기계어로 번역하는 언어.

    "One Source, Multi Object, Use Anywhere"

   - 컴퓨터 기종과 상관없이 동일한 소스 코드를 사용

   - 그렇지만 운영체제에 따라 자료형 타입 크기가 달라지는 단점이 있다. 

     (ex. C언어의 int -> 어떤 OS는 int를 2바이트로 규정, 어떤 OS는 int를 4바이트로 규정)

 

- 객체지향 언어(C++, 자바...) 

  "One Source, One Object, Use Anywhere"

  - C++는 객체지향언어이지만, 객체지향이 아니게 사용될 수도 있다.

  - 자바에서 JVM을 통해 컴퓨터 기종과 상관없으며, 운영체제와도 상관없이 동일한 소스코드를 쓸 수 있게 됐다.

  * JVM은 말그래도 가상머신, 가상의 메모리 공간이다. 가상공간을 만들면 아무래도 메모리 소비는 더 많을 것.

     (JVM 사용에 따른 메모리 소비량은 그러나 하드웨어 기술이 발전함에 따라 사실상 큰 의미가 없어졌다)

 

- 스프링 프레임워크

  - POJO(Ioc/DI + PSA + AOP)를 통해 OOP를 일관성 있게 개발할 수 있는 프레임워크 제공

 

|  자바 프로그램의 구동

1. 자바와 가상 머신

- 자바 프로그램은 가상머신 안에서 구동되는 프로그램이다.

- 현실 세계의 하드웨어가 자바 가상 머신으로 옮겨졌다고 보면 된다.

- 가상 머신을 통해서 OS에 독립적인 실행이 가능해진 것이다.

- 일반 하드웨어와 JVM이 메모리를 사용하는 방식

(1) 일반 하드웨어 : 코드 실행 영역 + 데이터 저장 영역

(2) JVM : 코드 실행 영역 + [스태틱 영역 + 스택 영역 + 힙 영역]

현실  가상 동작
소프트웨어 JDK (개발 도구) 개발자는 JDK 환경에서 자바로 코드를 짠다 
운영체제 JRE (실행 환경) JRE가 JVM에서 프로그램을 돌린다
하드웨어 JVM (가상 머신) 가상의 컴퓨터다. 

 

2. 구동 순서

(1) 전처리 : 스태틱 영역에, java.lang패키지를 넣고, 모든 import 패키지와 클래스를 넣는다.

(2) 스택 : 메인 메소드(변수 x = 10) -> 다른 메소드 -> 다른 메소드...

(3) 힙 : 배열, 인스턴스 ..... (중간중간 힙 사용)

 

|  객체

- 객체란? 세상에 존재하는 모든 사물(Object)

- 클래스(분류)와 객체(실체)를 구분하는 것 : 클래스는 분류, 객체는 유일무이한 실체

  "쫀떡이, 나이가 몇살이니?" --> 고양이는 클래스, 쫀떡이는 객체 

객체 속성 (= 변수) 특성 및 상태 
행위 (= 메소드) 동작 또는 행위 

 

|  객체 지향의 4대 특성

캡슐화 정보 은닉
상속 재사용과 확장성
추상화 모델링
다형성 사용 편의

 

|  객체 지향의 5가지 원칙 - SOLID

SRP(Single Responsibility Principle) 단일 책임 원칙 작성된 클래스는 단 하나의 기능을 가지며,
모든 서비스는 하나의 책임을 수행하는데 집중돼야 한다.
OCP(Open-Closed Principle) 개방 폐쇠 원칙 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는
확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
LSP(Liskov Substitution Principle) 리스코프 치환 원칙 상위 타입의 객체를 하위 타입으로 바꾸어도
프로그램은 일관되게 동작해야 된다
ISP(Interface Segregation Principle) 인터페이스 분리 원칙 클라이언트는 이용하지 않는 메소드에 의존하지 않도록
인터페이스를 분리해야 된다
DIP(Dependency Inversion Principle) 의존 역전 법칙 클라이언트는 추상화에 의존해야 하며,
구체화에 의존해선 안된다

 

 

[참조]

- [스프링 입문을 위한 자바 객체 지향의 원리와 이해], 김종민

- https://www.nextree.co.kr/p6960/

- https://velog.io/@hanjoon_10/OOP-vs.-PP