웹개발 수업/JAVA
웹개발_JAVA 17
gugigugi92
2023. 2. 14. 15:25
[ArrayList 실습1]
과일 정보를 담을 클래스 선언(Fruit)
- 과일 이름(중복 없음)
- 과일 가격
CRUD관련 기능을 담아놓을 클래스 선언(Market)
- 과일 추가
- 과일 삭제
- 과일 가격이 평균 가격보다 낮은 지 검사
- 과일 전체 조회
- 과일 이름으로 가격 조회
package arrayListTask;
// 실습 전체 DB 연결 코드
import java.util.ArrayList;
import arrayListTask.Food.Food;
import arrayListTask.Fruit.Fruit;
import arrayListTask.love.Love;
import arrayListTask.user.User;
public class DBConnecter {
public static ArrayList<User> users = new ArrayList<User>();//1
public static ArrayList<Food> foods = new ArrayList<Food>();
public static ArrayList<Fruit> furits = new ArrayList<Fruit>();
public static ArrayList<Love> loves = new ArrayList<Love>();
//전체 실습 Db를 연결하는 코드
//Db에서 사용하는 순간 가져옴
}
package arrayListTask.Fruit;
//Fruit DB
public class Fruit {
private String name;
private int price;
public Fruit() {;}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Fruit [name=" + name + ", price=" + price + "]";
}
}
package arrayListTask.Fruit;
import java.util.ArrayList;
import arrayListTask.DBConnecter;
public class Market {
ArrayList<Fruit> fruits = DBConnecter.furits;
// - 과일 검사
public Fruit checkFruit(String name) {
for (Fruit fruit : fruits) { // fruits에 있는 getname이
if(fruit.getName().equals(name)) { //받은 name과 같으면
return fruit; // 중복되는 fruit를 리턴
}
}
return null; //없으면 null 출력
}
// - 과일 추가
public void add(Fruit fruit) {
fruits.add(fruit);
}
// - 과일 삭제
public void remove(String name) {
Fruit fruit = checkFruit(name); //과일 객체 가져옴
fruits.remove(fruit); // furit 삭제
}
// - 과일 가격이 평균 가격보다 낮은 지 검사
// 1. 화면에서 가격 입력
public boolean checkPrice(int price) {
return getAverage() > price; //평균 가격 메서드와 입력받은 price 비교
}
// 2. DB에서 전체 조회
public ArrayList<Fruit> findByPriceLessThanAverage() { //몇개인지 모르기때문에 ArrayList<Fruit>
ArrayList<Fruit> arFruit = new ArrayList<Fruit>();
for (Fruit fruit : fruits) { // fruits 에 있는
if(fruit.getPrice() < getAverage()) { //가격들을 fruit에 담고 평균가격이 더 높으면
arFruit.add(fruit); //TODO 이 코드의 이유?
//get set 이해 부족
}
}
return arFruit;
}
//평균 가격 메서드
public double getAverage() {
int total = 0; // 총합 선언
for (Fruit fruit : fruits) { // fruits에 getprice들을 total에 저장
total += fruit.getPrice();
}
return (double)total / fruits.size(); //total을 fruits 갯수만큼 나눠서 평균 구하기
}
// - 과일 전체 조회
public ArrayList<Fruit> findAll() {
ArrayList<Fruit> arFruit = new ArrayList<Fruit>();
for (Fruit fruit : fruits) {
arFruit.add(fruit);
}
return arFruit;
}
// - 과일 이름으로 가격 조회
public int findByName(String name) { // 가격이라서 int
return checkFruit(name).getPrice();
}
}
[ArrayList 실습2]
음식 정보를 담을 클래스 선언(Food)
- 음식 이름
- 음식 가격
- 음식 종류(한식, 중식, 일식, 양식)
CRUD관련 기능을 담아놓을 클래스 선언(Restaurant)
- 음식 추가
- 음식 이름으로 음식 종류 조회
- 사용자가 원하는 종류의 음식 전체 조회
- 음식 종류 수정 후 가격 10% 상승
- 사용자가 원하는 종류의 음식 개수 조회
package arrayListTask.Food;
//FOOD DB
public class Food {
private String name;
private int price;
private String kind;
public Food() {;}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
@Override
public String toString() {
return "Food [name=" + name + ", price=" + price + ", kind=" + kind + "]";
}
}
package arrayListTask.Food;
import java.util.ArrayList;
import arrayListTask.DBConnecter;
public class Restaurant {
ArrayList<Food> foods = DBConnecter.foods;
// - 음식 추가
public void insert(Food food) {
foods.add(food);
}
// - 음식 이름으로 음식 종류 조회
public String findKindByName(String name) {
for (Food food : foods) { //foods에 있는 것들을
if(food.getName().equals(name)) {//food로 받아서 이름이 food 에있으면
return food.getKind();// 음식종류 리턴
}
}
return null; // 한번도 안들어 왔으면 null
}
// - 사용자가 원하는 종류의 음식 전체 조회
public ArrayList<Food> findByKind(String kind) { //"전체"이기때문에 arraylist
ArrayList<Food> arFood = new ArrayList<Food>();
//food 배열 선언
for (Food food : foods) { //food에 foods 내용을 넣고
if(food.getKind().equals(kind)) { //food에 종류중에 조회할 종류와 같으면
arFood.add(food);//food 배열에 값을 넣고
}
}
return arFood; // 리턴
}
// - 음식 종류 수정 후 가격 10% 상승
// 매개변수로 받는 건 이미 수정이 다 끝난 정보다.
public void update(Food food) { // 음식 이름
for (Food foodInDB : foods) { //데이터베이스의 foods 데이터를
if(foodInDB.getName().equals(food.getName())) { //가격 수정할 food와 같은 이름으로 있다면
foodInDB.setKind(food.getKind()); // 원래 있던 setkind를 수정할 getkind로 바꿔준다
foodInDB.setPrice(food.getPrice()); // 화면에서 애초에 10% 가격 상승 했다고 본다
//price도 마찬가지
// foodInDB.setPrice((int)(food.getPrice() * 1.1));//test 에서 구현함
}
}
}
public Food select(String name) {
for (Food food : foods) { //foods DB를 food로 바꿔쓰고
if(food.getName().equals(name)) { // 기존 food의 getname에 있는 값과 새로 받은 name의 값이 같으면
return food; //리턴
}
}
return null;
}
// - 사용자가 원하는 종류의 음식 개수 조회
public int getCountByKind(String kind) {
int count = 0; // 개수
for (Food food : foods) { //foods DB를 food로 사용
if(food.getKind().equals(kind)) {//food의 getkind와 새로받음 kind와 같은게 있으면
count++; // count 증가
}
}
return count; // count 리턴
}
}
package arrayListTask.Food;
// Food 동작 테스트
import arrayListTask.DBConnecter;
public class Test {
public static void main(String[] args) {
Food[] foods = {new Food(), new Food(), new Food()}; // Food클래스에 세가지 변수
Restaurant restaurant = new Restaurant();
//// foods 배열에 값 입력
// foods[0].setName("자장면");
// foods[0].setKind("중식");
// foods[0].setPrice(8000);
//
// foods[1].setName("청담한국냉면");
// foods[1].setKind("한식");
// foods[1].setPrice(7000);
//
// foods[2].setName("제육볶음");
// foods[2].setKind("한식");
// foods[2].setPrice(9000);
//
// for (Food food : foods) { //foods 값을 food로 사용
// restaurant.insert(food); // restarant.insert 메서드에 food 채워주기
// }
//
// System.out.println(restaurant.findByKind("한식")); // 종류가 한식인 객체 출력
//
System.out.println("=======================");
Food food = new Food();
Restaurant restaurant1 = new Restaurant();
food.setName("돈까스");
food.setPrice(5000);
food.setKind("양식");
restaurant1.insert(food);
food = restaurant1.select("돈까스"); // db 가져오기
food.setKind("일식"); // 돈까스의 종류를 일식으로 바꿈
food.setPrice((int)(food.getPrice() * 1.1));//setprice에서 가격을 수정
restaurant1.update(food); //TODO 해당 코드 의미는?
System.out.println("============");
System.out.println(DBConnecter.foods); // db에 저장된 foods
}
}
↑
"========="기준
위에 실행결과: kind가 "한식"인 객체 출력
"========="기준
아래 실행 결과: 돈까스 DB 양식 -> 일식 변경, 가격 10%인상 반영
DB에 저장된 전체 객체 출력
[ArrayList 실습3]
이상형 정보를 담을 클래스 선언(Love)
- 번호
- 이름
- 나이
CRUD관련 기능을 담아놓을 클래스 선언(DateApp)
- 사용자가 원하는 나이의 이상형 목록 조회
- 이상형의 나이 수정
- 이상형 나이 순 정렬
package arrayListTask.love;
//Love DB
public class Love {
private int number;
private String name;
private int age;
public Love() {;}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
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;
}
//toString art+shif+s->s
@Override
public String toString() {
return "Love [number=" + number + ", name=" + name + ", age=" + age + "]";
}
}
package arrayListTask.love;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import arrayListTask.DBConnecter;
public class DateApp {
ArrayList<Love> loves = DBConnecter.loves;
// - 이상형 추가
public void insert(Love love) {
loves.add(love); //db loves에 추가
}
// - 사용자가 원하는 나이의 이상형 목록 조회
public ArrayList<Love> findByAge(int age){
ArrayList<Love> loves = new ArrayList<Love> ();
for (Love love : loves) { // loves에 있는 getAge에
if(love.getAge()==age) { //조회할 나이의 age가 일치하면
loves.add(love); // loves에 이름을 넣고
}
}
return loves; // 출력
}
// - 이상형의 나이 수정
public void updata(Love love) {
for (Love loveInDB: loves) {
if(loveInDB.getNumber()==love.getNumber()) {
//loveInDB love의 전달받은 데이터와 같으면
loveInDB.setAge(love.getAge());//loveInDB 에있는 age를 전달받은 age로 바꿈
break;
}
}
}
// - 이상형 나이 순 정렬
public ArrayList<Love> sortByAge(){
ArrayList<Love> copyLoves = (ArrayList<Love>)loves.clone(); //얕은복사
ArrayList<Integer> ages = new ArrayList<Integer>();//나이를 가져옴
ArrayList<Love> result = new ArrayList<Love>();
for (Love love : loves ) { //loves 내용을 love로 사용
ages.add(love.getAge()); //ages에 전체 회원의 나이만 담는다
}
Collections.sort(ages); // 오름차순 정렬
Collections.reverse(ages); // 내림차순 정렬
for(Integer age : ages) { // 오름차순 정렬 후 재 조회
for(Love love : copyLoves ) {
if(love.getAge()==age){ //getAge와 age에 있는 나이가 나이가 일치하면
result.add(love); //result에 저장
copyLoves.remove(love); //검사가 끝났으면 중복이 안되게 지워줘야함
break;
}
}
}
return result;
}
}
// 얕은 복사:
// 주소값 복사(주소 값 공유), 때문에 원본 수정시 복사한 객체가 주소값이 바뀜 : Object.clone();
// 지폐번호가 같은 위조 지폐
// 깊은 복사:
// 주소 안에 있는 값을 새로운 객체에 삽입(주소값이 서로 다름)
// 지폐 번호가 다른 위조 지폐
//
//
// mutable = 변할수 있는
// 대입 연산자로 직접 주소를 받으면 mutable이기 때문에,
// 다른 곳에서 원본을 모두 수정할 수 있다.
// 하지만 이런 방식으로 설계를 하면, 어디에서 원본을 수정했는 지 알 수 없다.
// 깊은 복사를 사용하면 직접 값을 하나씩 복사해서 오기 때문에,
// 다른 곳에서 필드를 수정해도 원본이 바뀌지 않는다.
// 하지만, 만약 원본 필드에 객체가 선언되어 있다면 얕은 복사를 통해 해당 객체의 주소값은 그대로 대입이 된다.
// 따라서, 원본 필드에 선언된 객체가 변경된다면, 얕은 복사된 객체들도 해당 정보는 변경된다.
// 필드 안에 또 다른 객체가 선언되어 있으면(이하 "객체 그래프") 깊은 복사가 필요하다.
// 실제 주소를 그대로 받는 것이 아니라 객체 그래프 만큼 new를 사용하여 얕은 복사를 진행해야 한다.
// 이렇게 객체 그래프일 경우에는 얕은 복사를 사용하지 않고 깊은 복사를 통해 immutable의 목적을 달성해야 한다.
package arrayListTask.love;
import arrayListTask.DBConnecter;
public class Test {
public static void main(String[] args) {
DateApp dateApp = new DateApp();
//DB 데이터 입력
Love love1 = new Love();
love1.setAge(22);
love1.setName("영희");
love1.setNumber(1);
Love love2 = new Love();
love2.setAge(20);
love2.setName("순자");
love2.setNumber(2);
Love love3 = new Love();
love3.setAge(20);
love3.setName("미자");
love3.setNumber(3);
dateApp.insert(love1); //insert에 love1,2,3 담고 insert에서 디비로 옮김
dateApp.insert(love2);
dateApp.insert(love3);
System.out.println(DBConnecter.loves);// DB 내용확인
System.out.println(dateApp.sortByAge()); //오름차순 정렬
System.out.println(DBConnecter.loves);//오름차순된 DB 내용 확인
}
}