객체지향이 왜 필요하게 되었는지를 생각해보자.
10과 20을 더한다
프로그래밍으로 이런 일을 한다는 것을 말이 안된다. 이 코드는 매우 길고 복잡한 로직이라고 간주하자.
package offline_tutorials; public class Company { public static void main(String[] args) { System.out.println(10+20); } }
요구사항이 바뀐다
초기 10과 20의 덧셈을 100과 200으로 바꿔달라는 요구사항이 들어왔다. 가변적인 부분을 변수화시켜서 로직에서 분리한다. 변수는 데이터를 담는 그릇이라는 점을 상기하자.
int left = 100; int right = 200; System.out.println(left+right);
로직이 여러곳에서 사용된다
메소드화를 통해서 재활용성을 높인다. 메소드는 로직을 담는 그릇이라는 점을 상기하자.
static void sum(int left, int right){ System.out.println(left+right); } public static void main(String[] args) { int left = 10; int right = 20; sum(left, right); left = 100; right = 200; sum(left, right); }
이름의 의미가 달라지기 시작한다
프로젝트가 커지면서 협업을 하게 된다. 합류한 개발자가 sum의 의미를 합계가 아니라 요약(summary)라는 의미로 사용한다. 또 변수 right를 기존의 우항에서 임금(권리)으로 사용한다. 같은 이름에 다른 기능을 가진 코드가 등장한다. 아래 코드는 동작하지 않는다.
static void sum(int left, int right){ System.out.println(left+right); } static void sum(int period, int right){ System.out.println("급여 : "+right*period); } public static void main(String[] args) { int left = 10; int right = 20; sum(left, right); right = 5000; int period = 2; sum(period, right); }
이름의 충돌을 해결하자
static void calculator_sum(int left, int right){ System.out.println(left+right); } static void employee_sum(int period, int right){ System.out.println("급여 : "+right*period); } public static void main(String[] args) { int calculator_left = 10; int calculator_right = 20; calculator_sum(calculator_left, calculator_right); int employee_right = 5000; int employee_period = 2; employee_sum(employee_period, employee_right); }