지난 수업에서 VO class 를 배웠다.
오늘은 이를 응용하고 더 확장해보는 수업이었다.
VO class
- 다른말로는 DTO (Data Transfer Object) , DO(Domain Object), Entity, bean 이라고도 한다.
vo class 작성방법
1. private field
2. public getter/setter (위치 생성자 아래도 가능)
3. 기본 / 모든 파라미터 생성자
4. 필드정보 확인용 메소드
보통 getter/setter를 제외하고는 순서도 이 순서대로 쓴다.
다음과 같은 구조에서, 먼저 Person.java 클래스를 작성해본다.
public class Person {
//field
private String name;
private int age;
private boolean married;
//constructor
public Person() {}
public Person(String name, int age, boolean married) {
this.name=name;
this.age=age;
this.married=married;
}
//getter / setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
//정보확인용 메소드
public String getPersonInfo() {
return"["+name+", "+age+", "+married +"]";
}
}
지난 수업에서도 작성했던 대로 VO class 작성 규칙을 따라 작성했기 때문에 어렵지 않았다.
이제 이를 실행할 Person Main을 작성한다.
1. Person[]
Person 객체 주소값을 여러개 가진 배열
new 객체 선언을 통하여 갯수를 지정하고, 각 Person배열의 자리마다 값을 넣어준다. 그리고 내용은 반복문을 통해 출력한다.
public void test1() {
Person[] persons;
persons=new Person[3];
persons[0]=new Person("홍길동",33,false);
persons[1]=new Person("신사임당",48,true);
persons[2]=new Person("이순신",55,true);
for(int i=0;i<persons.length;i++) {
System.out.println(persons[i].getPersonInfo());
}
}
2. 초기화
배열 변수 선언 & 배열 할당 & 요소할당을 초기화를 통해 한번에 진행한다.
public void test2() {
Person[] persons= {
new Person("홍길동",34,true),
new Person("신사임당",48,true),
new Person("유관순",16,false),
};
//for each문
for(Person person : persons) {
System.out.println(person.getPersonInfo());
}
}
3. 사용자가 입력하는 값으로 Person 객체 만들기
3-1. 객체 내의 field 값을 먼저 받고, 객체에 값 집어넣기
public void test3() {
Scanner sc=new Scanner(System.in);
System.out.println("이름 : ");
String name=sc.next();
System.out.println("나이 : ");
int age=sc.nextInt();
System.out.println("결혼여부(t/f) : ");
boolean married = sc.next().charAt(0)=='t';
Person person = new Person(name,age,married);
System.out.println(person.getPersonInfo());
}
3-2. 객체를 new로 먼저 선언하고, field값을 받을 때마다 객체 내에 집어넣기
public void _test3() {
Scanner sc=new Scanner(System.in);
Person person=new Person();
System.out.println("이름 : ");
person.setName(sc.next());
System.out.println("나이 : ");
person.setAge(sc.nextInt());
System.out.println("결혼여부(t/f) : ");
person.setMarried(sc.next().charAt(0)=='t');
System.out.println(person.getPersonInfo());
}
4. 사용자 입력 값을 받아서 Person 객체 3개를 만들고, 출력하기
1) 먼저 Person 배열이 있어야 하고,
2) field 값을 각각 입력받아야한다. 3개이므로 반복문 필수.
3) 반복문으로 정해진 field값은 Person[n번째]배열안에 들어가도록 설정해야한다.
4) 잘 입력되었는지 출력이 필요하다.
public void test4() {
Scanner sc=new Scanner(System.in);
//입력부
final int PERSON_LEN=3;
Person[] personArr=new Person[PERSON_LEN]; // 1)
for(int i=0;i<3;i++) {
System.out.println("======="+(i+1)+"=========");
System.out.print("이름 : ");
String name=sc.next();
System.out.print("나이 : ");
int age=sc.nextInt();
System.out.print("결혼여부(t/f) : ");
boolean married=sc.next().charAt(0)=='t'; // 2)
Person person=new Person(name,age,married); // 3)
personArr[i]=person; // 3)
System.out.println();
}
//출력부 // 4)
for(int j=0;j<3;j++) {
System.out.println(personArr[j].getPersonInfo());
}
}
배열을 선언하고, 입력하는 것 까진 알겠는데, 반복문 내에서 새로 Person을 선언하여 Person[i]에 넣는 방법 (3번째) 가 전혀 생각나지 않았다.
이를 꼭 숙지해야 할 것 같다.
5. PersonManager 객체를 통해서 Person 관리하기
어쩌면 이게 더 번거로운 방법으로 보일 수 있으나, 데이터가 엄청나게 많다면 모든 실행 코드를 다 Main에 작성하는 것은 보기에도, 수정하기에도 좋지 않다. 나중에는 찾기 어려울 것이기 때문이다. 그러므로 기능적으로 PersonManager.java 클래스를 따로 만들어서 Person을 관리해보자.
방법은 4. 사용자 입력받기 와 똑같다.
대신 입력부를 모두 static / private로 지정해준다. 추가 기능으로 추가입력여부 확인도 해준다.
public class PersonManager {
//입력부
public static final int PERSON_LEN=10;
private Person[] persons=new Person[PERSON_LEN];
private int personIndex=0;
private Scanner sc=new Scanner (System.in);
/**
* 사용자입력으로 Person 객체 만들기
*/
public void inputData() {
for(int i=0;i<persons.length;i++) {
System.out.println("======="+(i+1)+"=========");
System.out.print("이름 : ");
String name=sc.next();
System.out.print("나이 : ");
int age=sc.nextInt();
System.out.print("결혼여부(t/f) : ");
boolean married=sc.next().charAt(0)=='t';
persons[personIndex++]=new Person(name,age,married);
//추가 입력 여부 확인
System.out.println("---------------------------");
System.out.print("> 더 입력 하시겠습니까?(y/n) : ");
char yn=sc.next().charAt(0);
if(yn=='n')
break;
System.out.println();
}
}
/**
* 출력
*/
public void printData() {
System.out.println(Arrays.toString(persons));
// for(Person p:persons) {
// if(p==null)
// break; //오류발생막음
// System.out.println(p.getPersonInfo());
// }
for(int i=0;i<personIndex;i++) {
System.out.println(persons[i].getPersonInfo());
}
}
}
personIndex를 지정하면서 PERSON_LEN이 10이고 사용자가 더 입력하지 않아 null 값이 발생해도 오류가 발생하지 않는다는 것을 알 수 있다. 왜냐면 출력하는 for문이 personIndex까지기 때문이다.
이제 이를 Main클래스에서 관리하기위해 Main에 설정 코드를 작성한다.
public void test5() {
PersonManager pm = new PersonManager();
pm.inputData();
pm.printData();
}
이제 간편하고 쉽게 데이터를 입력하고 프린트할 수 있게 되었다.
여기서 PersonManager - Person 의 관계를 알아보자.
PersonManager가 Person의 객체를 가지고 있다.
= PersonManager has a Person -> has - a 포함관계
UML 클래스다이어그램에서는 이른 연관관계 (Association) 이다.
블로그 참조하기