객체지향이 왜 필요하게 되었는지를 생각해보자.
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);
}


