| 객체지향 프로그래밍 / 절차지향 프로그래밍
절차 지향 프로그래밍(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) | 의존 역전 법칙 | 클라이언트는 추상화에 의존해야 하며, 구체화에 의존해선 안된다 |
[참조]
- [스프링 입문을 위한 자바 객체 지향의 원리와 이해], 김종민
'Language > Java' 카테고리의 다른 글
객체지향 언어의 특징 2_상속 (재사용 + 확장) (0) | 2022.07.20 |
---|---|
객체지향 언어의 특징 1_추상화 (모델링) (0) | 2022.07.20 |
자바 설치부터 제어문까지 기본 핵심 복습 (0) | 2022.07.05 |
자바 기초 개념 정리 (0) | 2022.07.01 |
[객체지향프로그램] 응집도와 결합도 (0) | 2022.05.04 |