컬렉션 프레임워크(Collection Framework)
자바는 객체를 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들을 java.util 패키지에 포함시켜 놓았는데, 이들을 총칭해서 컬렉션 프레임워크라고 부름
주요 인터페이스로 List, Set, Map이 있음
List
ArrayList-싱글스레드안전
Vector-멀티스레드안전
Map
HashMap-싱글스레드안전
Hashtable-멀티스레드안전
인터페이스 분류 | 특징 | 구현 클래스 | |
Collection | List | 순서를 유지하고 저장 중복 저장 가능 |
ArrayList, Vector, LinkedList |
Set | 순서를 유지하지 않고 저장 중복저장 안 됨 |
HashSet, Treeset | |
Map | 키와 값의 쌍으로 저장 키는 중복 저장 안 됨 |
HashMap, Hashtable, TreeMap, Properties |
List 컬렉션
List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가짐
객체를 인덱스로 관리하기에 객체를 저장하면 자동 인덱스가 부여되고,
인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공함
객체 자체를 저장하는 것이 아니라 객체의 번지를 참조
동일한 객체를 중복 저장할 경우 동일한 번지가 참조됨
null값을 저장할 경우 해당 인덱스는 객체를 참조하지 않음
ArrayList, Vector 등이 있고, 인덱스로 객체를 관리하기에 인덱스를 매개값으로 갖는 메소드가 많음
Map 컬렉션
Map 컬렉션은 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가짐
여기서 키와 값은 모두 객체
키는 중복 저장될 수 없지만 값은 중복 저장될 수 있음
만약 기존에 저장된 키와 동일한 키로 저장하면 기존의 값은 없어지고 새로운 값으로 대치됨
HashMap, Hashtable 등이 있고, 키로 객체들을 관리하기에 키를 매개값으로 갖는 메소드가 많음
Statement(정적쿼리)와 PreparedStatement(동적쿼리)
두 인터페이스 모두 SQL 질의문을 전달하는 역할로, 사용시 반드시 try_catch문 또는 throws 처리를 해야 함
Statement는 단일로 사용될 때 빠른 속도를 지니지만, 쿼리에 인자를 부여할 수 없고(쿼리문에 값이 미리 입력되어 있어야 함) 매번 컴파일을 수행해야 한다.
PreparedStatement는 쿼리에 인자를 부여할 수 있으며 처음 프리컴파일이 된 후 컴파일을 수행하지 않기에 여러 번 수행될 때 빠른 속도를 지닌다.
package dev_java.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
public class DBConnectionMgr {
public static final String _DRIVER = "oracle.jdbc.driver.OracleDriver";
public static final String _URL = "jdbc:oracle:thin:@localhost:1521:orcl11";
public static String _USER = "scott";
public static String _PW = "tiger";
public Connection getConnection() {
Connection con = null;
try {
Class.forName(_DRIVER);
con = DriverManager.getConnection(_URL, _USER, _PW);
} catch (ClassNotFoundException ce) {
System.out.println("드라이버 클래스를 찾을 수 없습니다.");
} catch (Exception e) { // 멀티 블럭 작성 시 범위가 넓은 Exception을 바깥쪽에 적기
System.out.println("오라클 서버와 연결 실패");
}
return con;
}
// 사용한 자원을 반납하는 코드는 명시적으로 하는 것을 원칙으로 함
// 반납하는 순서는 생성된 역순으로 진행할 것 - 자바튜닝팀 지적사항
// 사용한 자원 반납하기 - INSERT, UPDATE, DELETE
public void freeConnection(Connection con, Statement stmt) {
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
// TODO: handle exception
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
// TODO: handle exception
}
}
} // end of freeConnection
public void freeConnection(Connection con, PreparedStatement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (Exception e) {
// TODO: handle exception
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
// TODO: handle exception
}
}
} // end of freeConnection
// 사용한 자원 반납하기 - SELECT(커서 조작 필요)
public void freeConnection(Connection con, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
// TODO: handle exception
}
}
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
// TODO: handle exception
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
// TODO: handle exception
}
}
} // end of freeConnection
public void freeConnection(Connection con, PreparedStatement pstmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
// TODO: handle exception
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (Exception e) {
// TODO: handle exception
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
// TODO: handle exception
}
}
} // end of freeConnection
public static void main(String[] args) {
DBConnectionMgr dbMgr = new DBConnectionMgr();
Connection con = dbMgr.getConnection();
System.out.println("con ==> " + con);
}
}
/*
* JDBC API를 이용하여 DB연동하기
* 1. 각 제조사가 제공하는 드라이버 클래스를 로딩한다.(ojdbc6.jar)
* 2. 물리적으로 떨어져있는 오라클 서버와 연결 통로를 확보한다.
* 3. DML문을 자바에서 오라클 서버로 전달해 줄 인터페이스를 생성한다.
* Statement: 정적쿼리문, PreparedStatement:동적쿼리문 지원
* 4. SELECT문의 경우 오라클 서버에서 제공하는 커서를 지원하는 ResultSet 인터페이스를 활용하여
* 테이블에 제공되는 커서를 조작해 해당 로우에 데이터가 존재하면 Cursor..open..fetch과정을 통해
* 오라클 서버로부터 데이터를 꺼내서 List<DeptVO>에 담을 수 있다.
* 주의: INSERT, UPDATE, DELETE에서는 커서가 필요없음 - commit, rollback
* 리턴값은 int
* 이것들을 요청할 떄는 executeUpdate(INSERT문 or UPDATE문 or DELETE문)
*
* SELECT일떄는
* ResultSet rs = executeQuery("SELECT * FROM dept");
* 오라클에서 제공되는 커서를 조작하는 인터페이스를 리턴타입으로 제공받아서
* 조회 결과를 Collection에 담을 수 있다.
* List<DeptVO> deptList = new ArrayList<>();
* DeptVO dVO = null;
* while(rs.next()){
* dVO = new DeptVO();
* deptList.add(dVO);
* }
*
* 사용한 자원을 반납할 때는 사용한 역순으로 닫아주면 됨
* SELECT인 경우
* ResultSet 먼저 닫고
* Statement 혹은 PreparedStatement 두 번째로 닫고
* Connection을 맨 나중에 닫아주면 됨
* 닫지 않으면 나중에 자동으로 닫아주기는 하지만
* 명시적으로 닫아주면 닫는 시간을 앞당길 수 있어, 프로젝트에서는 명시적으로 닫는 코드 작성을 가이드로 정함
*
* INSERT, UPDATE, DELETE는 두 번째와 세 번째만 닫으면 됨
* 왜냐하면 리턴타입이 커서가 필요없으니까
*/
package dev_java.oracle;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import dev_java.util.DBConnectionMgr;
public class JDBCTest2 {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
DBConnectionMgr dbMhr = new DBConnectionMgr();
public String currentTime() throws Exception {
con = dbMhr.getConnection();
String sql = "select to_char(sysdate,'HH24:MI:SS') as currentTime from dual";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery(); // 오라클 서버에게 처리를 요청함.
if (rs.next()) {
return rs.getString("currentTime");
}
return "15:09:49";
}
public static void main(String[] args) throws Exception {
// java.lang패키지에 클래스는 모두 찾지만 그 외 패키지는 찾을 수 없다.
// Scanner scan = new Scanner(System.in);
JDBCTest2 jt = new JDBCTest2();
String ctime = jt.currentTime();
System.out.printf("현재 시간은 %s 입니다.\n", ctime);
}
}
package dev_java.oracle;
import java.util.List;
import java.util.ArrayList;
import dev_java.week4.DeptVO;;
public class ListExam1 {
public static void main(String[] args) {
List<DeptVO> deptList = new ArrayList<>();
DeptVO dVO = DeptVO.builder().deptNo(10).deptName("총무부").deptLoc("서울").build();
deptList.add(dVO);
dVO = DeptVO.builder().deptNo(20).deptName("인사부").deptLoc("부산").build();
deptList.add(dVO);
dVO = DeptVO.builder().deptNo(30).deptName("개발부").deptLoc("제주").build();
deptList.add(dVO);
for (DeptVO rdVO : deptList) {
System.out.println(rdVO.getDeptNo() + ", " + rdVO.getDeptName() + ", " + rdVO.getDeptLoc());
}
System.out.println("====================");
for (int i = 0; i < deptList.size(); i++) {
DeptVO rdVO = deptList.get(i);
System.out.println(rdVO.getDeptNo() + ", " + rdVO.getDeptName() + ", " + rdVO.getDeptLoc());
}
}
}
package dev_java.oracle;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import dev_java.util.DBConnectionMgr;
import dev_java.week4.DeptVO;
public class DeptList {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
DBConnectionMgr dbMhr = new DBConnectionMgr();
public List<DeptVO> getDeptList() {
con = dbMhr.getConnection();
String sql = "SELECT deptno, dname, loc FROM dept";
List<DeptVO> deptList = new ArrayList<>();
try {
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
DeptVO dVO = null;
while (rs.next()) {
dVO = DeptVO.builder().deptNo(rs.getInt("deptno")).deptName(rs.getString("dname")).deptLoc(rs.getString("loc"))
.build();
deptList.add(dVO);
}
} catch (Exception e) {
System.out.println(e.toString());
}
return deptList;
}
public static void main(String[] args) {
DeptList deptList = new DeptList();
List<DeptVO> list = null;
list = deptList.getDeptList();
for (int i = 0; i < list.size(); i++) {
DeptVO rdVO = list.get(i);
System.out.println(rdVO.getDeptNo() + ", " + rdVO.getDeptName() + ", " + rdVO.getDeptLoc());
}
System.out.println("====================");
for (DeptVO rdVO : list) {
System.out.println(rdVO.getDeptNo() + ", " + rdVO.getDeptName() + ", " + rdVO.getDeptLoc());
}
}
}
package dev_java.oracle;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
import java.util.Iterator;
public class MapTest1 {
Map<String, Object> rMap = new HashMap<>(); // rMap.size() = 0
public void setMap() {
rMap.put("deptno", 10);
rMap.put("dname", "인사부");
rMap.put("loc", "서울");
rMap.put("loc", "부산"); // 같은 키값에 넣으면 기존값은 없어지고 새로운 값으로 대체됨
}
public static void main(String[] args) {
MapTest1 mt1 = new MapTest1();
mt1.setMap();
System.out.println(mt1.rMap.size()); // 3
// Map에서 제공하는 메소드 중에서 Key값을 묶음처리하는 메소드가 있음
Set<String> set = mt1.rMap.keySet();
// Set인터페이스가 제공하는 메소드 중에서 toArray() 지원함
Object obj[] = set.toArray(); // deptno, dname, loc
for (int i = 0; i < obj.length; i++) { // obj.length는 배열의 원소 수 -> 3(deptno, dname, loc)
String key = (String) obj[i]; // 배열에서 꺼낸 값은 key값이다 - deptno, dname, loc
System.out.println("key: " + key); // 3번 출력됨 -> 순서는 랜덤
}
System.out.println("====================");
Iterator<String> iter = set.iterator();
while (iter.hasNext()) { // 자료구조 안에 값이 있는지 체크해서 있으면 true 반환, 없으면 false 반환
String key = iter.next();
// String value = (String)mt1.rMap.get(key);
Object value = mt1.rMap.get(key);
System.out.println(key + ": " + value);
}
}
}
package dev_java.oracle;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
public class MapTest2 {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> rMap = new HashMap<>();
public void setMap() {
rMap.put("deptno", 10);
rMap.put("dname", "인사부");
rMap.put("loc", "서울");
list.add(rMap);
rMap = new HashMap<>();
rMap.put("deptno", 20);
rMap.put("dname", "개발부");
rMap.put("loc", "부산");
list.add(rMap);
rMap = new HashMap<>();
rMap.put("deptno", 30);
rMap.put("dname", "총무부");
rMap.put("loc", "제주");
list.add(rMap);
}
public void mapPrint() {
// 각 로우안에 key가 3개있다(컬럼-deptno, dname, loc)
// Map m1 = get(0); 컬럼3개, Map m2 = get(1);컬럼 3개, Map m3 = get(2);컬럼 3개
// 아래에서 반복해야 하는 건 List이다(ArrayList)
for (int i = 0; i < list.size(); i++) { // 반복해서 처리할 것은 로우값
Map<String, Object> m1 = list.get(i);
// 컬럼의 수를 반복해서 출력하기
Object[] keys = m1.keySet().toArray();
for (int j = 0; j < keys.length; j++) {
String key = (String) keys[j];
System.out.print(m1.get(key) + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
MapTest2 mt2 = new MapTest2();
mt2.setMap();
// Map의 size는 세로방향(컬럼의 수)이다
System.out.println(mt2.rMap.size()); // 3
mt2.mapPrint();
}
}
package dev_java.week5;
// Object클래스에는 toString()가 정의되어 있다.
// 모든 클래스는 toString()을 오버라이딩 할 수 있다.
public class Pride extends Object {
@Override
public String toString() {
return "Pride자동차 입니다.";
}
public static void main(String[] args) {
Pride myCar = new Pride();
System.out.println(myCar);
System.out.println(myCar.toString());
}
}
// 오버라이드(6~9번줄) 주석으로 막았을 경우
// dev_java.week5.Pride@24d46ca6
// dev_java.week5.Pride@24d46ca6
// 주석으로 막지 않았을 경우
// Pride자동차 입니다.
// Pride자동차 입니다.
package dev_java.oracle;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
// 회원정보 담기
public class MapTest3 {
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
System.out.println(list); // []
// 회원아이디, 이름, 비밀번호, 성별
// mem_id, mem_name, mem_pw, mem_gender
// tomato, 토마토, 123, 남자
// banana, 바나나, 456, 여자
// kiwi, 키위, 789, 남자
Map<String, Object> pMap = new HashMap<>();
pMap.put("mem_id", "tomato");
pMap.put("mem_name", "토마토");
pMap.put("mem_pw", 123);
pMap.put("mem_gender", "남자");
list.add(pMap);
System.out.println(pMap); // {mem_gender=남자, mem_pw=123, mem_name=토마토, mem_id=tomato}
System.out.println(list); // [{mem_gender=남자, mem_pw=123, mem_name=토마토, mem_id=tomato}]
System.out.println(list.get(0)); // Map출력
System.out.println(list.get(0).get("mem_name")); // 토마토, Map의 "mem_name"키 값 출력
System.out.println(list.get(0).get("mem_pw")); // 123, Map의 "mem_pw"키 값 출력
pMap = new HashMap<>();
pMap.put("mem_id", "banana");
pMap.put("mem_name", "바나나");
pMap.put("mem_pw", 456);
pMap.put("mem_gender", "여자");
list.add(pMap);
pMap = new HashMap<>();
pMap.put("mem_id", "kiwi");
pMap.put("mem_name", "키위");
pMap.put("mem_pw", 789);
pMap.put("mem_gender", "남자");
list.add(pMap);
}
}
package dev_java.oracle;
import java.util.Map;
import java.util.HashMap;
public class MapTest4 {
public static void main(String[] args) {
Map<String, Object> rMap = new HashMap<>();
rMap.put("mem_id", "tomato");
System.out.println(rMap);// {mem_id=tomato}
rMap = new HashMap<>(); // 새로운 객체가 생성됨(타입만 같음)
rMap.put("mem_id", "apple");
System.out.println(rMap);// {mem_id=apple}
rMap = new HashMap<>();
System.out.println(rMap);// {}
};
}
package dev_java.oracle;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
public class MapTest5 {
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> rMap = new HashMap<>();
rMap.put("mem_id", "tomato");
System.out.println(rMap); // {mem_id=tomato}
list.add(rMap);
rMap = new HashMap<>();
rMap.put("mem_id", "apple");
System.out.println(rMap); // {mem_id=apple}
list.add(rMap);
// insert here 굳이 tomato를 출력하려면?
System.out.println(list.get(0).get("mem_id")); // tomato
System.out.println(list.get(1).get("mem_id")); // apple
rMap = new HashMap<>();
System.out.println(rMap); // {}
};
}
http-웹서비스 요청과 응답을 받아올 수 있다
웹서비스를 제공하기 위해서는 웹서버가 필요하다
웹서비스는 요청으로 시작해서 응답으로 끝난다
요청을 하고 응답을 받아올 때 URL 주소가 필요하다
main메소드가 필요 없다
http://localhost:9000/chat/index.html 엔터(요청) → 서버에 전달 → 처리 → 응답을 보냄
서버가 클라이언트 측에 응답을 보내면서 전달되는 상태값
정상: 200
페이지 경로가 틀림: 404
자바의 예외상황(NullPointerException, ClassNotFoundException, ArrayIndexOutOfBoundException): 500 → 자바런타임 에러
URL객체
http://localhost:9000/chat/index.html 이 정보를 객체화해 줌
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//스크립틀이라고 읽음
String mem_id = request.getParameter("mem_id");
out.print("사용자가 입력한 아이디 => "+mem_id);
out.print("<br />");
String mem_pw = request.getParameter("mem_pw");
out.print("사용자가 입력한 비밀번호 => "+mem_pw);
out.print("<br />");
String mem_name = request.getParameter("mem_name");
out.print("사용자가 입력한 이름 => "+mem_name);
out.print("<br />");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
회원가입
</body>
</html>
http://localhost:9000/membership.jsp?mem_id=tomato&mem_pw5=123&mem_name=토마토 → Query String
쿼리 스트링(Query String)
사용자가 입력한 데이터를 서버로 전달하는 가장 단순한 방법
get방식으로 요청했을 때 URL주소 뒤에 입력 데이터를 함께 제공하는 방법으로, "리소스?이름=값"의 형식을 취함
쿼리 스트링이 두 개 이상일 경우에는 &로 연결
package dev_java.week5;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class TomcatServer {
public static void main(String[] args) {
String url = "<http://localhost:9000/index.html>";
try {
// 예외가 발생할 가능성이 있는 코드
URL myURL = new URL(url);
HttpURLConnection con = (HttpURLConnection) myURL.openConnection();
int responseCode = con.getResponseCode(); // 200 404 500
// System.out.println(responseCode);
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println(sb.toString());
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
toad 다른 서버와 연결하기
Session → New Connection → Direct-Host와 SID 입력-Connect
'국비학원 > 수업기록' 카테고리의 다른 글
국비 지원 개발자 과정_Day26 (0) | 2023.01.02 |
---|---|
국비 지원 개발자 과정_Day25 (0) | 2022.12.30 |
국비 지원 개발자 과정_Day23 (0) | 2022.12.28 |
국비 지원 개발자 과정_Day22 (0) | 2022.12.27 |
국비 지원 개발자 과정_Day21 (0) | 2022.12.26 |
댓글