객체 지향에 대한 이해는 스프링 프레임워크를 이해하기 위한 필수 조건
이 책의 목표: 본격적인 스프링 학습을 위한 사전 지식, 즉 스프링의 근간이 되는 객체지향 4대 특성, 객체 지향 설계 5원칙, 스프링에서 많이 활용되고 있는 디자인 패턴을 학습하고 이해하는 것을 목표
자바 6을 기준으로 하는 조금 오래된책이지만, 스프링 프레임워크 버전 변화와 관계 없이 스프링의 기초를 학습하는데는 지장이 없다고 하니 시작해보자!
---
신기술은 이전 기술의 어깨를 딛고
스프링을 이해하려면 과거의 어떤 기술들을 이해하고 있어야 할까?
SOA, CBD, OOP, 기계어, 어셈블리어 ...
기계어에서 객체 지향 프로그래밍 언어로
기계어 - 0과 1의 행진, 비인간적인 언어(컴퓨터가 이해하는 유일한 언어)
인류 최초의 프로그래머 -> 꺼진 상태와 켜진 상태를 각각 0과 1로 해석할 수 있는 백열전구를 이용해 프로그램 작성(사실은 백열 전구가 아닌 진공관임)
기계어 코드는 CPU에 따라 다름
어셈블리어 - 0과 1의 행진을 벗어나 인간 지행으로 / 기계어 니모닉
기계어 명령어와 일상 용어를 1:1로 매칭한 코드표 = 니모닉(Mnemonic)과 기계어의 일대일 매칭 코드표 = 어셈블리
CPU마다 기계어가 다르기 때문에 CPU별로 각자의 어셈블리어(Assembly Language)도 다름
어셈블리어를 기계로 번역해 주는 소프트웨어: 어셈블러(Assembler) 도 당연히 다르겠지
ex) 더하기를 의미하는 기계어 01010101 에 매칭되는 어셈블리어 니모닉은 ADD 라고 하자 - 애드삭
ex) 더하기를 의미하는 유니박 전용 기계어 110111000 은 PLUS - 유니박
어셈블리어로 인해
우리는 기계어를 벗어나 인간의 언어를 모방해 프로그램을 작성하는 것이 가능하다는 걸 알게 됨
* 니모닉(Mnemonic): 어떤 것을 기억하는데 쉽게 하도록 도움을 주는 것. 또는 쉽게 기억되는 성질. 니모닉은 재사용이 필요할 때 사람의 기억을 돕기 위해 명확하게 선택된 상징이나 상징의 조합을 사용하는 것을 말한다.
C 언어 - 강력한 이식성 / One Source Multi Object Use Anywhere

어셈블리어: 같은 일을 하는 프로그램의 소스 파일을 각 기계 종류 만큼 만들어야 함(멀티 소스)
C언어: 소스 파일을 단 하나만 만들면 됨(싱글 소스)
하나의 소스 파일을 각 기계에 맞는 컴파일러로 컴파일하면, 각 기계에 맞는 기계어 목적 파일이 만들어짐
기계어, 어셈블리어, C 언어 비교

