절차지향 프로그래밍은 추상적인 개념이다. 흑백처럼 절차지향이냐 아니냐로 구분할 수도 없다. 중요한 것은 우리는 객체지향 프로그래밍을 지향해야한다는 것이고 반대편에 존재하는 절차지향 프로그래밍을 이해하여 객체지향의 이해도를 높힐 수 있다는 것이다.
간단한 프로그래밍 요구조건이 주어진다. Radio를 켜고 끌 수 있고 volume을 올리거나 내리는 조건의 프로그램을 작성해야 한다.
On - volumeup(초기 볼륨0) - volumedown - Off의 순서로 절차적인 기능 시험을 진행한다고 한다.
boolean is_on = true;
int volume = 0;
volume = 1;
volume = 0;
is_on = false;
위의 코드처럼 짠다면 절치지향적이다. 아래의 코드처럼 짠다면 객체지향적이다.
public class Radio {
boolean is_on = True;
int volume = 0;
void clickOnButton {
멤버변수 is_on을 키거나 끄는 작업
}
void upVolume {
볼륨을 올림
}
void downVolume {
볼륨을 내림
}
}
위의 예시처럼의 클래스를 활용해서 주어진 절차를 그대로 실시한다면
// 주어진 테스트 구현
Radio rd = new Radio();
rd.clickOnButton()
rd.upVolume()
rd.downVolume()
rd.clickOnButton()
Radio에 관련한 모든 데이터와 행동들이 Radio클래스 안에 메서드로 작성된다.
코드의 절대적인 량은 객체지향적으로 작성했을 때 더 많고 복잡하다. 클래스를 만들고 그것을 절차지향적인 스토리에서 기능하게 만들었기 때문이다.
하지만 유지보수적 관점에서 절차지향적인 코드보다는 객체지향적인 코드가 좋은 경우가 많다. 절차지향적인 로직은 속도적인 관점에서 성능이 올라갈 수 있겠지만 코드가 커지고 해당 코드들이 서로 연결되어 종속적이라면 문제가 터졌을 때 어디서 문제가 되는 지 알기 어려울 수 있다.
만약 다른 시나리오의 테스트가 매일매일 주어진다면 절차지향적인 코드는 모든 기능을 절차에 맞게 다시 짜야하지만 클래스가 존재한다면 다른 테스트 시나리오에 맞추어 기능을 호출하면 그만이다. 고정된 것은 라디오이다. 테스트는 매일 변화하므로 고정된 라디오가 가진 기능의 순서를 다르게 구성하면 되는 것이다.
수학적으로 표현하자면 근의 공식은 클래스이며 a,b,c를 대입하여 근을 구한다. 변수에 해당하는 위치에 값을 넣어 원하는 최종결과를 얻을 수 있는 것처럼 우리는 아무리 복잡한 2차 방정식이라도 해를 쉽게 구할 수 있게 된다. 클래스의 기능들을 원하는 순서로 놓고 사용한다.
이때동안 우리는 실습과정에서 메서드는 public static void 메서드명() {내부로직}
와 같이 작성했다. 클래스 내부의 메서드일 때 static은 빠지게 된다. 일반적인 메서드로, 객체를 생성해서 사용하는 메서드를 말하며 이를 인스턴스 메서드
라고 한다. 이러한 메서드는 객체가 생성 되어야 사용 가능하다. 객체.메서드()의 방식으로 사용하는 것에서 이를 알 수 있다.
클래스의 메서드를 작성할 때 객체.메서드()
형태로 사용하기 위해서는 static을 작성해서는 안된다.