



package ch15.sec02.exam01;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data // lombok 데이터 사용
@AllArgsConstructor // lombok으로 인자를 모두 가지는 생성자 만듦
public class Board {
private String subject;
private String content;
private String writer;
public void print() {
System.out.println(getSubject() + "\t" + getContent() +
"\t" + getWriter());
}
}
package ch15.sec02.exam01;
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
// 파라미터를 Board 객체로 가지는 ArrayList 컬렉션 생성
List<Board> list = new ArrayList<>();
// Board 생성자에 인자 추가
// add : 생성된 Board 객체를 List 컬렉션에 추가
list.add(new Board("제목1", "내용1", "글쓴이1"));
list.add(new Board("제목2", "내용2", "글쓴이2"));
list.add(new Board("제목3", "내용3", "글쓴이3"));
list.add(new Board("제목4", "내용4", "글쓴이4"));
list.add(new Board("제목5", "내용5", "글쓴이5"));
// size : 저장된 객체 수를 얻기
int size = list.size();
System.out.println("총 객체 수: " + size);
System.out.println();
// List에 3번째로 추가된 객체를 출력함
Board board = list.get(2);
board.print();
// List에 저장된 길이만큼 for문 실행
for(int i=0;i<list.size();i++) {
// list에 배열에 저장되어 있는 값들을 Board 객체에 저장
Board b = list.get(i);
b.print();
}
System.out.println();
// List 객체에 저장되어있는 값 중에 인덱스 2(3번째) 값 삭제
list.remove(2);
// List 객체에 저장되어있는 값 중에 인덱스 2(3번째) 값 삭제
// 위의 구문으로 인덱스 2의 값이 삭제되었으므로,
// 인덱스 3번의 값이 인덱스 2번으로 옮겨짐. 그리고 인덱스 3번의 값도 삭제됨
list.remove(2);
// 향상된 for loop
for(Board b : list) {
b.print();
}
}
}

package ch15.sec02.exam02;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data // lombok 데이터 사용
@AllArgsConstructor // lombok으로 인자를 모두 가지는 생성자 만듦
public class Board {
private String subject;
private String content;
private String writer;
public void print() {
System.out.println(getSubject() + "\t" + getContent() +
"\t" + getWriter());
}
}
package ch15.sec02.exam02;
import java.util.List;
import java.util.Vector;
import ch15.sec02.exam01.Board;
public class VectorExam {
public static void main(String[] args) {
// Vector 컬렉션 생성하여 List 클래스의 파라미터를 Board 객체로 사용
// ArrayList보다 정확도가 더 좋음
List<Board> list = new Vector<>();
// Vector 대신 ArrayList도 사용할 수 있지만
// 스레드의 갯수가 여러개일 경우 정확도가 떨어짐
// 작업 쓰레드 객체 생성
Thread threadA = new Thread() {
public void run() {
// 1000개의 객체 생성(1번부터 1000번까지)
for(int i=1;i<=1000;i++) {
list.add(new Board("제목"+i, "내용"+i, "글쓴이"+i));
}
}
};
// 작업 쓰레드 객체 생성
Thread threadB = new Thread() {
public void run() {
// 1000개의 객체 생성(1001번부터 2000번까지)
for(int i=1001;i<=2000;i++) {
list.add(new Board("제목"+i, "내용"+i, "글쓴이"+i));
}
}
};
// 실행 시작 시간을 잡는 위치
long start = System.nanoTime();
// 스레드의 start 메소드 : 스레드를 실행할 수 있도록 하는 메소드
// 스레드를 선언하면 반드시 실행하는 메소드를 선언해주기
threadA.start();
threadB.start();
// 예외가 발생할 수 있는 구문
try {
// join : 해당 스레드의 실행이 끝날 때 까지 기다려줌
threadA.join();
threadB.join();
}
// 예외가 발생했을 때 실행되는 구문
catch(Exception e) {
System.out.println("예외가 발생하였습니다");
}
// 실행 종료 시간을 잡는 위치
long end = System.nanoTime();
System.out.println("실행시간: " + (end-start));
// 저장된 객체 수 얻기
int size = list.size();
System.out.println("총 객체 수: " + size);
System.out.println();
}
}

