"객체 지향적으로 설계"와 "서술적으로 설계"에서는
오라클에서 공식적으로 보여주는 튜토리얼입니다.
우리는 앞으로 이러한 설계방식을 따라야 하며
본문에서는 상황에 맞게 조금 각색했습니다.
원문(https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html)을 참고하여 같이 보면 좋습니다.
저는 이 예제를 보았을 때 자바의 우아함에 또 한 번 놀랐습니다.
난잡함 없이 제너릭스를 구현하는 기교나 자바만의 우직한 철학에 감동하였습니다.
다음 본문부터는 하나의 가상시나리오로 기술합니다.
아마도 이 강의에서 가장 철학적인 부분이 될 것 같군요.
프로그래밍 인생을 잠시 내려놓고
오로지 하나만을 추구하는 자바의 우아함을 받아들여 한 단계 성장하는 시간을 갖도록 합시다.
Person 객체를 정렬하는 단순한 프로그램을 Object-oriented Paradigm으로 설계하고자 합니다.
import java.util.Arrays;
import java.util.List;
class Person{
public String familyName;
public String name;
public int age;
public static Person of(String familyName,String name,int age){
Person p = new Person();
p.familyName=familyName;
p.name=name;
p.age=age;
return p;
}
public void printPerson(){
System.out.println("[ familyName : " + familyName + ", name : " + name + ", age : " + age + "]");
}
}
public class Main{
public static void main(String[] args){
List<Person> arrStudent = Arrays.asList(Person.of("Choe","DongJin",12),Person.of("Kim","James",18));
printOrderThan(arrStudent);
}
public static void printOrderThan(List<Person> arrStudent){
for(Person p : arrStudent){
if(p.age > 14){
p.printPerson();
}
}
}
}몇 개의 필드와 of 메소드를 가지고 있는 Person 클래스를 선언했습니다.
printOrderThan 메소드로 List에 있는 Person 중 age 필드가 14 이상인 Person을 출력하게 했습니다.
public static void printBetweenAge(List<Person> arrStudent)이제 개발 스펙은 변경되었고
기존 printOrderThan 메소드는 printBetweenAge로 변경됐습니다.
public static void printBetweenAge(List<Person> arrStudent){
for(Person p : arrStudent){
if(p.age > 12 && p.age < 19){
p.printPerson();
}
}
}import java.util.Arrays;
import java.util.List;
class Person{
public String familyName;
public String name;
public int age;
public static Person of(String familyName,String name,int age){
Person p = new Person();
p.familyName=familyName;
p.name=name;
p.age=age;
return p;
}
public void printPerson(){
System.out.println("[ familyName : " + familyName + ", name : " + name + ", age : " + age + "]");
}
}
public class Main{
public static void main(String[] args){
List<Person> arrStudent = Arrays.asList(Person.of("Choe","DongJin",12),Person.of("Kim","James",18));
printBetweenAge(arrStudent);
}
public static void printBetweenAge(List<Person> arrStudent){
for(Person p : arrStudent){
if(p.age > 12 && p.age < 19){
p.printPerson();
}
}
}
}최종 변경사항입니다.
하지만 개발 스펙은 다시 바뀌고 필터를 추가해야 하는 상황이 됐습니다.
public static void printBetweenAgeAndCheckFamily(List<Person> arrStudent)public static void printContainName(List<Person> arrStudent)특정 나이 사이에 있고, 특정 Family Name을 가지고 있는 Person 객체를 추출하는 필터와
특정 글자가 이름에 포함되어 있으면 Person 객체를 추출하는 필터가 추가되었습니다.
interface PersonChecker{
public boolean checkPerson(Person p);
}class CheckPersonWithAge implements PersonChecker{
public boolean checkPerson(Person p){
return p.age > 12 && p.age < 19;
}
}public static void printCheckPerson(List<Person> arrStudent, PersonChecker pc){
for(Person p : arrStudent){
if(pc.checkPerson(p)){
p.printPerson();
}
}
}printCheckPerson(arrStudent, new CheckPersonWithAge());printCheckPerson(arrStudent, new PersonChecker(){
public boolean checkPerson(Person p){
return p.age > 12 && p.age < 19;
}
});이후 스펙에 따라 PersonChecker를 implement 하는 클래스를 매번 정의하는 것은
유연성이 없다고 판단, Anonymous class 형태로 호출하게 됩니다.
import java.util.Arrays;
import java.util.List;
class Person{
public String familyName;
public String name;
public int age;
public static Person of(String familyName,String name,int age){
Person p = new Person();
p.familyName=familyName;
p.name=name;
p.age=age;
return p;
}
public void printPerson(){
System.out.println("[ familyName : " + familyName + ", name : " + name + ", age : " + age + "]");
}
}
interface PersonChecker{
public boolean checkPerson(Person p);
}
public class Main{
public static void main(String[] args){
List<Person> arrStudent = Arrays.asList(Person.of("Choe","DongJin",12),Person.of("Kim","James",18));
printCheckPerson(arrStudent, new PersonChecker(){
public boolean checkPerson(Person p){
return p.age > 12 && p.age < 19;
}
});
}
public static void printCheckPerson(List<Person> arrStudent, PersonChecker pc){
for(Person p : arrStudent){
if(pc.checkPerson(p)){
p.printPerson();
}
}
}
}