- One Source: 하나의 C 소스 파일만 작성
- Multi Object: 기종마다 하나씩 기계어 목적 파일을 생성
- Use Anywhere: 모든 컴퓨터에서 실행 가능
즉, 하나의 소스로 모든 컴퓨터에서 실행 가능(하나의 소스를 가지고 기종 별로 컴파일만 하면 해당 기종 별로 목적파일, 즉 기계어 코드가 만들어짐)
운영체제가 하드웨어의 특성을 추상화하고 컴파일러는 운영체제 별로 만들어져 공급
-> 운영체제들이 또 나름의 특성이 있기에, 하나의 소스로 각 기종 별로 컴파일하기 전에, 그 기종에 맞게 소스를 변경하는 작업 필요
ex) C언어에서 아래와 같은 설명
short는 int보다 크지 않은 정수 / long은 int보다 작지 않은 정수
Java만 배웠으면 머리에 살짝 충격이 온다(?!)
-> 이러한 차이는 어떤 운영체제는 Int를 2바이트, 다른 어떤 운영체제는 Int를 4바이트로 인지하기 때문에 발생
int는 정수를 의미하는 영어 단어의 줄임말이지, 그 크기가 몇 바이트인지 규정하는 말이 아니기 때문!
결국, One Source Multi Object Use Anywhere는 이상향!
One Source 뒤에 Fix Source, 운영체제 별 소스 수정 과정 필요
그래도!
C언어: 어셈블리어를 하나의 기계용에서 다른 기계용으로 작성하는 수고와 노력이 덜어짐
=> (어셈블리어 대비) '이식성이 좋다' (Java 대비는 아니라고 한다ㅋㅋ)
인간이 이해하기 쉬운 언어 체계가 기계어와 1:1 매칭이 아닌 m:n 매칭이 가능해짐
+ 구조적 프로그래밍
C++ 언어- 정말 인간적인 프로그래밍 방법론, 객체 지향
C++은 C에 객체 지향 개념 도입 (3장에서)
자바 - 진정한 객체 지향 언어
C++는 객체 없는 프로그래밍도 가능 -> '객체 지향 지원 언어' 라고 부르는게 맞지 않을까?!
C++의 main 함수는 클래스와 별개로 존재, printf() 함수는 클래스나 객체와 관계없이 호출 가능
객체 지향 언어의 중심: 클래스(class) or 객체(object)
자바에서는 클래스를 떠나 존재할 수 있는 건 없다!
-> 모든 메서드도 클래스.메서드명() or 객체.메서드명() 으로 접근해야 함
개발자의 사랑 실천
C: One Source Multi Object Use Anywhere
C++: 객체 지향
Java, C#: 가상 머신(Virtual Machine) - C#은 CLR(Common Language Runtime), JAVA는 JVM
즉, Write Once Use Anywhere
컴파일러를 기종 별로 따로 구매해두지 않아도 됨, 심지어 자바 컴파일러는 무료임

작성한 소스를 다른 기종의 컴퓨터에서 실행하려면
C는 소스 + 각 기종용 컴파일러 필요
자바는 오브젝트 파일만 필요 + 다른 기종 컴퓨터에 해당 기종용 JRE가 설치 되어 있어야 함
* JVM(Java Virtual Machine): 자바 프로그램을 컴파일해서 나온 결과인 바이트코드를 실행시켜주는 가상 머신
어플리케이션을 실행시켜주는 가상머신 사용 -> 윈도우,리눅스,맥 등 다양한 환경에서 언제나 동일하게 실행되도록 할 수 있음
한번 컴파일이 됐으면 운영체제에 따라 다시 컴파일할 필요가 없는 WORA(Write Once Run Anywhere) 만족
* JRE(Java Runtime Environment): 자바 실행 환경, JVM을 동작하는데 필요한 각종 자바 라이브러리를 담고 있음
* JDK(Java Development Kit): 자바 개발 키드
JRE, javac 등의 컴파일러, 디버거 등을 포함하는 프로그램
오라클사에서 제공하는 오라클 JDK, 오픈소스로 개발된 OpenJDK가 있음

JVM을 사용하기 위한 라이브러리가 JRE, 일반적인 자바 프로그램을 실행하기 위해 사용되는 것이 JRE
JDK는 JRE 포함, 컴파일러와 디버거 등이 포함된 버전, 개발자는 JDK를 설치해야함
신기술은 이전 기술의 어깨를 딛고 개발자를 위해 발전한다

