v1 = 1명의 데이터 처리
1) FitnessVO 설계 ==> 값
2) 서비스 분리 ==> 비즈니스 로직(기능적/ 비기능적 요구사항)을 처리
CRUD(Create, Retrieve, Update, Delete)
데이터 추상화
회원아이디 : 임의의 숫자 ==> Primary Key (고유키 = 중복 불가, 빈 값 안됨)
회원이름: 문자열 (Not Null)
키 : double
몸무게 : double
BMI : 계산 가능 데이터
결과 : 계산 가능 데이터
>> 생성자 2종류, 세터 게터, 계산 메소드
1) FitnessVO 설계 ==> 값
package vo;
public class Fitness {
private String id;
private String name;
private double height;
private double weight;
private double bmi;
private String result;
public Fitness() {
super();
}
public Fitness(String id, String name, double height, double weight, double bmi, String result) {
super();
this.id = id;
this.name = name;
this.height = height;
this.weight = weight;
this.bmi = bmi;
this.result = result;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public double getHeight() {
return height;
}
public double getWeight() {
return weight;
}
public double getBmi() {
return bmi;
}
public String getResult() {
return result;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setHeight(double height) {
this.height = height;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void setBmi(double bmi) {
this.bmi = bmi;
}
public void setResult(String result) {
this.result = result;
}
public void output() {
System.out.printf("ID: %s(%s), %.2fcm, %.2fkg, bmi: %.2f, 결과: %s\n",
id, name, height, weight, bmi, result);
}
}
package main;
import vo.Fitness; // 패키지가 다르면 못 불러오기 때문에 import 해와야함
public class FitnessMain {
public static void main(String[] args) {
Fitness member1 = new Fitness();
member1.output();
Fitness member2 = new Fitness("1","홍길동", 180, 88, 23.5, "보통");
member2.output();
}
}
오버로딩 된 생성자가 잘못 되었다. ==> 계산 값을 넣어야하는것이 잘 못 됨.
ID: null(null), 0.00cm, 0.00kg, bmi: 0.00, 결과: null
ID: 1(홍길동), 180.00cm, 88.00kg, bmi: 23.50, 결과: 보통
package vo;
public class Fitness {
private String id;
private String name;
private double height;
private double weight;
private double bmi;
private String result;
public Fitness() {
super();
}
public Fitness(String id, String name, double height, double weight) {
super();
this.id = id;
this.name = name;
this.height = height;
this.weight = weight;
calcBMI();
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public double getHeight() {
return height;
}
public double getWeight() {
return weight;
}
// 조회는 필요
public double getBmi() {
return bmi;
}
public String getResult() {
return result;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setHeight(double height) {
this.height = height;
calcBMI();
}
public void setWeight(double weight) {
this.weight = weight;
calcBMI();
}
private void calcBMI() {
this.bmi = weight / (height * height * 0.0001);
calcResult();
}
private void calcResult() {
if (bmi >= 35) result = "고도비만";
else if(bmi >= 30) result = "중도비만";
else if(bmi >= 25) result = "경도비만";
else if(bmi >= 23) result = "과체중";
else if(bmi >= 18.5) result = "정상";
else result = "저체중";
}
public void output() {
System.out.printf("ID: %s(%s), %.2fcm, %.2fkg, bmi: %.2f, 결과: %s\n",
id, name, height, weight, bmi, result);
}
}
package main;
public class FitnessMain {
Fitness member2 = new Fitness("1","홍길동", 180, 88);
member2.output();
member2.setWeight(70);
member2.output();
member2.setHeight(175);
member2.output();
}
}
ID: 1(홍길동), 180.00cm, 88.00kg, bmi: 27.16, 결과: 경도비만
ID: 1(홍길동), 180.00cm, 70.00kg, bmi: 21.60, 결과: 정상
ID: 1(홍길동), 175.00cm, 70.00kg, bmi: 22.86, 결과: 정상
코드 | 의미 |
public Fitness(String id, String name, double height, double weight) { this.id = id; this.name = name; this.height = height; this.weight = weight; calcBMI(); } |
기본 생성자 오버로딩을 통해 값을 메모리에 올린다. 계산해서 생성되는 데이터는 외부에서 데이터가 입력 가능하도록 만들지 않는다. public Fitness(String id, String name, double height, double weight, double bmi, String result) public Fitness(String id, String name, double height, double weight) |
public void setHeight(double height) { this.height = height; calcBMI(); } public void setWeight(double weight) { this.weight = weight; calcBMI(); } |
calcBMI(); 를 메서드 안에 집어 넣어 값이 변경되어도 그에 맞게 다시 BMI를 계산하도록 설정해 놓는다. |
private void calcBMI() { this.bmi = weight / (height * height * 0.0001); calcResult(); } |
BMI 계산 메서드 생성자 오버로딩한 메서드에 넣음으로서 바로 계산되도록 |
private void calcResult() { if (bmi >= 35) result = "고도비만"; else if(bmi >= 30) result = "중도비만"; else if(bmi >= 25) result = "경도비만"; else if(bmi >= 23) result = "과체중"; else if(bmi >= 18.5) result = "정상"; else result = "저체중"; } |
BMI 값에 맞춰 결과 값을 대입한다. 범위로 나누게 되므로 switch 가 아닌 if-else문 사용한다. |
2) CRUD(Create, Retrieve, Update, Delete)
다른 곳에서도 사용할 수 있게 'public static void main(String[] args) ' 이 아닌 'public class FitnessMain' 에 올린다.
package main;
import java.util.Scanner;
public class FitnessMain {
// Scanner scanner = new Scanner(System.in); // 여기 있으면서 우리 멤버가 됨
static Scanner scanner = new Scanner(System.in); // 여기 있으면서 우리 멤버가 됨
// 다른 곳에서도 사용할 수 있게
Fitness member; // 기본값(null) 로 초기화되어 있다.
public static void main(String[] args) {
FitnessMain service = new FitnessMain(); // 기본 생성자
String choice;
// 실행할때 마다 보여야 함
while(true) {
service.menu(); // main 은 우리 멤버가 아니다.
// choice = service.scanner.next();
choice = scanner.next();
} // main
// static이 없기때문에 호출이 안됨 --> 속해있는 클래스 객체를 생성
public void menu() {
System.out.println("---[ 디마 피트니스 회원관리 ] ---");
System.out.println(" 1. 회원 등록");
System.out.println(" 2. 정보 조회");
System.out.println(" 3. 정보 수정");
System.out.println(" 4. 탈 퇴");
System.out.println(" 0. 종 료");
System.out.println("==================================");
System.out.print(" 선택: ");
}
}
코드 | 사용 방식 |
Scanner scanner = new Scanner(System.in); | choice = service.scanner.next(); |
static Scanner scanner = new Scanner(System.in); | choice = scanner.next(); |
public void menu(){ .... } |
FitnessMain service = new FitnessMain(); // 기본 생성자 service.menu(); |
- Create
import vo.Fitness;
public class FitnessMain {
// Scanner scanner = new Scanner(System.in); // 여기 있으면서 우리 멤버가 됨
static Scanner scanner = new Scanner(System.in);
// 다른 곳에서도 사용할 수 있게
Fitness member; // 기본값(null) 로 초기화되어 있다.
..
private void create() {
System.out.println(" [ 회원 등록 ] ");
String id, name; // 지역 변수
double weight, height;
System.out.print("> 아이디: "); id = scanner.next();
System.out.print("> 이 름: "); name = scanner.next();
System.out.print("> 키(cm): "); height = scanner.nextDouble();
System.out.print("> 몸무게(kg): "); weight = scanner.nextDouble();
member = new Fitness(id, name, height, weight); // 패키지 import
// 지역변수
System.out.println("## 회원 등록 완료\n");
}
Fitness member; member = new Fitness(id, name, height, weight); |
선언 () 초기화 ( Create() 안에서 ) |
- Read
private void read() {
System.out.println(" [ 정보 조회 ] ");
if( member == null) {
System.out.println("등록된 회원이 존재하지 않습니다.\n");
return ;
}
member.output();
}
- Update
변하는 값인 height 와 weight 를 입력받아 setter로 변경하여 다시 계산
private void update() {
System.out.println(" [ 회원 정보 수정 ] ");
if( member == null) {
System.out.println("등록된 회원이 존재하지 않습니다.\n");
return ;
}
double weight, height;
System.out.print("> 키(cm): "); height = scanner.nextDouble();
System.out.print("> 몸무게(kg): "); weight = scanner.nextDouble();
member.setHeight(height);
member.setWeight(weight);
// 지역변수
System.out.println("## 정보 수정 완료.\n");
}
- Delete
private void delete() {
System.out.println(" [ 회원 탈퇴 ] ");
String confirm;
if( member == null) {
System.out.println("등록된 회원이 존재하지 않습니다.\n");
return ;
}
System.out.print(">> 정말로 탈퇴하실 건가요...? (y / n) : ");
confirm = scanner.next();
if(!(confirm.equals("Y") | confirm.equals("y")))
System.out.println("## 탈퇴 취소!\n");
member = null; // null로 참조를 막는다.
System.out.println("## 탈퇴 완료..\n");
return;
}
전체 코드
package main;
import java.util.Scanner;
import vo.Fitness;
public class FitnessMain {
// Scanner scanner = new Scanner(System.in); // 여기 있으면서 우리 멤버가 됨
static Scanner scanner = new Scanner(System.in); // 여기 있으면서 우리 멤버가 됨
// 다른 곳에서도 사용할 수 있게
Fitness member; // 기본값(null) 로 초기화되어 있다.
public static void main(String[] args) {
FitnessMain service = new FitnessMain(); // 기본 생성자
String choice;
// 실행할때 마다 보여야 함
while(true) {
service.menu(); // main 은 우리 멤버가 아니다.
// choice = service.scanner.next();
choice = scanner.next();
switch(choice) {
case "1" : service.create(); break;
case "2" : service.read(); break;
case "3" : service.update(); break;
case "4" : service.delete(); break;
case "0" : System.out.println("## 프로그램을 종료하겠습니다. ");return;
default : System.out.println("메뉴에 적힌 번호를 입력해주세요."); scanner.nextLine();
}
}
} // main
private void delete() {
System.out.println(" [ 회원 탈퇴 ] ");
String confirm;
if( member == null) {
System.out.println("등록된 회원이 존재하지 않습니다.\n");
return ;
}
System.out.print(">> 정말로 탈퇴하실 건가요...? (y / n) : ");
confirm = scanner.next();
if(!(confirm.equals("Y") | confirm.equals("y")))
System.out.println("## 탈퇴 취소!\n");
member = null; // null로 참조를 막는다.
System.out.println("## 탈퇴 완료..\n");
return;
}
private void update() {
System.out.println(" [ 회원 정보 수정 ] ");
if( member == null) {
System.out.println("등록된 회원이 존재하지 않습니다.\n");
return ;
}
double weight, height;
System.out.print("> 키(cm): "); height = scanner.nextDouble();
System.out.print("> 몸무게(kg): "); weight = scanner.nextDouble();
member.setHeight(height);
member.setWeight(weight);
// 지역변수
System.out.println("## 정보 수정 완료.\n");
}
private void read() {
System.out.println(" [ 정보 조회 ] ");
if( member == null) {
System.out.println("등록된 회원이 존재하지 않습니다.\n");
return ;
}
member.output();
}
private void create() {
System.out.println(" [ 회원 등록 ] ");
String id, name; // 지역 변수
double weight, height;
System.out.print("> 아이디: "); id = scanner.next();
System.out.print("> 이 름: "); name = scanner.next();
System.out.print("> 키(cm): "); height = scanner.nextDouble();
System.out.print("> 몸무게(kg): "); weight = scanner.nextDouble();
member = new Fitness(id, name, height, weight); // 패키지 import
// 지역변수
System.out.println("## 회원 등록 완료\n");
}
// static이 없기때문에 호출이 안됨 --> 속해있는 클래스 객체를 생성
public void menu() {
System.out.println("---[ 디마 피트니스 회원관리 ] ---");
System.out.println(" 1. 회원 등록");
System.out.println(" 2. 정보 조회");
System.out.println(" 3. 정보 수정");
System.out.println(" 4. 탈 퇴");
System.out.println(" 0. 종 료");
System.out.println("==================================");
System.out.print(" 선택: ");
}
}
이 전에 만들어둔 FitnessMain -> FitnessService 로 변경하게 되면 Main 은 사라지게 된다.
package service;
// main 이 서비스를 생성하고 vo를 사용하는 것이다.
import java.util.Scanner;
import vo.Fitness;
public class FitnessService {
Scanner scanner = new Scanner(System.in); // 여기 있으면서 우리 멤버가 됨
// static Scanner scanner = new Scanner(System.in); // main 이 static 이기 때문에
// 다른 곳에서도 사용할 수 있게
Fitness member; // 기본값(null) 로 초기화되어 있다.
public FitnessService(){
// FitnessService service = new FitnessService(); // 기본 생성자 // main 에서 생성함.
String choice;
// 실행할때 마다 보여야 함
while(true) {
//service.menu(); // main 은 우리 멤버가 아니다.
menu(); // 우리 멤버가 되기 때문에 service. 이 필요 없다.
// choice = service.scanner.next();
choice = scanner.next();
switch(choice) {
case "1" : create(); break;
case "2" : read(); break;
case "3" : update(); break;
case "4" : delete(); break;
case "0" : System.out.println("## 프로그램을 종료하겠습니다. ");return;
default : System.out.println("메뉴에 적힌 번호를 입력해주세요."); scanner.nextLine();
}
}
}
....
코드 | 의미 |
Scanner scanner = new Scanner(System.in); / | main 이 static 이기 때문에 두 가지 상황이 나온 거지만, 현재는 main이 존재하지 않기때문에 한 가지 방법만 존재. |
public FitnessService(){ | FitnessMain service = new FitnessMain(); 스스로를 호출할 필요가 없어지게 된다. main () 에서 호출하기 때문에 ==> service. __ 이 붙은 것들에서 ' service. ' 을 지워야 한다. |
그렇다면 main 에서는?
FitnessService() ( : 기능적 구동) 를 호출하는 것만 사용한다.
package main;
import service.FitnessService;
public class FitnessMain {
public static void main(String[] args) {
new FitnessService(); // 생성자 (while = 무한루프) 호출 => 종료가 되지 않는다. => 0번을 눌러야 종료됨.
}
}
'국비 교육 > 백엔드(Java, Spring)' 카테고리의 다른 글
[자바] 피트니스 관리 프로젝트 - v2 (0) | 2024.01.24 |
---|---|
[자바] this, Static 지정자, 객체 배열 (0) | 2024.01.24 |
[자바] 오버로딩(Overloading), 생성자(Constuctor) (0) | 2024.01.23 |
[자바] 클래스 Class (0) | 2024.01.22 |