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 화면단 처리 로직 요청 구분 로직 서비스 - 트랜잭션 처리 로직으로 주로 권장 영역 데이터 활용 로직 - 계좌이체 로직 세분화하기 유효한 계좌번호, 잔액, 유효한 유저, 마이너스, 계좌번호... 전체 성공만 - 성공 특정 단계에서만 실패 하더라도 - 실패 단일 작업으로 간주 : 트랜잭션