package ch15.sec02.exam03;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LinkedListExam {
public static void main(String[] args) {
// ArrayList 객체 생성
List<String> list1 = new ArrayList<String>();
// LinkedList 객체 생성
List<String> list2 = new LinkedList<String>();
// 실행 시작시간과 종료시간 필드를 만듦
long startTime;
long endTime;
// 시작시간
startTime = System.nanoTime();
for(int i=0; i<10000; i++) {
// for루프 실행 내내 값을 0번째에 넣음으로써
// 값이 내림차순으로 나옴
list1.add(0, String.valueOf(i));
// ArrayList는 배열을 사용함
// 값을 0번째에 넣을 때 나머지 값들을 한칸씩 뒤로 미루는 과정에서
// 성능이 떨어짐
}
endTime = System.nanoTime();
// ArrayList의 저장 시간
System.out.printf("%-17s %8d ns \n", "ArrayList 걸린 시간: ", (endTime-startTime));
startTime = System.nanoTime();
for(int i=0; i<10000; i++) {
list2.add(0, String.valueOf(i));
// LinkedList는 연결 리스트 구조
// 앞에 값을 추가하는 작업이 상대적으로 빠름
}
endTime = System.nanoTime();
// LinkedList의 저장 시간
System.out.printf("%-17s %8d ns \n", "LinkedList 걸린 시간: ", (endTime-startTime));
}
}


package ch15.sec03.exam01;
import java.util.HashSet;
import java.util.Set;
public class HashSetExam {
public static void main(String[] args) {
// HashSet 컬렉션 생성
// Set : 순서가 없고 중복을 허용하지 않는 데이터를 저장하는 객체
// HashSet : 내부적으로 해시테이블을 사용하여 데이터를 저장
// 빠른 검색, 추가, 삭제가 가능함
Set<String> set = new HashSet<String>();
// 객체 저장
set.add("Java");
set.add("JDBC");
set.add("JSP");
set.add("Spring");
// Set의 경우 중복 객체 저장을 허용하지 않음
set.add("Java");
int size = set.size();
System.out.println("총 객체 수: " + size);
// 마지막 Java가 중복 저장이 되지 않기 때문에 결과는 4
}
}
package ch15.sec03.exam02;
import java.util.HashSet;
import java.util.Set;
public class HashSetExam {
public static void main(String[] args) {
// HashSet 컬렉션 생성 후 Set 객체에 저장!
Set<Member> set = new HashSet<Member>();
set.add(new Member("홍길동", 30));
set.add(new Member("홍길동", 30));
// 중복 저장이 되지 않으므로 결과는 1
System.out.println("총 객체 수: " + set.size());
}
}
package ch15.sec03.exam02;
public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
// hashCode를 반환하는 메소드
// name과 age 값이 같으면 동일한 해시코드가 리턴됨
@Override
public int hashCode() {
return name.hashCode() + age;
}
// name과 age가 같으면 true 리턴함
@Override
public boolean equals(Object obj) {
// obj(Object) 타입의 변수를 Member 타입의 변수로 변환 가능하면 변수 target에 저장
if(obj instanceof Member target) {
//
return target.name.equals(name) && (target.age==age);
}
else {
return false;
}
}
}

package ch15.sec03.exam03;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetExam {
public static void main(String[] args) {
// HashSet 컬렉션을 생성하여 Set 클래스에 저장
Set<String> set = new HashSet<String>();
// Set 객체에 문자열 삽입
set.add("Java");
set.add("JDBC");
set.add("JSP");
set.add("Spring");
// Iterator : 객체를 하나씩 가져와서 처리하는 기능을 함
// .iterator : 컬렉션에서 Iterator 객체를 생성하고 반환하는 메소드
Iterator<String> iterator = set.iterator();
// iterator.hasNext() : 리스트 등의 요소를 하나씩 순회할 때 사용
while(iterator.hasNext()) {
// 다음 요소를 가져올 때 사용
String element = iterator.next();
System.out.println(element);
if(element.equals("JSP")) {
//해당 요소를 삭제할 때 사용
iterator.remove();
}
}
System.out.println();
// Set에 저장된 JDBC라는 문자열 삭제
set.remove("JDBC");
// set에 저장된 구문들을 모두 출력
for(String element : set) {
System.out.println(element);
}
}
}



