객체지향적으로 설계
02 Language
객체지향적으로 설계

"객체 지향적으로 설계"와 "서술적으로 설계"에서는

오라클에서 공식적으로 보여주는 튜토리얼입니다.

우리는 앞으로 이러한 설계방식을 따라야 하며

본문에서는 상황에 맞게 조금 각색했습니다.

원문(https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html)을 참고하여 같이 보면 좋습니다.

저는 이 예제를 보았을 때 자바의 우아함에 또 한 번 놀랐습니다.

난잡함 없이 제너릭스를 구현하는 기교나 자바만의 우직한 철학에 감동하였습니다.

다음 본문부터는 하나의 가상시나리오로 기술합니다.

아마도 이 강의에서 가장 철학적인 부분이 될 것 같군요.


프로그래밍 인생을 잠시 내려놓고

오로지 하나만을 추구하는 자바의 우아함을 받아들여 한 단계 성장하는 시간을 갖도록 합시다.


Person 객체를 정렬하는 단순한 프로그램을 Object-oriented Paradigm으로 설계하고자 합니다.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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을 출력하게 했습니다.

Java
1
public static void printBetweenAge(List<Person> arrStudent)

이제 개발 스펙은 변경되었고

기존 printOrderThan 메소드는 printBetweenAge로 변경됐습니다.

Java
1
2
3
4
5
6
7
public static void printBetweenAge(List<Person> arrStudent){
		for(Person p : arrStudent){
			if(p.age > 12 && p.age < 19){
				p.printPerson();
			}
		}	
	}
printBetweenAge의 내용은 Person 객체의 age 필드가 12와 19 사이인 객체를 출력하는 형태입니다.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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();
			}
		}	
	}
}
실행하여 결과를 확인하세요!

최종 변경사항입니다.

하지만 개발 스펙은 다시 바뀌고 필터를 추가해야 하는 상황이 됐습니다.

Java
1
public static void printBetweenAgeAndCheckFamily(List<Person> arrStudent)
Java
1
public static void printContainName(List<Person> arrStudent)

특정 나이 사이에 있고, 특정 Family Name을 가지고 있는 Person 객체를 추출하는 필터와

특정 글자가 이름에 포함되어 있으면 Person 객체를 추출하는 필터가 추가되었습니다.

Java
1
2
3
interface PersonChecker{
	public boolean checkPerson(Person p);
}
계속되는 필터 요구에 따라 인터페이스를 만들고 위임하는 형태로 구성하고자 합니다.
Java
1
2
3
4
5
class CheckPersonWithAge implements PersonChecker{
	public boolean checkPerson(Person p){
		return p.age > 12 && p.age < 19;
	}
}
추후의 재사용성을 위해 CheckPersonWithAge라는 클래스를 만들고 PersonChecker를 implement 하였습니다.
Java
1
2
3
4
5
6
7
public static void printCheckPerson(List<Person> arrStudent, PersonChecker pc){
		for(Person p : arrStudent){
			if(pc.checkPerson(p)){
				p.printPerson();
			}
		}	
	}
기존에 있던 필터메소드를 printCheckPerson으로 명명
인터페이스 객체를 받을 수 있게 명명했습니다.
Java
1
printCheckPerson(arrStudent, new CheckPersonWithAge());
메소드를 호출할 때 CheckPersonWithAge의 객체를 생성하여 넘겨주었습니다.
Java
1
2
3
4
5
printCheckPerson(arrStudent, new PersonChecker(){
			public boolean checkPerson(Person p){
				return p.age > 12 && p.age < 19;
			}
		});

이후 스펙에 따라 PersonChecker를 implement 하는 클래스를 매번 정의하는 것은

유연성이 없다고 판단, Anonymous class 형태로 호출하게 됩니다.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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();
			}
		}	
	}
}
실행하여 결과를 확인하세요!
여기까지가 객체 지향적으로 설계한 소스입니다.
질문하기
추가 자료
no files uploaded

추가 자료가 없습니다

여기서 새로운 학습 자료를 확인하세요!
선생님이 추가한 자료들을 바로 확인할 수 있어요.