티스토리 뷰
객체 지향의 4대 특성 |
|
캡! 상추다 라고 외우자.
캡슐화
상속
추상화
다형성
캡슐화란 비슷한 속성과 메소드를 하나의 클래스로 묶은것이다. 그리고, 클래스 내부를 외부에 공개하지 않음으로써 외부에서 이 클래스를 맘대로 수정하는 일을 못하게 한다.(정보은닉) 클래스 내부에 접근하는 유일한 방법은 public 메소드를 통한 방법 뿐이다. 이 public 메소드는 클래스를 설계한 사람이 만든것이기 때문에 이 클래스가 설계자가 의도한 대로만 동작하게끔 할 수 있다. 만약 멤버 변수가 private이 아닌 public이어서 정보은닉이 되어 있지 않다면? 객체 외부에서 맘대로 멤버 변수를 수정 할 수 있기 때문에 그 멤버 변수를 이곳 저곳에서 참조하게 되면 유지보수 하기가 굉장히 힘들게 될것이다.
상속이란 부모 클래스의 메소드와 필드를 자식 클래스에서 그대로 물려 받는것을 의미한다. 상속을 활용하게 되면 코드가 재활용 되기 때문에 생산성이 높아진다. 상속은 클래스의 재사용과 확장을 위해서 사용한다.
사실, 부모클래스, 자식클래스로 상속 관계를 표현하는것은 잘못 되었다. 상위 클래스와 하위 클래스로 부르는게 더 맞는 말이다. 왜냐면, 상위 클래스는 하위 클래스보다 더 큰 분류인것이고 하위클래스는 상위 클래스보다 좀 더 구체적인 분류이다.
예를들어, 동물 클래스의 하위 클래스로는 쥐,고양이,사람과 같은 것들이 올 수 있다. 이때, 동물이 쥐,고양이,사람의 부모는 아니지 않나?? 그렇기 때문에 앞으로는 부모-자식 관계가 아닌 상위-하위클래스의 관계로 상속을 이해하도록 하자. 상위 클래스는 하위클래스의 좀 더 일반화된 개념이지, 상위 클래스가 하위 클래스의 부모가 아니다.
또한 상속을 사용하는 이유는 클래스를 확장하며 재사용하기 위함이다라는 점도 꼭 알아두자.
자바에서는 클래스를 상속받을때 inheritance라는 단어를 사용하지 않고 extends라는 단어를 사용한다. 자바의 창시자는 객체지향의 상속을 정확히 이해하고 있는것이다. 뭔가를 물려받는다는것 보다는 클래스를 확장한다고 표현하는것이 더 정확하다. 분류의 범위가 크냐 작으냐에 따라 상위클래스 하위클래스로 나뉘는것이다. 또한 모든 하위클래스는 상위 클래스이다.
동물 뽀로로 = new 펭귄(); //모든 펭귄은 동물이다.(O) 모든 동물은 펭귄이다 (X)
벤다이어그램을 그려봤을때, 동물이 펭귄을 포함하는 개념이기 때문에 위와 같은 말이 가능 한것이다.
보통 상속을 표현할때 is a 를 사용한다. 펭귄 is a 동물 , 펭귄은 하나의 동물이다. 맞는말인것 같지만, 자세히 보자. 하나의 동물이라는것은 분류(클래스)가 아니라 객체(실체)이다. 펭귄이라는 하위 분류가 특정한 한마리의 동물이다? 뭔가 논리가 맞지 않다.
따라서 is a 보다는 is kind of 가 상속을 표현하는데 더 정확한 용어이다. 펭귄 is kind of 동물, 펭귄은 동물의 한 분류,종류이다. 이렇게 해석하면 전혀 논리가 이상하지 않다.
추상화
추상화의 사전적 의미는 다음과 같다.
"여러 가지 사물이나 개념에서 공통되는 속성을 추출하여 파악한다"
추상화를 이해 하기 위해서 추상화의 대표적인 화가 피카소의 예를 보자.
피카소는 위와 같이 사람을 있는 그대로 표현하지 않고, 자신이 느낀 대로 표현 하였다.
추상화란 구체적인것을 관찰자가 관심 있는 부분만 가지고 재조합 하는것을 의미한다.
추상화는 모델링이라고 표현한다. 추상화란 어떤 실체들에서 관심있는 공통적인 특성들을 뽑아내어 하나의 분류로 만든것이다.
예를 들어, 내가 지금 병원에서 사용될 앱을 만들고 있을때, 사람이라는 클래스를 설계할때 그 클래스의 속성으로는 시력,몸무게,혈액형 등이 들어갈것이고, 은행 앱을 만들고 있을때 사람이라는 클래스에는 나이,직업,연봉등의 속성이 들어가게 될것이다. 즉, 어떤 실체(객체)들에서 내가 관심있는 공통적인 부분만을 추출하여 하나의 분류(class)로 만든것이 추상화이다.
다른말로 은행의 고객들(실체)에서 내가 관심있는 공통적인 부분(나이,직업,연봉)을 추출하여 하나의 분류(사람이라는 클래스)로 만든것이 추상화 라는것이다. 이런 의미에서 추상화를 모델링이라고 부르는것이다. 지구본을 보면 지구를 정확히 표현하는것이 아니라, 지구를 본따서 사람들이 궁금해하는 공통적인 부분을 추출하여 만든것이다. 지구본이 지구를 모델링 하고 있으며 지구본은 지구를 추상화 하고 있다.
기억하기 쉽게끔 마지막으로 정리를 하자면, 지구본이 지구를 모델링한것처럼 추상화는 어떤 실체(지구)에서 관심 있는 부분을 추출하여 만든 것이다.
객체 지향에서의 상속을 보자. 부모 클래스를 자식 클래스가 상속 받는다. 이때, 자식클래스를 추상화 한것이 부모 클래스이다. 즉, 자식 클래스들의 어떤 공통적인 속성들을 관심있는 부분만 모아놓은것.
또한, 인터페이스도 추상화의 예이다. 인터페이스도 마찬가지로 이 인터페이스를 구현한 클래스(실체)들에서 공통적이고 관심 있는 속성만을 뽑아서 모아놓은것이다.
실체에서 공통적인것,관심있는것들을 뽑아서 한곳에 모으면 그것이 모두 추상화이다.
추상화의 결과는 사람마다 다를 수 있다. 매우 주관적이다. 모델이란 자바 언어에서 클래스로 표현된다.
즉 어떤 객체로부터 공통적이고 관심있는 부분만을 추출하여 한곳에 모아놓은것이 클래스이다. 그리하여 클래스를 모델이라고 표현한것이다.
출처 스프링 입문을 위한 자바 객체 지향의 원리와 이해
'컴퓨터 공학과 졸업 > 객체지향' 카테고리의 다른 글
자바1 (0) | 2018.09.08 |
---|---|
클래스와 객체의 관계 (1) | 2018.07.27 |
다형성이란 (0) | 2018.01.22 |
추상 클래스와 인터페이스 (0) | 2018.01.22 |
c++ 업캐스팅과 다운캐스팅 (2) | 2018.01.16 |
- Total
- Today
- Yesterday
- return type
- atomic design
- computed
- react
- mobx
- state
- async
- Polyfill
- Action
- typescript
- promise
- Next.js
- webpack
- type alias
- reactdom
- storybook
- design system
- es6
- await
- rendering scope
- server side rendering
- react hooks
- javascript
- reflow
- reducer
- props
- hydrate
- useEffect
- useRef
- Babel
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |