무작위성은 인간사의 카드를 뒤섞어 버리고 거인을 무릎 꿇리는 이로운 역할을 한다. - p.362
Split보다 속도 측면에서 성능이 좋으나, 조금 더 복잡한 분리가 필요할때는 split이 유용하다.
StringTokenizer vs Split
serialVersionUID를 통해 직렬화된 파일의 자바와 역직렬화를 하려는 자바가 호환되는지를 검증한다.
객체를 직렬화할때 특정 멤버변수 값을 숨기고 싶다면,
private transient String pw;
위와 같이 transient를 추가하여 직렬화 과정에서 데이터를 제외시킬 수 있다.
//Output 당시 입력한 user값
User1 u = new User1("SUPER", "ADMIN", 'S');
//역직렬화 후 toString
//User1 [id=SUPER, pw=null, rank=S]
//회원정보 Value Object
package study0310.crudArray;
public class MemberVO {
private String id;
private String pw;
private String name;
private int age;
public MemberVO() {
}
public MemberVO(String id, String pw, String name, int age) {
super();
this.id = id;
this.pw = pw;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
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;
}
@Override
public String toString() {
return "[ID=" + id + ", PW=" + pw + ", Name=" + name + ", Age=" + age + "]";
}
}
//Action 인터페이스 생성
package study0310.crudArray;
import java.util.Scanner;
public interface Action {
void execute(Scanner s);
}
//메인에서 사용할 Service클래스
package study0310.crudArray;
import java.util.Scanner;
public class MemberService {
void process(Action a, Scanner s) {
a.execute(s);
}
}
package study0310.crudArray;
import java.util.Scanner;
public class ActionCreate implements Action{
@Override
public void execute(Scanner s) {
System.out.println("1. 아이디를 입력하세요");
String id = s.next();
System.out.println("2. 비밀번호를 입력하세요");
String pw = s.next();
System.out.println("3. 이름을 입력하세요");
String name = s.next();
System.out.println("4. 나이를 입력하세요");
int age = s.nextInt();
MemberVO m = new MemberVO(id, pw, name, age);
MemberVO[] temp = new MemberVO[MemberMain.members.length+1];
int i=0;
for(MemberVO mv : MemberMain.members) {
temp[i] = mv;
i++;
}
temp[temp.length-1] = m;
MemberMain.members = temp;
}
}
package study0310.crudArray;
import java.util.Scanner;
public class ActionRead implements Action{
@Override
public void execute(Scanner s) {
MemberVO[] m = MemberMain.members;
System.out.printf("총 회원 수 : %s명\n",m.length);
for(int i=0; i<m.length; i++) {
System.out.println(m[i].toString());
}
System.out.println("뒤로 가시려면 아무 키나 누르세요");
s.next();
}
}
package study0310.crudArray;
import java.util.Scanner;
public class ActionUpdate implements Action{
@Override
public void execute(Scanner s) {
while(true) {
System.out.println("업데이트할 계정의 ID를 입력하세요.");
String id = s.next();
System.out.println("업데이트할 계정의 PW를 입력하세요.");
String pw = s.next();
for(MemberVO m : MemberMain.members) {
if(m.getId().equals(id) && m.getPw().equals(pw)) {
while(true) {
System.out.println("1. ID변경");
System.out.println("2. PW변경");
System.out.println("3. 이름 변경");
System.out.println("4. 나이 변경");
System.out.println("5. 나가기");
String v = s.next();
switch(v) {
case "1" :
System.out.println("변경하실 ID를 입력하세요.");
String cid = s.next();
m.setId(cid);
break;
case "2" :
System.out.println("변경하실 PW를 입력하세요.");
String cpw = s.next();
m.setPw(cpw);
break;
case "3" :
System.out.println("변경하실 이름을 입력하세요.");
String cname = s.next();
m.setName(cname);
break;
case "4" :
System.out.println("변경하실 나이를 입력하세요.");
int cage = s.nextInt();
m.setAge(cage);
break;
default :
System.out.println("계정 수정 종료");
return;
}
}
} else {
System.out.println("존재하지 않는 계정입니다. 메인으로 가려면 아무 키나 누르세요.");
s.next();
return;
}
}
}
}
}
package study0310.crudArray;
import java.util.Scanner;
public class ActionDelete implements Action{
@Override
public void execute(Scanner s) {
while(true) {
System.out.println("삭제하려는 계정의 ID를 입력하세요.");
String id = s.next();
System.out.println("삭제하려는 계정의 PW를 입력하세요.");
String pw = s.next();
MemberVO[] m = MemberMain.members;
for(int i=0; i<m.length; i++) {
if(m[i].getId().equals(id) && m[i].getPw().equals(pw)) {
m[i] = m[m.length-1];
MemberVO[] temp = new MemberVO[m.length-1];
for(int j=0; j<temp.length; j++) {
temp[j] = m[j];
}
MemberMain.members = temp;
System.out.printf("%s가 삭제되었습니다. 추가로 삭제하시려면 1번, 나가시려면 아무 키나 누르세요.",id);
String pick = s.next();
switch(pick) {
case "1" :
break;
default :
return;
}
} else {
System.out.println("존재하지 않는 계정입니다. 메인으로 돌아가려면 아무 키나 누르세요.");
s.next();
return;
}
}
}
}
}
package study0310.crudArray;
import java.util.Scanner;
public class MemberMain {
static MemberVO[] members = new MemberVO[0];
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
MemberService ms = new MemberService();
while(true) {
System.out.println("CRUD Project(Array)");
System.out.println("");
System.out.println("1. Create");
System.out.println("2. Read users");
System.out.println("3. Update user");
System.out.println("4. Delete user");
System.out.println("5. Quit");
String command = s.next();
switch(command) {
case "1" :
System.out.println("1. Create");
ms.process(new ActionCreate(), s);
break;
case "2" :
System.out.println("2. Read users");
ms.process(new ActionRead(), s);
break;
case "3" :
System.out.println("3. Update user");
ms.process(new ActionUpdate(), s);
break;
case "4" :
System.out.println("4. Delete user");
ms.process(new ActionDelete(), s);
break;
case "5" :
System.out.println("프로그램을 종료합니다");
s.close();
return;
default :
System.out.println("Error : 존재하지 않는 선택지입니다.");
break;
}
}
}
}