package ch15.sec04.exam01;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class HashMapExam {
public static void main(String[] args) {
// Map<>() : 키와 값을 쌍으로 저장하는 자료구조
// 키를 String 형태, 값을 Integer 형태로 저장함
// HashMap<>() : 빠른 데이터 조회 및 추가/삭제가 가능함
Map<String, Integer> map = new HashMap<>();
map.put("신용권", 85);
map.put("홍길동", 90);
map.put("동장군", 80);
// 키가 같을 경우 최근에 지정한 값으로 저장됨
map.put("홍길동", 95);
// Map에 저장된 값들의 갯수를 출력함
// 홍길동 키의 값이 업데이트 됐으므로 개수는 3개가 됨
System.out.println("총 Entry 수: " + map.size());
System.out.println();
String key = "홍길동";
// 홍길동 키에 저장된 값을 출력
int value = map.get(key);
System.out.println(key + ": " + value);
System.out.println();
// ketSet : Map에 저장된 모든 키들을 Set으로 반환하는 메소드
// Set은 중복 값 저장 x
Set<String> keySet = map.keySet();
// Iterator : 컬렉션의 요소들을 하나씩 순회할 수 있는 인터페이스
// Map에 저장된 키와 값을 얻을 수 있는 역할을 함
Iterator<String> keyIterator = keySet.iterator();
// hasNext() 다음 값이 있는지 확인
while (keyIterator.hasNext()) {
// next() : Set의 다음 키 값이 나옴
String k = keyIterator.next();
// .get(k) : 해당 키의 값을 읽어옴
Integer v = map.get(k);
System.out.println(k + ": " + v);
}
System.out.println();
// map.entrySet() : Map의 모든 키-값의 쌍을 Set으로 반환함
// Entry<> : Map의 단일요소로, 키-값의 쌍을 나타내는 인터페이스
Set<Entry<String, Integer>> entrySet = map.entrySet();
// entrySet의 값들을 순차적으로 접근하기 위한 선언
Iterator<Entry<String, Integer>> entryIterator = entrySet.iterator();
// entryIterator의 다음 값이 있는지 확인
while(entryIterator.hasNext()) {
// 현재 값을 반환 후 커서를 다음 요소로 이동시킴
Entry<String, Integer> entry = entryIterator.next();
// 현재 키 값을 반환
String k = entry.getKey();
// 현재 값을 반환
Integer v = entry.getValue();
System.out.println(k + ": " + v);
}
System.out.println();
// map에서 홍길동 키를 삭제
map.remove("홍길동");
// map 안에 저장된 값들의 개수
System.out.println("총 Entry 수: " + map.size());
System.out.println();
}
}

package ch15.sec04.exam02;
import java.util.Hashtable;
import java.util.Map;
public class HashtableExam {
public static void main(String[] args) {
// Hashtable : 동기화된 자료구조
// 스레드가 여러 개 있어도 안전하게 동작할 수 있도록 함
Map<String, Integer> map = new Hashtable<>();
// Thread : 하나의 프로그램이 여러 작업을 동시에 처리할 수 있는 기능
Thread threadA = new Thread() {
public void run() {
for(int i=1;i<=1000;i++) {
// Map에 문자열과 정수값을 넣음
map.put(String.valueOf(i), i);
}
}
}; // Thread 블록에는 꼭 세미콜론 붙이기
// Thread : 하나의 프로그램이 여러 작업을 동시에 처리할 수 있는 기능
Thread threadB = new Thread() {
public void run() {
for(int i=1001;i<=2000;i++) {
// Map에 문자열과 정수값을 넣음
map.put(String.valueOf(i), i);
}
}
}; // Thread 블록에는 꼭 세미콜론 붙이기
// 스레드 실행
threadA.run();
threadB.run();
// 예외가 발생할 수 있는 구문 처리
try {
// join : 스레드의 실행이 끝날 때 까지 기다리는 역할
threadA.join();
threadB.join();
}
// 예외 처리
catch(Exception e) {
System.out.println("예외 발생");
}
// map 내부의 값의 갯수를 출력
int size = map.size();
System.out.println("총 엔트리 수: " + size);
System.out.println();
}
}
driver=oracle.jdbc.OracleDirver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=user
password=pwd1234
admin=\uD64D\uAE38\uB3D9
package ch15.sec04.exam03;
import java.util.Properties;
public class PropertiesExample {
public static void main(String[] args) throws Exception{
// Properties : Hashtable의 자식 클래스로, 키와 값을 String 값으로 제한한 컬렉션
Properties properties = new Properties();
// 해당 클래스에 있는 database.properties 파일을 불러옴
properties.load(PropertiesExample.class.getResourceAsStream("database.properties"));
// database.properties에 저장된 문자열들 얻어옴
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String admin = properties.getProperty("admin");
System.out.println("driver : " + driver);
System.out.println("url : " + url);
System.out.println("username : " + username);
System.out.println("password : " + password);
System.out.println("admin : " + admin);
}
}
Properties 한글 깨짐 현상 조치
https://mimah.tistory.com/entry/Eclipse-properties-%ED%8C%8C%EC%9D%BC-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%80%EB%8A%94-%EA%B2%BD%EC%9A%B0
eclipse에서 Properties 한글 플러그인 설치 방법
https://exhibitlove.tistory.com/160










