이 글은 최범균님의 Inflearn 강의를 학습한 내용을 정리하였습니다.
처음 언어를 배우며 객체지향을 위한 특징(상속, 인터페이스, 클래스, 추상메소드 등)을 배운다.
하지만 입문 단계에서 동시에 객체 지향적으로 프로그래밍하는 것은 매우 어렵다.
이 강의를 통해서 객체 지향적으로 프로그래밍하기 위한 도움을 받아보자.
*LOC: Lines of Code |
---|
출처: Slow and dirty with callouts
왼쪽 그래프를 해석해보면 X축은 출시 횟수, Y축은 코드 한 줄을 추가하기 위한 비용이다.
그래프를 보면 출시 횟수가 증가할 때 코드 한 줄을 추가하는 비용은 어마어마하게 커진다.
오른쪽 그래프를 해석해보면 X축은 출시 횟수, Y축은 전체 코드 라인 수이다.
코드 라인 수는 5번 출시 이후로 거의 증가되지 않는다.
두 그래프를 통해 전달하고자 하는 내용은 아래와 같다.
그럼 이런 일이 발생하게 되는 이유가 뭘까?
핵심 로직들의 소요시간을 측정하는 코드를 통해서 알아보자.
// 소요시간 측정 (millis)
long start = System.currentTimeMillis();
...
long end = System.currentTimeMillis();
long elapsed = end - start;
처음에는 시간 단위를 millis로 하였지만 nano 단위로 변경해야되는 상황이 되었다.
그래서 시간을 측정하는 코드를System.currentTimeMillis();에서 System.nanoTime();으로 바꿔야한다.
// 소요시간 측정 (nano)
long start = System.nanoTime();
...
long end = System.nanoTime();
long elapsednano = end - start;
이때 소요시간을 측정하는 코드가 하나만 작성이 되어있다면 코드를 변경하는데 어려움이 없을 것이다.
하지만 보통 이런 종류의 코드들은 한 곳에만 있지 않은 경우가 많다.
이는 곧 변경을 위한 코드들을 찾는 시간이 증가하고 결과적으로 Cost/LOC이 증가하게 되는 상황이다.
조건 변수에 따라 실행되는 로직이 달라지는 코드를 통해서 알아보자.
시간이 지나 위 로직이 아래의 코드로 수정이 된다면
첫 번째 if문에서 mode 값이 변경되었고 아래의 조건문도 실행하는 결과로 이어진다.
이는 mode가 10인 경우에 로직과 mode가 10이 아닌 경우의 로직도 실행하여 예상하지 못한 결과를 만들어 낼 것이고 디버깅을 하는데 시간이 소요될 것이다.
결과적으로 Cost/LOC이 증가하게 되는 상황이다.
if문에 조건을 추가하는 상황을 통해서 알아보도록 하자.
원래 사이트에는 Membership이 REGULAR 뿐이었지만 시간이 흘러 Membership으로 PRO가 추가되었다.
유료 회원의 사용 기능을 PRO Membership을 가진 회원들에게도 제공하기 위해 아래와 같이 변경이 필요하다.
이렇게 기능을 추가해되는 조건이 여러개가 있다면, 또 추가된 Membership이 여러가지라면 모든 조건을 다 찾아서 수정하려면 비용이 굉장히 클 것이다.
위 3가지 예를 통해서 코드 한 줄을 추가•수정에 비용이 증가하는 이유를 크게 2가지로 나눌 수 있을 것이다.
소프트웨어를 개발/유지보수하면서 뭔가를 변화시킬 때 고비용이 들어가면 경쟁력이 떨어지게 된다.
그렇기 때문에 저비용으로 변화시킬 수 있는 방법을 적용해야된다.
객체 지향이 개발 비용을 줄여주는 방법으로 캡슐화 + 다형성(추상화)이 있다.
이 강의를 통해 구체적인 내용을 알아보도록 하자.