신기술이 역사 속에서 환영만 받은 것은 아니다
사실 배척도 받았던 C
최적화된 컴파일러에 의해 작성된 목적 파일이라고 해도 기계어/어셈블리어로 제작된 프로그램에 비해 매우 느렸음
당시 C언어는 같은 기능을 수행하는 어셈블리어에 비해 CPU/Memory 자원을 효율적으로 사용하지 못했음
사실 배척도 받았던 C++
객체 지향은 기존의 절차적/구조적 프로그래밍과는 전혀 다른 패러다임 제시 -> 당시에는 어려웠음
사실 배척에 의해 버림받을 뻔 했던 JAVA
JVM은 말 그대로 자바 가상 기계, 즉 가상의 컴퓨터를 물리적 컴퓨터의 메모리 안에 하나 더 구축 -> 더 많은 물리적 CPU, Memory 자원 소비 + 속도도 C/C++보다도 느림
하드웨어의 발전, 하드웨어 구성 요소의 가격 하락, 최적화된 알고리즘으로 개발된 API와 JVM
-> 자바 속도 빨라짐, 성능 검사의 일부 항목에서는 C/C++보다 빠름
짧은 글, 긴 생각
UML을 대하는 자세
UML: 의사 소통 기구, 표기 방법론 -> 의사소통의 목적 위해서라면 비틀어 사용해도 됨. 표기법 하나하나에 목숨 걸지 말자
당신은 CBD, SOA가 어려운가?
CBD, SOA가 제품이 아니기 때문에 어렵다
CBD(Component Based Development): 컴포넌트 기반 개발
애플리케이션을 통째로 개발하지 않고, 의미 있는 단위로 구분하고 그 단위를 하나하나씩 부품으로 개발
-> 레고 블록처럼 부품을 결합해 하나의 소프트웨어 제품을 완성하자는 방법론이자 기법
SOA(Service Oriented Architecture): 서비스 중심 구조, 서비스 지향 구조
개발자 입자에서 개발이 아니라 실제 현실의 업무를 기준으로 개발하자
이전에도 존재한 개념, 이름을 나주에 붙인 것 뿐
사상(개념)과 제품은 별개다!
객체 지향의 4대 특성을 누군가에게 설명할 수 있는가?
JAVA라고 하는 제품을 온전히 쓰려면, 제품 속에 녹아 있는 객체 지향 4대 특성은 제대로 이해해야 함(3장)
스프링 프레임워크는 사상이면서 또 단일 제품이다
스프링은 객체 지향의 기반 위에 있음

CBD, SOA가 어려운 이유? 개념은 있으되 그것을 대표하는 제품이 없거나 사용해본 제품이 없음!
이 책의 목표: JAVA라는 제품을 이용해 객체 지향을 이해!
OOP를 구현한 제품이 자바! OOP의 특성은 자바 코드로 나타날 것
'개발자는 코드로 말한다'
스프링의 개념은? 필자는 'OOP 프레임워크' 라고 생각
즉, 스프링을 알려면 OOP와 프레임워크에 대해 알아야 함

세 개 빼고는 독자가 필요한 내용만 취해서 나중에 학습하면 됨
-> 스프링을 지배하는 근원적인 요소(스프링 삼각형): POJO(Plain Old Java Object; IoC/DI, AOP, PSA로 이뤄짐) + 설계 정보
* PSA: Portable Service Abstraction, 일관성 있는 서비스 추상화
7장에서 나옴
스프링은 ORM, OXM, JMS, AOP, CoC 등 엔터프라이즈 애플리케이션(사회적 필요를 충족하기 위해 만들어지는 App)을 구현하는데 필요한 거의 모든 서비스를 지원해줌
스프링 도입 이전에는 이런 다양한 기술을 다양한 공급자가 각자의 방식으로 구현하고 제공함
스프링은 PSA(일관성 있는 추상화) 기법을 통해 중구난방으로 구현된 다양한 기술을 표준화된 방식으로 사용할 수 있게 지원
'SW Books > 스프링 입문을 위한 자바 객체지향의 원리와 이해' 카테고리의 다른 글
[자바 객체지향 원리] 6장 - 스프링이 사랑한 디자인 패턴 (0) | 2023.08.31 |
---|---|
[자바 객체지향 원리] 5장 - 객체 지향 설계 원칙 - SOLID (0) | 2023.08.28 |
[자바 객체지향 원리] 4장 - 자바가 확장한 객체 지향 (0) | 2023.08.28 |
[자바 객체지향 원리] 3장 - 자바와 객체 지향 (0) | 2023.08.10 |
[자바 객체지향 원리] 2장 - 자바와 절차적/구조적 프로그래밍 (0) | 2023.08.07 |
객체 지향에 대한 이해는 스프링 프레임워크를 이해하기 위한 필수 조건
이 책의 목표: 본격적인 스프링 학습을 위한 사전 지식, 즉 스프링의 근간이 되는 객체지향 4대 특성, 객체 지향 설계 5원칙, 스프링에서 많이 활용되고 있는 디자인 패턴을 학습하고 이해하는 것을 목표
자바 6을 기준으로 하는 조금 오래된책이지만, 스프링 프레임워크 버전 변화와 관계 없이 스프링의 기초를 학습하는데는 지장이 없다고 하니 시작해보자!
---
신기술은 이전 기술의 어깨를 딛고
스프링을 이해하려면 과거의 어떤 기술들을 이해하고 있어야 할까?
SOA, CBD, OOP, 기계어, 어셈블리어 ...
기계어에서 객체 지향 프로그래밍 언어로
기계어 - 0과 1의 행진, 비인간적인 언어(컴퓨터가 이해하는 유일한 언어)
인류 최초의 프로그래머 -> 꺼진 상태와 켜진 상태를 각각 0과 1로 해석할 수 있는 백열전구를 이용해 프로그램 작성(사실은 백열 전구가 아닌 진공관임)
기계어 코드는 CPU에 따라 다름
어셈블리어 - 0과 1의 행진을 벗어나 인간 지행으로 / 기계어 니모닉
기계어 명령어와 일상 용어를 1:1로 매칭한 코드표 = 니모닉(Mnemonic)과 기계어의 일대일 매칭 코드표 = 어셈블리
CPU마다 기계어가 다르기 때문에 CPU별로 각자의 어셈블리어(Assembly Language)도 다름
어셈블리어를 기계로 번역해 주는 소프트웨어: 어셈블러(Assembler) 도 당연히 다르겠지
ex) 더하기를 의미하는 기계어 01010101 에 매칭되는 어셈블리어 니모닉은 ADD 라고 하자 - 애드삭
ex) 더하기를 의미하는 유니박 전용 기계어 110111000 은 PLUS - 유니박
어셈블리어로 인해
우리는 기계어를 벗어나 인간의 언어를 모방해 프로그램을 작성하는 것이 가능하다는 걸 알게 됨
* 니모닉(Mnemonic): 어떤 것을 기억하는데 쉽게 하도록 도움을 주는 것. 또는 쉽게 기억되는 성질. 니모닉은 재사용이 필요할 때 사람의 기억을 돕기 위해 명확하게 선택된 상징이나 상징의 조합을 사용하는 것을 말한다.
C 언어 - 강력한 이식성 / One Source Multi Object Use Anywhere

어셈블리어: 같은 일을 하는 프로그램의 소스 파일을 각 기계 종류 만큼 만들어야 함(멀티 소스)
C언어: 소스 파일을 단 하나만 만들면 됨(싱글 소스)
하나의 소스 파일을 각 기계에 맞는 컴파일러로 컴파일하면, 각 기계에 맞는 기계어 목적 파일이 만들어짐
기계어, 어셈블리어, C 언어 비교

