Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2주차 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해 3장 내용 중 공부한 내용 정리. #3

Merged
merged 2 commits into from
Jan 12, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions week2/yongjin/yongjin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
### 객체 지향은 인간 지향이다.

지금까지 어셈블리어 → C → C++ → Java, Python처럼 저수준에서 고수준 언어로 발전해 왔다. 이러한 발전은 인간이 프로그래밍을 더 쉽게 이해하고 사용할 수 있도록 언어가 변화해온 과정이다.

그러나 절차지향 프로그래밍과 구조적 프로그래밍은 언어처럼 눈에 띄게 발전하지 않았고, 포인터와 같은 기계 수준의 개념을 이해하지 않으면 다루기 어려운 기법들이 많았다.

여기서 "왜 우리가 기계에 종속적인 방식으로 개발해야 하는가?"라는 의문이 제기되었고, 이러한 문제를 해결하기 위한 새로운 접근법으로 객체지향 프로그래밍이 등장했다. 객체지향 프로그래밍은 우리에게 친숙한 객체, 즉 사물을 중심으로 현실 세계의 개념을 반영하여 설계되었다.

기존의 구조적 프로그래밍에서 가장 중요한 요소는 함수였다. 구조적/절차적 프로그래밍 언어에서 함수는 코드를 논리적인 단위로 구분하고 분할하여 정복하는 것에 목적이 있었다. 즉, Divide and Conquer(D&C) 방식으로 문제를 해결하는 데 초점이 맞춰져 있었다. 물론 중복 제거의 목적도 있었다.

함수를 도입함으로써 프로그래밍이 더 편리해졌을 때, 현실 세계의 객체를 인지하는 방식으로 프로그램을 설계하자는 아이디어가 나왔고, 그 결과 객체지향 프로그래밍이 탄생했다. 컴퓨터의 0과 1로 이루어진 사고방식 대신 현실 세계의 객체와 유사한 방식으로 프로그래밍할 수 있다는 점에서 객체지향 프로그래밍은 더 직관적이다.

요약하자면, 절차지향이 가진 기계 수준의 복잡성을 극복하고자 만들어진 것이 객체지향 프로그래밍이며, 현실 세계의 객체를 반영한 설계 방식 덕분에 더 직관적인 접근법이라 할 수 있다.

---

### 객체 지향을 이해하려면 다음과 같은 특징들을 이해해야 한다.

- 세상에 존재하는 모든 것은 객체이다.
- 각각의 객체는 고유하다.
- 객체는 속성을 갖는다. (property)
- 객체는 행위를 할 수 있다. (method)

객체 지향은 인간의 인지와 사고방식을 프로그래밍에 접목시켜 더 직관적이다.

### 객체지향의 4대 특성

객체지향 프로그래밍의 핵심 개념은 4대 특성으로 요약할 수 있다. 이를 쉽게 외우기 위해 "캡! 상추다"라는 표현이 사용되기도 한다.

- **캡**: 캡슐화
- **상**: 상속
- **추**: 추상화
- **다**: 다형성

### 클래스 : 객체 ≠ 붕어빵틀 : 붕어빵

많은 책이나 강의에서 클래스와 객체의 관계를 붕어빵틀과 붕어빵에 비유하곤 한다. 그러나 이 비유는 잘못된 설명이다. 코드를 살펴보면 금방 이해할 수 있다.

```Java
// (클래스) 객체명 = new 클래스();
붕어빵틀 붕어빵 = new 붕어빵틀();
```

코드만 봐도 붕어빵틀이 곧 붕어빵이 될 수 없다는 것을 알 수 있다. 붕어빵틀을 가지고 어떻게 붕어빵이 될 수 있겠는가?

아직도 이해가 안 된다면 다음 문장을 생각해보자.

*붕어빵틀을 하나 만들었는데 붕어빵이 되었다.*

이제 이해가 되었는가? 붕어빵틀과 붕어빵의 비유는 클래스와 객체의 관계를 설명하는 데 적절하지 않다.

조금 더 정확하게 표현하자면, 객체는 클래스의 인스턴스라고 부른다. 붕어빵틀과 붕어빵의 관계는 클래스를 틀에 비유하여 설명하는 데 초점을 맞춘 설명일 뿐이다. 하지만 엄밀히 말하면 클래스와 객체의 관계를 설명하는 데 적합하지 않다.

클래스와 객체의 관계를 더 적절하게 설명하자면 "사람 : 이용진"과 같은 관계가 적합하다. 사람이라는 개념은 실체가 아니지만, "이용진"이라는 특정 사람은 실체이다. 즉, **클래스는 분류에 대한 개념이지 실체가 아니며, 객체가 실체이다.**

---

### 추상화

**추상화**란 무엇인가? 추상화는 즉, **모델링**이다.

추상화라는 개념을 이해하려면 먼저 애플리케이션의 경계(context)에 대해 알아야 한다. 예를 들어 사람이라는 클래스를 설계한다고 할 때, 사람의 속성과 행동은 무수히 많을 수 있다. (예: 먹기, 자기, 보기, 요리하기 등)

하지만 병원 애플리케이션을 개발한다고 가정하면, 사람 클래스에는 병원과 관련된 속성과 행동만 포함해야 한다. 예를 들어 환자, 의사, 병원장과 같은 역할에 필요한 속성과 행동만 정의하는 것이다.

이처럼 특정 애플리케이션 경계에 맞게 관심 영역의 특성을 조합하여 모델링하는 과정을 **추상화**라고 한다. Java에서는 `class` 키워드를 통해 객체지향의 추상화를 지원한다.

추상화는 주관적이다. 설계자가 누구냐에 따라 모델링 방식은 달라질 수 있다.
Loading