객체 지향이란?
프로그래밍에 필요한 데이터를 추상화해서 상태와 행위를 가진 객체를 만들고
그 객체들 간의 유기적인 상호작용을 통해서 로직을 구성하는 프로그래밍 방법입니다.
객체 지향과 절차 지향의 차이
가장 큰 차이는 '프로그래밍 관점이 어디에 있는가'의 차이라고 말할 수 있습니다.
절차 지향 프로그래밍은 먼저 프로그래밍의 제어 순서를 결정하고 데이터를 조작하는 반면,
객체 지향 프로그래밍은 객체 설계에 중점을 맞춘다음 그 후에 실행 순서를 결정합니다.
객체 지향으로 프로그래밍하면 뭐가 좋은가요?
클래스 단위로 모듈화 시켜서 개발할 수 있으므로 협업에 있어 일을 분담하기가 쉽습니다.
(모듈화 : 관련 부품을 하나의 덩어리로 만드는 것)
남이 만들어 놓은 클래스를 가져와서 이용할 수 있고, 상속을 통해서 확장을 할 수도 있는 등,
코드의 재사용성이 용이합니다.
절차 지향 프로그래밍은 코드를 수정할 때 일일히 순서를 찾아서 수정해야 하는 반면에,
객체 지향 프로그래밍은 수정해야 할 부분이 클래스 내에 위치하기 때문에 해당 부분만 수정하면 되므로 유지보수가 쉽습니다.
객체 지향의 단점은 없나요?
- 설계하는 데 있어 많은 시간과 노력이 필요합니다.
- 객체가 많아지면 용량이 커집니다.
- 처리 속도가 상대적으로 느립니다.
객체 지향으로 코드 설계하기
객체 지향의 특성 : 캡 상 추 다 (요리를 만들기 위한 주방기구)
객체 지향 설계 5원칙 : S O L I D (주방기구를 올바르게 사용하는 방법)
객체 지향의 특성
캡슐화
- 접근제어자를 통해 실제 구현한 내용을 외부에 감추는 것을 말합니다.
- 캡슐화를 사용하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되는것을 방지하기 위함입니다.
상속
- 클래스를 재사용하는것
- 상위클래스를 상속받게 되면 하위클래스는 상위클래스의 기능을 그대로 사용할 수 있습니다.
추상화
어떤 실체로부터 공통적인 것이나 관심있는 특성을 한 곳으로 모은 것을 말합니다.
ex) 지구본 - 지구본은 실제 지구의 관심있는 특성인 대륙의 위치, 위도, 경도 등을 뽑아서 만든 것
즉, 지구를 추상화해서 지구본을 만든 것이죠.
객체 지향에서의 추상화는 어떤 하위클래스의 공통적인 메서드를 인터페이스로 정의하는 것의 예를 들 수 있습니다.
다형성
같은 모양의 함수가 상황에 따라서 다르게 동작하는 것을 말합니다.
오버로딩과 오버라이딩의 예를 들 수 있습니다.
오버로딩
- 메서드의 이름은 같은데 인자가 다른 것
오버라이딩
- 상위클래스의 메서드를 하위클래스에서 재정의하여 사용하는 것
- 메서드의 이름은 같은데 상황에 따라서 다르게 동작
객체 지향 설계 5원칙
SRP (Single Responsibility Principle) : 단일 책임 원칙
각각의 클래스, 함수들이 한가지의 기능만 수행하도록 개발하는 것을 말합니다.
단일 책임 원칙을 만족하면..
- 코드를 봤을 때 이해하기 쉬운 코드가 됩니다.
- 함수의 기능에 문제가 발생하였을 때, 해당 함수만 수정하면 되므로 유지보수 하기가 쉽습니다.
단일 책임을 위배하면..
- 함수 또는 클래스가 두 가지 이상의 기능을 가지면 가독성이 떨어지므로 로직을 파악하는데 시간이 오래 걸립니다.
- 한 가지 기능만 수행했을 때 보다 상대적으로 버그가 발생할 확률이 높아지며 유지보수가 힘듭니다.
산탄총 수술 (Shotgun sergery)
- 여러가지 기능을 수행하는 코드를 산탄 총알로 비유하여, 해당 코드를 SRP 원리에 따라서 리팩토링(수술) 하는 것을 말합니다.
OCP (Open Closed Principle) : 개방 폐쇄 원칙
확장에는 열려있고 변화에는 닫혀있다라는 말로,
기능을 변경하거나 확장할 수 있으면서 사용하는 쪽에서는 코드의 변경이 없어야 한다는 원칙입니다.
LSP (Liskov Substitution Principle) : 리스코프 치환 원칙
서브 타입(자식 클래스)은 언제나 자신의 기반 타입(부모 클래스)으로 교체할 수 있어야 한다는 원칙입니다.
하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 합니다.
// 변경 전 ArrayList<Person> persons = new ArrayList<>(); // 변경 후 List<Person> persons = new ArrayList<>();
예시 : 직사각형과 정사각형 예제 (참고 - 머루의 개발 블로그)
ISP (Interface Segregation Principle) : 인터페이스 분리 원칙
단일 책임 원칙이 클래스나 함수가 한 가지 기능만 하도록 하는 것이라면,
인터페이스 분리 원칙은 인터페이스가 한 가지 기능만 하도록 분리하는 원칙입니다.
인터페이스 최소주의 원칙
인터페이스를 통해 메서드를 외부에 제공할 때는 최소한의 메서드만 제공해야 합니다.
상속 VS 인터페이스
- 상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다.
- 상위클래스가 빈약하면 상속의 혜택을 제대로 누리지 못한다. (불필요한 캐스팅을 해야함)
- 인터페이스는 '~할 수 있는 (is able to)' 이라는 기준으로 만드는 것이 정석.
DIP (Dependency Inversion Principle) : 의존 역전 원칙
변하기 쉬운 것에 의존하지 말고 변하기 어려운 것(추상화)에 의존해야 한다는 원칙입니다.
이를 통해 변화에 영향을 받지 않는 코드로 설계할 수 있습니다.
예를 들면, 자동차에 스노우타이어가 장착되어 있습니다.
계절이 변함에 따라 스노우타이어를 일반타이어로 바꿔야 하는데, 자동차가 스노우타이어에 의존하고 있어 변경하기 어려운 상황이 발생하게 됩니다.
하지만 자동차가 추상화된 타이어 인터페이스에 의존하게 한다면, 구체적인 타이어로 변경해도 자동차는 영향을 받지 않는 형태로 만들 수 있다는 장점이 있습니다.
DIP를 만족하게 되면 OCP도 만족하게 됩니다.
'Interview' 카테고리의 다른 글
트랜잭션 (0) | 2019.12.10 |
---|---|
추상클래스와 인터페이스 (0) | 2019.12.09 |
댓글