- One Source: 하나의 C 소스 파일만 작성
- Multi Object: 기종마다 하나씩 기계어 목적 파일을 생성
- Use Anywhere: 모든 컴퓨터에서 실행 가능
즉, 하나의 소스로 모든 컴퓨터에서 실행 가능(하나의 소스를 가지고 기종 별로 컴파일만 하면 해당 기종 별로 목적파일, 즉 기계어 코드가 만들어짐)
운영체제가 하드웨어의 특성을 추상화하고 컴파일러는 운영체제 별로 만들어져 공급
-> 운영체제들이 또 나름의 특성이 있기에, 하나의 소스로 각 기종 별로 컴파일하기 전에, 그 기종에 맞게 소스를 변경하는 작업 필요
ex) C언어에서 아래와 같은 설명
short는 int보다 크지 않은 정수 / long은 int보다 작지 않은 정수
Java만 배웠으면 머리에 살짝 충격이 온다(?!)
-> 이러한 차이는 어떤 운영체제는 Int를 2바이트, 다른 어떤 운영체제는 Int를 4바이트로 인지하기 때문에 발생
int는 정수를 의미하는 영어 단어의 줄임말이지, 그 크기가 몇 바이트인지 규정하는 말이 아니기 때문!
결국, One Source Multi Object Use Anywhere는 이상향!
One Source 뒤에 Fix Source, 운영체제 별 소스 수정 과정 필요
그래도!
C언어: 어셈블리어를 하나의 기계용에서 다른 기계용으로 작성하는 수고와 노력이 덜어짐
=> (어셈블리어 대비) '이식성이 좋다' (Java 대비는 아니라고 한다ㅋㅋ)
인간이 이해하기 쉬운 언어 체계가 기계어와 1:1 매칭이 아닌 m:n 매칭이 가능해짐
+ 구조적 프로그래밍
C++ 언어- 정말 인간적인 프로그래밍 방법론, 객체 지향
C++은 C에 객체 지향 개념 도입 (3장에서)
자바 - 진정한 객체 지향 언어
C++는 객체 없는 프로그래밍도 가능 -> '객체 지향 지원 언어' 라고 부르는게 맞지 않을까?!
C++의 main 함수는 클래스와 별개로 존재, printf() 함수는 클래스나 객체와 관계없이 호출 가능
객체 지향 언어의 중심: 클래스(class) or 객체(object)
자바에서는 클래스를 떠나 존재할 수 있는 건 없다!
-> 모든 메서드도 클래스.메서드명() or 객체.메서드명() 으로 접근해야 함
개발자의 사랑 실천
C: One Source Multi Object Use Anywhere
C++: 객체 지향
Java, C#: 가상 머신(Virtual Machine) - C#은 CLR(Common Language Runtime), JAVA는 JVM
즉, Write Once Use Anywhere
컴파일러를 기종 별로 따로 구매해두지 않아도 됨, 심지어 자바 컴파일러는 무료임

작성한 소스를 다른 기종의 컴퓨터에서 실행하려면
C는 소스 + 각 기종용 컴파일러 필요
자바는 오브젝트 파일만 필요 + 다른 기종 컴퓨터에 해당 기종용 JRE가 설치 되어 있어야 함
* JVM(Java Virtual Machine): 자바 프로그램을 컴파일해서 나온 결과인 바이트코드를 실행시켜주는 가상 머신
어플리케이션을 실행시켜주는 가상머신 사용 -> 윈도우,리눅스,맥 등 다양한 환경에서 언제나 동일하게 실행되도록 할 수 있음
한번 컴파일이 됐으면 운영체제에 따라 다시 컴파일할 필요가 없는 WORA(Write Once Run Anywhere) 만족
* JRE(Java Runtime Environment): 자바 실행 환경, JVM을 동작하는데 필요한 각종 자바 라이브러리를 담고 있음
* JDK(Java Development Kit): 자바 개발 키드
JRE, javac 등의 컴파일러, 디버거 등을 포함하는 프로그램
오라클사에서 제공하는 오라클 JDK, 오픈소스로 개발된 OpenJDK가 있음

JVM을 사용하기 위한 라이브러리가 JRE, 일반적인 자바 프로그램을 실행하기 위해 사용되는 것이 JRE
JDK는 JRE 포함, 컴파일러와 디버거 등이 포함된 버전, 개발자는 JDK를 설치해야함
신기술은 이전 기술의 어깨를 딛고 개발자를 위해 발전한다

