구조적 프로그래밍
- '함수'를 통해 코드를 논리적인 단위로 구분하고 분할해서 정복하자. (Divide & Conquer)
- 함수: 중복 제거, 논리의 분할
=> 구조적 프로그래밍에서 더 나아가, 현실세계에서 사물을 인지하는 방식으로 프로그래밍할 수 있지 않을까?
객체 지향의 시작점
- 세상에 존재하는 모든 것들은 사물, 즉 객체(Object)이다.
- 각 객체는 고유(Unique)하다.
- 객체는 속성(attribue)을 가지며, 행위(method)를 한다.
클래스(Class)와 객체(Object, Instance)의 차이점
- 클래스는 개념, 객체는 그 개념에 속하는 실체
class 사람 {
int 주민번호;
int 키;
int 몸무게;
}
사람 김땡땡 = new 사람(961231-1234123, 188, 80);
사람 김키키 = new 사람(961231-2234123, 170, 70);
사람 김하하 = new 사람(961211-1224523, 151, 45);
사람이라는 개념은 클래스,
김땡땡, 김키키, 김하하는 사람이라는 개념에 속하는 각각의 고유한(unique) 객체
추상화(Abstaction)
- 구체적인 각각의 사물에서 공통된 특성을 찾아내 하나의 집단화는 것
- OOP에서의 추상화는 곧 모델링이다.
- 구체적인 것을 분해해 '관심 영역'에 있는 특성만 가지고 재결합하는 것
애플리케이션 | 병원 | 은행 |
사람이란? | 환자 | 고객 |
클래스 | class 사람 { 시력, 몸무게, 혈액형 운동하다, 자다 } |
class 사람 { 연봉, 직업, 나이 입금하다, 출금하다 } |
- 왜 '관심영역'에 따라? : 구체적인 사물을 보는 관점에 따라, 서로 다른 추상화가 이루어지기 때문이다.
- 좁은 의미로 객체 지향에서 추상화의 결과는 클래스이다.
- 더 넓은 의미로는 상속, 인터페이스, 다형성 또한 추상화의 개념에서 접근할 수 있다.
상속(Inheritence => extends)
- 상위 클래스의 특성을 하위 클래스가 이어받고 확장해 사용할 수 있다.
- 재사용과 확장
- 하위 클래스는 상위 클래스이다.
고래는 포유류이다.
포유류는 동물이다.
- 'is a kind of' 관계
고래 is a kind of 포유류
포유류 is a kind of 동물
=> 보통 'is a' 관계로 표현하지만, 'is a' 관계보다 'is a kind of'가 더 완벽한 표현이 된다.
다중 상속
- JAVA와 C#은 다중 상속을 지원하지 않는다.
- 다중 상속의 다이아몬드 문제
class 인어가 class 물고기와 class 사람을 함께 상속받았을 때.
'헤엄치다'라는 메소드를 사용하게 되면 물고기의 헤엄과 사람의 헤엄 둘 중 어느 것을 선택해야 하는가?
- C++은 개발자에게 선택을 위임
인터페이스와 상속
- JAVA는 인터페이스를 통해 다중 상속의 득만을 취하길 원했다.
- 'is able to' 관계
- 인터페이스는 상속받은 클래스가 '무엇을 할 수 있다'는 기능을 구현하도록 강제한다.
- ex) Comparable interface, Serializable interface ...
다형성
- 오버로딩(Overloading)과 오버라이딩(Overriding)
오버로딩이 다형성인지에 대해서는 이견이 있다고 한다.
- 사용편의성
- 하나의 변수명, 함수명이 상황에 따라 다르게 해석된다.
캡슐화
- 접근제어자를 통해 정보은닉을 한다.
public | 모두가 접근 가능 |
protected | 같은 패키지/ 상속받은 패키지 내에서 접근 가능 |
[default] | 같은 패키지 내에서 접근 가능 |
private | 자신만 접근 가능 |
참조) 김종민. (2015). 스프링 입문을 위한 자바 객체지향의 원리와 이해
'Backend > OOP' 카테고리의 다른 글
[10분 테코톡] MVC 패턴 with 제리, 해리&션 (0) | 2021.07.15 |
---|---|
[10분 테코톡] DTO vs VO with 인비, 라흐, 지노&비모 (0) | 2021.07.15 |
[UML] PlantUML로 UML Diagram 쉽게 활용하기 with IntelliJ (0) | 2021.07.14 |