웹개발 수업/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 내용 확인
}
}

출력결과