갑자기 왜 객체지향의 4대 원칙을 정리하냐 함은... 매번 기억이 잘 안남기에 다시 공부하고 이에 대해 정리를 해보기 위함이다.
해당 내용은 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'와 인프런 김영한님의 '스프링 핵심 원리 - 기본편' 강의를 참고하였습니다.
객체는 단순하게 이야기하면 이 세상에 존재하는 유일무이한 사물
이라고 할 수 있고
클래스는 분류, 집합, 같은 속성과 기능을 갖는 객체를 총칭하는 개념
이라고 할 수 있다.
어렵다면 요런 비유로 생각해보면 쉽다.
클래스 : 객체 = 사람 : 손흥민 = 포유류 : 고래
세상에 존재하는 유일무이한 객체를 특성에 따라서 분류해보니 객체를 통칭할 수 있는 집합인 클래스가 나왔다.
'추상' 의 사전적 의미는 다음과 같다.
여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용
그럼 우리가 아는 추상'畫'는 어떤 정의를 가질까?
추상화 (抽象畫)
- 사물의 사실적 재현이 아니고 순수한 점ㆍ선ㆍ면ㆍ색채에 의한 표현을 목표로 한 그림.
어쨌건, 뭔가 구체적인 것을 분해해서 관찰자가 관심있는 것들만으로 재조합 한다는 것을 알 수 있다.
말을 좀 더 풀어서 이야기 해보자.
추상화라는 것은 구체적인 것을 분해하여, 관심에 있는(필요한) 특성만 갖고 재조합 하는 것이다.
예를 들어보자.
병원 애플리케이션과, 은행 애플리케이션의 '사람' 이라는 클래스
는 필요한 부분이 다를 것이다.
병원에서의 사람
은 '환자'가 대부분이기에 필요한 정보는 몸무게, 나이, 지병
등의 정보일 것이고
은행에서의 사람
은 '고객'이 대부분이기에 필요한 정보는 주로 직업, 연봉
이 될 것이다.
같은 사람
임에도 필요한 정보
만 가져가서 사람이라는 클래스
를 모델링
해야 할 것이다.
모델링은 실제 사물을 정확하게 동일히 복제하는게 아니라 필요한 것만 가져가서 표현한다.
어디서 들어본 말 아니던가?
위에서 말한 것처럼 모델링
은 우리가 앞에서 사전 정의한 추상화
와 같다!
그럼 이제 우리는 이렇게 말할 수 있다.
상속...이라고 하면 뭔가를 물려받는게 떠오른다.
그러나 객체지향에서의 상속은 다르다.
객체지향에서의 상속은 상위 클래스의 특성을 재사용 & 확장
하는 것이다.
상속은 조직도나 계층도가 아니라 분류도
를 생각하는게 이해하는게 더 빠를 것이다.
그러니 할아버지-아버지-아들
의 개념보다는 동물-포유류-고래
의 개념에 가깝다고 할 수 있다.
뭔가 딱딱하다. 더 쉽게 이야기 해보자.
상속은 하위 클래스 is a kind of 상위 클래스
를 만족해야 한다.
아래의 문장은 어색함이 없다.
그러나 아래의 문장은 어색하다.
뭐...여러모로 생각해보면 맞는 이야기일 수 있으나 여러모로 생각하지 않았을 때만 고려하자.
하나의 객체가 여러가지의 형태를 가질 수 있음을 의미한다.
객체지향에서 다형성은 오버라이딩과 오버로딩 두 가지로 이야기 할 수 있다.
오버라이딩
은 상위 클래스의 메서드를 재정의
해서 사용한다.
즉, 상위클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트를 갖지만 안의 내용은 재정의 된 것이다.
오버로딩
은 같은 함수 이름을 가지나, 다른 인자 리스트를 갖는 것을 말한다. 즉, 같은 메서드가 중복정의
된 것이다.
이를 통해서 우리는 같은 기능의 자료형만 다른 메서드를 서로 다른 이름으로 기억하지 않아도 되고 (오버로딩
)
상위 클래스의 정의된 메소드가 하위 클래스에 맞지 않는 경우, 메서드를 수정하지 않고 하위 클래스에 맞게 구현할 수 있다. (오버라이딩
)
객체를 하나의 클래스라는 캡슐에 담는 것을 이야기 한다.
이렇게 담긴 캡슐을 통해서 외부에서는 정보를 볼 수 없도록 정보 은닉
을 하고,
이렇게 은닉된 정보는 접근지정자를 통해서만 접근할 수 있도록 한다.
자바에서는 다음과 같은 접근 지정자들이 있다.
public
: 다른 객체에서 해당 객체의 인스턴스를 생성하여 접근 가능.default
: 해당 객체를 상속받은 객체 내부에서 접근 가능. 인스턴스 생성으로 접근 불가능protected
: 동일한 패키지 내에서만 생성된 객체의 인스턴스를 통해 접근 가능private
: 해당 변수가 선언된 내부에서만 사용가능. 외부에서는 어떻게 해도 접근 불가능이러한 것들을 통해서 정보의 보호 및 사용자에게는 꼭 필요한 데이터만 보여줄 수 있도록 한다.