관리 메뉴

거니의 velog

230802 자바 강의 본문

대덕인재개발원/대덕인재개발원_Java

230802 자바 강의

Unlimited00 2023. 8. 2. 11:02

List, SetCollection 인터페이스를 상속받아서 구현.

Map은 따로 함.

HashMap, TreeMap, Properties...

여러 객체들이 Map을 상속받아 객체가 될 수 있는 클래스 중에 가장 많이 활용되는 것이 HashMap.

<K, V> 쌍으로 저장됨.

HashMap map = new HashMap(); 이렇게 생성하면 메모리 저장?
메모리 구조 상 호출 스택에서는 map이라는 공간이 하나 만들어지고, HashMap(); 객체가 힙에 만들어지는데, 이를 도해하면 key 영역이 있고 이에 대응하는 value 영역이 있다.

마치 2차원 배열처럼 구성됨. 오라클에 ERD를 보면 데이터를 저장하는 기본 구조가 이러한 테이블 구조이다. PKKey 영역, 나머지를 Value 영역으로 취급할 수 있다.

이 안에 데이터를 꺼내는 것이 문제. 맵에 데이터를 저장할 때에는 put() 메서드를 이용해 쌍으로 저장하고, 꺼낼 때는 여러 방법 사용. 그 중에 get() 메서드를 사용하여 키 값을 지정하면 그에 대응하는 밸류 값을 하나씩 꺼낼 수 있다.


[HashMapExample.java]

package ddit.chap13.map;

import java.util.HashMap;
import java.util.Map.Entry;

// 학번(정수), 이름(문자열) 자료를 저장하는 map
public class HashMapExample {

	public static void main(String[] args) {
		
		mapMethod01();
		
	}
	
	public static void mapMethod01() {
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		
		// put(K,V); 자료 저장 메서드
		map.put(1001, "홍길동");
		map.put(1101, "정몽주");
		map.put(2011, "이성계");
		map.put(1903, "임현우");
		
		// map 전체 자료 출력
		System.out.println(map); // {1001=홍길동, 2011=이성계, 1101=정몽주, 1903=임현우}
		// 저장 순서가 다른 이유? Hash. 자료구조에서 데이터를 비교하지 않고 저장할 수 있는 방법
		// Hashing 시 사용되는 주소를 계산하기 위해 사용하는 함수를 Hashing Function.
		// 다양한 방법이 존재. 이러한 이유는 같은 데이터가 다른 주소를 산출하지 않게 하기 위함. 
		// 홍길동이라면 늘 같은 주소를 만들고, 다른 데이터가 같은 주소를 만들면 안됨.
		// 이 충돌들을 통해 데이터를 잃어버리게 됨. 이를 방지하기 위해 복잡한 알고리즘 소요.
		// 해당 자료가 가진 개수적인 성질, 숫자로 변형하는 성질을 가지고 주소를 생성한다.
		// 내가 입력한 순서와 실제 저장되는 순서는 전혀 관련성이 없다.
		// kim을 저장하려면? k-11번째. 제곱 취하면 121. i-81, m-169 12181169. 12|1811|69 => | 를 기준으로 끝을 접는다(폴딩) => 1811 + 2196 = 4007이 주소.
		// 계산되어진 주소에 의해 저장됨. 그 역할을 해주는 자바 메서드? Object 클래스의 hashcode();
		
		System.out.println("==================================");
		
		// get(key) : key값으로 value 추출.
		System.out.println(map.get(2011)); // 이성계
		
		System.out.println("==================================");
		
		// Entry 객체를 이용하여 순차검색
		System.out.println("학번       이름");
		System.out.println("-----------");
		for(Entry<Integer, String> entrySet : map.entrySet()) {
//			System.out.println("key : " + entrySet.getKey() + ", value : " + entrySet.getValue());
			System.out.println(entrySet.getKey() + "  " + entrySet.getValue());
//			if(entrySet.getKey() == 1101) { // 학번 비교하여 원하는 이름만 검색 가능.
//				System.out.println("이름 : " + entrySet.getValue()); // 이름 : 정몽주
//			}
		}
		
		System.out.println("==================================");
		
		// map의 keySet()을 이용한 검색
//		map.keySet(); // 반환 타입은 Set<Integer>. 모든 오브젝트 클래스를 반환하지 않고 Integer 클래스만 반환.
		System.out.println("학번    ->  이름");
		System.out.println("-------------");
		for(Integer i : map.keySet()) {
			System.out.println(i + " -> " + map.get(i));
		}
		
	}

}


