


public class Model {
Customer[] allcust; // 객체 생성 전까진 아무런 의미 없는 필드
static Customer[] allcust2; // 정적 필드로
// 1)
void a() {
allcust = new Customer[] { new Customer() };
allcust2 = new Customer[] { new Customer() };
}
// 2)
static void a2() {
allcust2 = new Customer[] { new Customer() };
allcust = new Customer[] { new Customer() }; //문제 발생
}
/** 3)
* static block으로 주로 static 변수를 초기화할 때 사용한다.
* */
static {
allcust = new Customer[] { new Customer() };
allcust2 = new Customer[] { new Customer() };
}
public static void main(String[] args) {
a2();
}
}
allcust가 문제가 되는 상황들이다. Customer[] allcust;: non static 변수로 클래스를 인스턴스화해서 인스턴스로 만들어 사용하기 전까진 아무런 의미 없는데이터이다. static Customer[] allcust2;: static 변수로 해당 클래스가 메모리에 올라가는 순간 객체 생성 없이도 해당 필드(속성)는 값이 생긴다.static 메서드로 해당 메서드의 경우엔 문제가 생기게 된다.static 속성(필드) 정적 필드가 static block 안에서 객체 생성도 없이 클래스가 메모리에 올라가 동작할 때 문제가 발생한다.
package main.java.model;
import main.java.fisa.model.domain.Customer;
public class Model {
static Customer[] allCust;
void a() {
allCust = new Customer[] { new Customer() };
}
static void a2() {
allCust = new Customer[] { new Customer() };
}
// 데이터베이스 구축으로 간주
static {
allCust = new Customer[] { new Customer("연아", 10), new Customer("영숙", 20), new Customer("엽전", 30) };
}
// 고객 정보 반환 요청
public static Customer[] read() {
return allCust;
}
public static boolean update(String name, int age) {
Customer[] customers = read();
for (Customer customer : customers) {
if (customer.getName().equals(name)) {
customer.setAge(age);
return true;
}
}
return false;
}
public static Customer[] delete(String findName) {
// TODO Auto-generated method stub
Customer[] customers = read();
int deleteCustomerCount = extractDeleteCount(findName, customers);
Customer[] newCustomer = new Customer[customers.length-deleteCustomerCount];
int i = 0;
for (Customer customer : customers) {
if (!customer.getName().equals(findName)) {
newCustomer[i] = customer;
i++;
}
}
return newCustomer;
}
private static int extractDeleteCount(String findName, Customer[] customers) {
int deleteCustomerCount =0;
for (Customer customer : customers) {
if (customer.getName().equals(findName)) {
deleteCustomerCount ++;
}
}
return deleteCustomerCount;
}
public static void main(String[] args) {
Model model = new Model();
model.a();
a2();
}
}
[사용자 입력을 받는 StartView - client 화면을 생각해주세요]
package main.java.view;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import main.java.fisa.controller.CustomerController;
/**
*
* web의 경우엔 html로 개발하는 것이 startView에 해당한다.
*
* client(사용자, end User, 고객)의 첫 실행 화면에 해당한다.
*/
public class StartView {
public static void main(String[] args) throws NumberFormatException, IOException {
System.out.println("1 - 정보 출력, 2 - 회원 수정, 3 - 회원 삭제 ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int no = Integer.parseInt(br.readLine());
CustomerController.reqProcess(no);
}
}
[사용자에게 응답을 출력할 EndView - 클라이언트 화면인데 이제 응답을 출력하는 상황을 생각해주세요]
package main.java.view;
import main.java.fisa.model.domain.Customer;
public class EndView {
public static void printAll(Customer[] read) {
// TODO Auto-generated method stub
System.out.println("모든 회원 정보를 출력합니다.");
for (Customer customer : read) {
System.out.println(customer.getName());
System.out.println(customer.getAge());
}
System.out.println();
}
public static void printSetAgeCustomer(String name, int age) {
// TODO Auto-generated method stub
System.out.println("사용자 " + name + "의 이름을 변경 했습니다.");
System.out.printf("사용자 %s의 나이는 %d로 변경됐습니다.", name, age);
}
}
package main.java.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import main.java.model.Model;
import main.java.model.domain.Customer;
import main.java.view.EndView;
/**
* startView로부터 요청 받고 Model의 Biz 메서드 호출 결과값들을 EndView에게 출력 위임
*
* startView : 1 - 모든 검색 / 2 - 수정 / 3 - 삭제
*/
public class CustomerController {
public static void reqProcess(int no) throws NumberFormatException, IOException {
if (no == 1) {
EndView.printAll(Model.read());
return;
} else if (no == 2) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String findName = br.readLine();
int newAge = Integer.parseInt(br.readLine());
if (Model.update(findName, newAge)) {
EndView.printSetAgeCustomer(findName, newAge);
return;
}
System.out.println("해당 이름을 가진 사용자 정보가 존재하지 않습니다.");
return;
} else if (no == 3) {
String findName = inputCustomerName();
Customer[] customers = Model.read();
Customer[] newCustomers = Model.delete(findName);
if (newCustomers.length != customers.length) {
System.out.printf("%s 이름을 가진 사용자를 성공적으로 삭제 했습니다.\n", findName);
return;
}
System.out.println("해당 이름을 가진 사용자 정보가 존재하지 않습니다.");
}
System.out.println("올바르지 않은 값을 입력하셨습니다. 다시 입력해주세요");
return;
}
private static String inputCustomerName() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String findName = br.readLine();
return findName;
}
}
javac Test.java //컴파일
ㅤㅤㅤTest.main([...]) // 메인 메서드 실행
static이어야 합니다.1. MVC 화면단 처리 로직 요청 구분 로직 서비스 - 트랜잭션 처리 로직으로 주로 권장 영역 데이터 활용 로직 - 계좌이체 로직 세분화하기 유효한 계좌번호, 잔액, 유효한 유저, 마이너스, 계좌번호... 전체 성공만 - 성공 특정 단계에서만 실패 하더라도 - 실패 단일 작업으로 간주 : 트랜잭션