신기술이 역사 속에서 환영만 받은 것은 아니다
사실 배척도 받았던 C
최적화된 컴파일러에 의해 작성된 목적 파일이라고 해도 기계어/어셈블리어로 제작된 프로그램에 비해 매우 느렸음
당시 C언어는 같은 기능을 수행하는 어셈블리어에 비해 CPU/Memory 자원을 효율적으로 사용하지 못했음
사실 배척도 받았던 C++
객체 지향은 기존의 절차적/구조적 프로그래밍과는 전혀 다른 패러다임 제시 -> 당시에는 어려웠음
사실 배척에 의해 버림받을 뻔 했던 JAVA
JVM은 말 그대로 자바 가상 기계, 즉 가상의 컴퓨터를 물리적 컴퓨터의 메모리 안에 하나 더 구축 -> 더 많은 물리적 CPU, Memory 자원 소비 + 속도도 C/C++보다도 느림
하드웨어의 발전, 하드웨어 구성 요소의 가격 하락, 최적화된 알고리즘으로 개발된 API와 JVM
-> 자바 속도 빨라짐, 성능 검사의 일부 항목에서는 C/C++보다 빠름
짧은 글, 긴 생각
UML을 대하는 자세
UML: 의사 소통 기구, 표기 방법론 -> 의사소통의 목적 위해서라면 비틀어 사용해도 됨. 표기법 하나하나에 목숨 걸지 말자
당신은 CBD, SOA가 어려운가?
CBD, SOA가 제품이 아니기 때문에 어렵다
CBD(Component Based Development): 컴포넌트 기반 개발
애플리케이션을 통째로 개발하지 않고, 의미 있는 단위로 구분하고 그 단위를 하나하나씩 부품으로 개발
-> 레고 블록처럼 부품을 결합해 하나의 소프트웨어 제품을 완성하자는 방법론이자 기법
SOA(Service Oriented Architecture): 서비스 중심 구조, 서비스 지향 구조
개발자 입자에서 개발이 아니라 실제 현실의 업무를 기준으로 개발하자
이전에도 존재한 개념, 이름을 나주에 붙인 것 뿐
사상(개념)과 제품은 별개다!
객체 지향의 4대 특성을 누군가에게 설명할 수 있는가?
JAVA라고 하는 제품을 온전히 쓰려면, 제품 속에 녹아 있는 객체 지향 4대 특성은 제대로 이해해야 함(3장)
스프링 프레임워크는 사상이면서 또 단일 제품이다
스프링은 객체 지향의 기반 위에 있음

CBD, SOA가 어려운 이유? 개념은 있으되 그것을 대표하는 제품이 없거나 사용해본 제품이 없음!
이 책의 목표: JAVA라는 제품을 이용해 객체 지향을 이해!
OOP를 구현한 제품이 자바! OOP의 특성은 자바 코드로 나타날 것
'개발자는 코드로 말한다'
스프링의 개념은? 필자는 'OOP 프레임워크' 라고 생각
즉, 스프링을 알려면 OOP와 프레임워크에 대해 알아야 함

세 개 빼고는 독자가 필요한 내용만 취해서 나중에 학습하면 됨
-> 스프링을 지배하는 근원적인 요소(스프링 삼각형): POJO(Plain Old Java Object; IoC/DI, AOP, PSA로 이뤄짐) + 설계 정보
* PSA: Portable Service Abstraction, 일관성 있는 서비스 추상화
7장에서 나옴
스프링은 ORM, OXM, JMS, AOP, CoC 등 엔터프라이즈 애플리케이션(사회적 필요를 충족하기 위해 만들어지는 App)을 구현하는데 필요한 거의 모든 서비스를 지원해줌
스프링 도입 이전에는 이런 다양한 기술을 다양한 공급자가 각자의 방식으로 구현하고 제공함
스프링은 PSA(일관성 있는 추상화) 기법을 통해 중구난방으로 구현된 다양한 기술을 표준화된 방식으로 사용할 수 있게 지원
'SW Books > 스프링 입문을 위한 자바 객체지향의 원리와 이해' 카테고리의 다른 글
[자바 객체지향 원리] 6장 - 스프링이 사랑한 디자인 패턴 (0) | 2023.08.31 |
---|---|
[자바 객체지향 원리] 5장 - 객체 지향 설계 원칙 - SOLID (0) | 2023.08.28 |
[자바 객체지향 원리] 4장 - 자바가 확장한 객체 지향 (0) | 2023.08.28 |
[자바 객체지향 원리] 3장 - 자바와 객체 지향 (0) | 2023.08.10 |
[자바 객체지향 원리] 2장 - 자바와 절차적/구조적 프로그래밍 (0) | 2023.08.07 |