-- 2020년 6월 제품별 판매집계(판매수량합계, 판매금액합계)
SELECT * FROM CART;
SELECT * FROM PROD;

SELECT * FROM CART WHERE CART_NO LIKE '202006%';

SELECT A.PROD_NAME 제품명
     , SUM(B.CART_QTY) 판매수량
     , SUM(A.PROD_PRICE * B.CART_QTY)판매금액
  FROM PROD A, CART B
 WHERE A.PROD_ID = B.CART_PROD
   AND SUBSTR(B.CART_NO, 1, 6) = '202006'
 GROUP BY A.PROD_NAME
 ORDER BY A.PROD_NAME;

-- 판매가가 100만원 이상인 상품의 상품코드, 상품명, 판매가, 적정재고를 조회
SELECT * FROM PROD;

SELECT *
  FROM (SELECT PROD_ID AS 상품코드
             , PROD_NAME AS 상품명
             , PROD_PRICE AS 판매가
             , PROD_PROPERSTOCK AS 적정재고
          FROM PROD
         WHERE PROD_PRICE >= 1000000
         ORDER BY PROD_PRICE DESC)
 WHERE ROWNUM <= 3;
 
SELECT PROD_ID AS 상품코드
     , PROD_NAME AS 상품명
     , PROD_PRICE AS 판매가
     , PROD_PROPERSTOCK AS 적정재고
  FROM PROD
 WHERE PROD_PRICE >= 1000000
 ORDER BY PROD_PRICE DESC;


[DBTest.java]

package dbprogramming;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBTest {

	private String url = "jdbc:oracle:thin:@localhost:1521:xe";
	private String user = "pc_21";
	private String password = "java";
	
	private Connection conn = null;
	private Statement stmt = null; // 정적 쿼리
	private PreparedStatement pstmt = null; // 동적 쿼리
 	private ResultSet rs = null;
 	
 	private CallableStatement cs = null;// 프로시저 실행결과 반환
	
	public void dbConnection() {
		// 데이터베이스 연결 설정.
		// jdbc:oracle:thin:@127.0.0.1:1521:xe
		// 메인 DB 컴퓨터 ip address 열어서 방화벽 해제.
		// ipconfig로 확인!
		
		try {
			conn = DriverManager.getConnection(url, user, password);
			System.out.println("DB연결 성공");
			
//			String sql = " SELECT PROD_ID, PROD_NAME, PROD_PRICE, PROD_PROPERSTOCK ";
//			       sql += " FROM PROD ";
//			       sql += " WHERE PROD_PRICE >= 1000000 ";
			
			StringBuilder sb = new StringBuilder();
			sb.append(" SELECT PROD_ID, PROD_NAME, PROD_PRICE, PROD_PROPERSTOCK ");
			sb.append(" FROM PROD ");
			sb.append(" WHERE PROD_PRICE >= 1000000 ");
			sb.append(" ORDER BY PROD_PRICE DESC ");
			String sql = sb.toString();
			System.out.println(sql);
			
			stmt = conn.createStatement();
			// executeQuery : select 문만 사용.
			// executeUpdate : update, insert, delete 문에 사용.
			rs = stmt.executeQuery(sql); // 뷰를 보관하고 있는 객체
			
			while(rs.next()) {
				String pid = rs.getString("PROD_ID");
				String pname = rs.getString("PROD_NAME");
				StringBuilder ss = new StringBuilder(pname);
				for(int i=pname.length(); i<20; i++) {
					ss.append("\0");
				}
				String name = ss.toString();
				int price = rs.getInt("PROD_PRICE");
				int pstock = rs.getInt("PROD_PROPERSTOCK");
				
				System.out.printf("%-12s %-20s %10d %5d\n", pid, name, price, pstock);
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs != null) try {rs.close();} catch(Exception e) {}
			if(stmt != null) try {stmt.close();} catch(Exception e) {}
			if(pstmt != null) try {pstmt.close();} catch(Exception e) {}
			if(conn != null) try {conn.close();} catch(Exception e) {}
		}
	}
	
	public void selectList(String sql) {
		
	}

}

[DBTestExample.java]

package dbprogramming;

public class DBTestExample {

	public static void main(String[] args) {
		
		DBTest dt = new DBTest();
		dt.dbConnection();
		
	}

}

 

'대덕인재개발원 > 대덕인재개발원_Java' 카테고리의 다른 글

230803 자바 강의  (0) 2023.08.03
230801 자바 강의  (0) 2023.08.01
230731 자바 강의  (0) 2023.07.31
230729 자바 과제 _ 클래스 다이어그램 구현  (0) 2023.07.29
230728 자바 강의  (0) 2023.07.29