객체지향의 4대 특성
객체와 클래스를 먼저 이해하자
개인적인 특징을 가질 수 있다면 객체 -> 경호는 안경을 쓴다.
개인적은 특징을 가질 수 없다면 클래스 -> 사람은 안경을 쓴다?
캡슐화
내부 구현을 외부에 최대한 노출시키지 않는 방법.
이러한 설계를 통해서 객체에 수정에 따른 외부의 수정을 최소화 시킨다.
외부에서는 내부 구현은 알 필요가 없다. 그저 사용만 하면 된다.
사용자가 자동차 내부 엔진의 동작 방식을 이해하지는 않는다. 그저 엑셀을 밟기만 하는 것이다.
내부 구현을 외부에서 알고 그 값을 사용하게 된다면 내부의 수정이 외부에 영향을 끼치게 된다.
내부의 수정이 외부의 영향을 끼치게 된다면 잘못된 캡슐화로 볼 수 있다.
잘못된 캡슐화
접근자, 수정자를 통해서 외부에서 객체의 상태를 변경할 수 있도록 한다.
메서드(행동) 을 통해서 내부 상태를 바꾸어야 하지, 직접적으로 내부 상태를 바꾸는 것은 캡슐화를 저하해는 일이다.
수정자를 통해서 상태를 변경하는 것 자체가 외부에서 내부에 관여하는 것이다.. (결합도 상승)
메서드 파라미터를 통해서 객체의 멤버변수를 사용하게 된다.
메서드의 변경이 일어날 시 외부에서 수 많은 수정이 일어나게 된다.
같은 종류의 메서드 인터페이스를 외부에 노출시킨다. (할인정책)
외부에서는 할인을 한다는 것만 알면 되는 것이지 어떠한 방식으로 할인을 하는 것인지는 중요하지 않다.
진정한 캡슐화
개인적인 생각으로 객체에게 메시지(행위)만 노출시키는 것이 캡슐화를 지키는 길이라 생각한다.
메시지를 던진다는 것 자체가 '어떻게'(방법)가 아닌 '무엇을'(행위)을 물어보는 것이기 때문이다.
객체에게 메시지를 전달하다보면 자연스럽게 getter 문이 줄어들고, 객체의 내부 구현을 감추면서 다른 객체에게 원하는 결과만 전달하기 용이하다.
그리고 이와 더불어 외부에 내부 구현을 알리는 메소드명이나 파라미터명을 쓰지 않도록 자제하면 좀 더 캡슐화를 지키기 쉬울 것이다.
상속
현실세계에서 생각하는 상속과 객체지향에서 상속은 조금 다르다.
말그대로의 상속보다는 확장의 개념을 생각하자.
자바에서 클래스를 상속할 때 inheritance(상속) 가 아닌, extends(확장) 을 사용하는 것을 보아도 제임스 고슬링이 상속을 확장에 개념으로 생각하는 것을 볼 수 있다.
객체지향에서 다음 문장을 만족해야만 상속관계라는 것을 생각할 수 있다. -> 하위클래스는 상위클래스다.
상위 클래스로 갈수록 추상화, 일반화 되었다고 말하며,
하위 클래스로 갈수록 구체화, 특수화 되었다고 말한다.
인터페이스와 클래스의 상속은 조금 다르다.
인터페이스 : be able to -> 인터페이스의 행위를 할 수 있다.
명확한 계층 구조 없이, 특정 행위를 강제하고 싶을 때 인터페이스를 상속한다.
클래스 : is kind of -> 하위 클래스가 상위 클래스의 소속된다.
명확한 계층 구조가 있을 때, 구조를 확장하고자 한다면 클래스를 통해 상속한다.
추상화 : 모델링
속성과 기능을 도메인에 맞도록 설계하는 것을 추상화라고 한다.
객체지향의 추상화는 곧 모델링이다.
구체적인 것을 분해해서 관심 영역(애플리케이션 영역) 에 있는 특성만 가지고 재조합하는 것
병원 / 은행 애플리케이션에서 사람을 정의하는 특성이 다르다.
클래스 설계를 위해서 객체부터 정의해야 한다.
다형성 : 사용편의성
동일한 메시지를 다양한 의미로 사용할 수 있다.
다형성이란 하나의 객체를 여러 가지 타입에 대입할 수 있다는 것을 의미한다.
상위 클래스의 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것.
다형성을 구현하는 방법에는 대표적으로 오버라이딩, 오버로딩, 상속이 있다.
Last updated