본문 바로가기

Backend/OOP

[OOP] 객체 지향이란? 객체지향의 4가지 특성

구조적 프로그래밍

- '함수'를 통해 코드를 논리적인 단위로 구분하고 분할해서 정복하자. (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). 스프링 입문을 위한 자바 객체지향의 원리와 이해