국비학원/수업기록
국비 지원 개발자 과정_Day17
루팽
2022. 12. 20. 21:02
Vector vs ArrayList
Vector는 동기화가 이미 되어 있는 클래스 / ArrayList는 동기화 처리가 안된 클래스입니다.
Vector는 한 번에 하나의 쓰레드만 접근 가능 / ArrayList는 동시에 여러 쓰레드가 접근 가능
Vector는 동기화 되어 있기에 멀티스레드에 안전 / ArrayList는 동기화되지 않았기에 명시적으로 동기화해야 함
ArrayList는 동기화되지 않았기 때문에 동기화된 벡터보다 더 빠름
Thread
프로세스(process) 내에서 실제로 작업을 수행하는 주체
모든 프로세스에는 한 개 이상의 스레드가 존재
두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 함
다형성
List list = new Vector();
인터페이스, 추상클래스 = new 구현체 클래스
package dev_java.week4;
// 인터페이스가 정의하는 메소드는 모두 추상메소드이다
// 추상메소드는 세미콜론으로 끝난다
// 구현체 클래스에서 오버라이딩해서 써야하는 것이다
// 모두가 추상메소드이므로 abstract예약어는 생략이 가능하다
// 단독으로 인스턴스화가 불가하다
public interface FlyBehavior {
public abstract void fly(); // 메소드 선언(세미콜론으로 끝남, abstract생략가능)
}
package dev_java.week4;
// 자바에서 제공하는 자료구조는 java.util 폴더에 있음
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class List1 {
public static void main(String[] args) {
// 아래는 new 생성부에 인터페이스가 와서 에러 -> 구현체 클래스가 와야함
// List<String> nameList = new List<>();
// DefaultTableModel객체에 데이터셋을 추가하는 메소드를 제공하는 것이 Vector
List<String> nameList = new Vector<>(); // Vector는 멀티스레드에 안전-속도 느림
List<String> nameList2 = new ArrayList<>(); // ArrayList는 싱글스레드에 안전(멀티x)-속도 빠룸
System.out.println(nameList.size()); // 초기값 0
boolean isOk = nameList.add("이순신");
System.out.println(nameList.size()); // 1
System.out.println(nameList.get(0)); // 이순신
System.out.println(isOk); // true
}
}
package dev_java.week4;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
public class LIst2 {
public static void main(String[] args) {
// 자료구조를 지원하는 클래스들은 오브젝트의 존재유무, 포함여부,
// 비어있는지 혹은 채워져 있는지 확인할 수 있는 api를 제공하고있디
List<String> fruitList = new Vector<>();
fruitList.add("사과");
fruitList.add("토마토");
boolean isExist = fruitList.contains("바나나");
System.out.println(isExist); // false
isExist = fruitList.contains("토마토");
if (isExist) { // 들어있다
System.out.println("들어있다");
} else {
System.out.println("들어있지 않다");
}
boolean isEmpty = fruitList.isEmpty();
System.out.println(isEmpty); // false
// Vector나 ArrayList는 오브젝트 추가, 추출 기능을 제공한다
// Iterator는 그 안에 오브젝트의 존재유무에 중점을 둔다
Iterator<String> iter = fruitList.iterator();
while (iter.hasNext()) {
String fName = iter.next();
System.out.println(fName);
}
Iterator iter2 = fruitList.iterator();
while (iter2.hasNext()) {
// 다이아몬드 연산자<>에 타입을 명시적으로 작성하는 걸 권장
String fName = (String) iter2.next(); // 제너릭타입을 지정하지 않으면 에러
System.out.println(fName);
}
// 아래와 같이 사용할 수 없다.
// Vector의 제네릭 타입이 String이니까 타입에러
// Iterator<Object> iter3 = fruitList.iterator();
Iterator<String> iter4 = fruitList.iterator(); // 타입을 맞춰야함
}
}
// 사과
// 토마토
// 사과
// 토마토
lombok 기능
@Data
@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor을 한 번에 사용
@Builder
빌더 자동 생성
생성자 인자를 메서드 체인을 통해 명시적으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성해줌(생성과정과 표현방법을 분리)
package dev_java.week4;
// 직관적(lombok쓰지 않고 직접 쓰는 방법)
class CarVO {
private int speed;
private String carColor;
private int wheelNum;
CarVO() {
// 디폴트값 0, null, 0
}
// new CarVO(30);으로 호출했다면
CarVO(int speed) {
this.speed = speed;
// 값은 30, null, 0
}
// new CarVO(50, "검정색");으로 생성하면?
CarVO(int speed, String carColor) {
this.speed = speed;
this.carColor = carColor;
// 값은 50, "검정색", 0
}
// new CarVO(100, "흰색", 4);로 생성
CarVO(int speed, String carColor, int wheelNum) {
this.speed = speed;
this.carColor = carColor;
this.wheelNum = wheelNum;
// 값은 100, "흰색", 4
}
@Override
public String toString() {
return "내 자동차는 " + carColor + "이고, 바퀴 수는 " + wheelNum + ", 현재 속도는 " + speed + "입니다.";
}
public int getSpeed() {
return this.speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public String getCarColor() {
return this.carColor;
}
public void setCarColor(String carColor) {
this.carColor = carColor;
}
public int getWheelNum() {
return this.wheelNum;
}
public void setWheelNum(int wheelNum) {
this.wheelNum = wheelNum;
}
}
public class CarVoMain {
public static void main(String[] args) {
CarVoMain carVoMain = new CarVoMain();
System.out.println(carVoMain); // override가 없기에 주소값만 찍힘
CarVO cVo1 = new CarVO();
CarVO cVo2 = new CarVO(30);
CarVO cVo3 = new CarVO(50, "검정색");
CarVO cVo4 = new CarVO(100, "흰색", 4);
System.out.println(cVo1);
System.out.println(cVo2);
System.out.println(cVo3);
System.out.println(cVo4);
}
}
// 내 자동차는 null이고, 바퀴 수는 0, 현재 속도는 0입니다.
// 내 자동차는 null이고, 바퀴 수는 0, 현재 속도는 30입니다.
// 내 자동차는 검정색이고, 바퀴 수는 0, 현재 속도는 50입니다.
// 내 자동차는 흰색이고, 바퀴 수는 4, 현재 속도는 100입니다.
package dev_java.week4;
import lombok.Builder;
import lombok.Data;
@Data // Getter, Setter 포함되어있음
@Builder
public class DeptVO {
int deptNo;
String deptName;
String deptLoc;
}
package dev_java.week4;
public class DeptVOMain {
public static void main(String[] args) {
// DeptVO dVo = DeptVO.builder(); //builder()로 설정 안했기에 오류
DeptVO dVo1 = DeptVO.builder().deptName("총무부").build(); // 순서 상관없음
DeptVO dVo2 = DeptVO.builder().deptNo(20).deptName("총무부").deptLoc("부산").build();
System.out.println(dVo1.getDeptNo() + ", " + dVo1.getDeptName() + ", " + dVo1.getDeptLoc());
System.out.println(dVo2.getDeptNo() + ", " + dVo2.getDeptName() + ", " + dVo2.getDeptLoc());
}
}
package dev_java.week4;
import java.util.Vector;
public class VectorCRUD1 {
static Vector<String[]> vDept = new Vector<>(); // 내가 만든 코드 -> String[] 타입
// 부서 전체 조회
public void deptList() {
System.out.println("부서 정보 전체 조회 호출");
for (int i = 0; i < vDept.size(); i++) {
String[] oneRow = vDept.get(i);
for (int j = 0; j < oneRow.length; j++) {
System.out.print(oneRow[j] + " ");
}
System.out.println();
}
System.out.println();
}
// 벡터에 부서정보 추가하기-없는 것을 새로 추가
public int deptInsert(String[] str) {
System.out.println("부서 정보 입력 호출");
int result = 0; // 1이면 성공, 0이면 실패
boolean isOk = vDept.add(str);
if (isOk) {
result = 1;
}
return result;
}
// 벡터에 부서정보 수정하기-있는 것을 변경
public int deptUpdate(int deptNo, String[] str) {
System.out.println("부서 정보 수정 호출");
int result = 0; // 1이면 성공, 0이면 실패
for (int i = 0; i < vDept.size(); i++) {
String[] oneRow = vDept.get(i);
if (deptNo == Integer.parseInt(oneRow[0])) {
vDept.set(i, str);
}
}
boolean isOk = vDept.contains(str);
if (isOk) {
result = 1;
}
return result;
}
// 벡터에 부서정보 삭제하기-있는 것을 삭제
public int deptDelete(int deptNo) {
System.out.println("부서 정보 삭제 호출");
int result = 0; // 1이면 성공, 0이면 실패
for (int i = 0; i < vDept.size(); i++) {
String[] oneRow = vDept.get(i);
if (deptNo == Integer.parseInt(oneRow[0])) {
vDept.remove(i);
boolean isOk = vDept.contains(vDept.get(i));
if (!isOk) {
result = 1;
}
}
}
return result;
}
// 벡터의 부서정보 상세보기-있는 것을 하나 꺼내보기
public String[] deptDetail(int deptNo) {
System.out.println("부서 정보 상세보기 호출");
String[] oneRow = new String[3];
for (int i = 0; i < vDept.size(); i++) {
oneRow = vDept.get(i);
if (deptNo == Integer.parseInt(oneRow[0])) {
oneRow = vDept.get(i);
}
}
return oneRow;
}
public static void main(String[] args) {
VectorCRUD1 vCrud = new VectorCRUD1();
// 입력 테스트
String[] oneRow = { "10", "개발부", "인천" };
String[] oneRow2 = { "20", "자재부", "대전" };
String[] oneRow22 = { "20", "경영부", "부산" };
String[] oneRow3 = { "30", "영업부", "서울" };
int result1 = vCrud.deptInsert(oneRow);
int result2 = vCrud.deptInsert(oneRow2);
int result3 = vCrud.deptInsert(oneRow3);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
vCrud.deptList();
// 수정 테스트
int result4 = vCrud.deptUpdate(20, oneRow22);
System.out.println(result4);
vCrud.deptList();
// 삭제 테스트
int result5 = vCrud.deptDelete(20);
System.out.println(result5);
vCrud.deptList();
// 상세보기 테스트
String[] result6 = vCrud.deptDetail(10);
for (int i = 0; i < result6.length; i++) {
System.out.print(result6[i] + " ");
}
}
}
package dev_java.week4;
import java.util.Vector;
public class VectorCRUD1_2 {
static Vector<DeptVO> vDept = new Vector<>(); // 내가 만든 코드 -> DeptVO 타입
// 부서 전체 조회
public void deptList() {
System.out.println("부서 정보 전체 조회 호출");
for (int i = 0; i < vDept.size(); i++) {
DeptVO temp = vDept.get(i);
System.out.print(temp.deptNo + " " + temp.deptName + " " + temp.deptLoc);
System.out.println();
}
System.out.println();
}
// 벡터에 부서정보 추가하기-없는 것을 새로 추가
public int deptInsert(DeptVO deptVo) {
System.out.println("부서 정보 입력 호출");
int result = 0; // 1이면 성공, 0이면 실패
boolean isOk = vDept.add(deptVo);
if (isOk) {
result = 1;
}
return result;
}
// 벡터에 부서정보 수정하기-있는 것을 변경
public int deptUpdate(DeptVO deptVo) {
System.out.println("부서 정보 수정 호출");
int result = 0; // 1이면 성공, 0이면 실패
for (int i = 0; i < vDept.size(); i++) {
DeptVO temp = vDept.get(i);
if (deptVo.getDeptNo() == temp.getDeptNo()) {
System.out.println("수정 전=> " + temp.deptNo + " " + temp.deptName + " " + temp.deptLoc);
System.out.println("수정 후=> " + deptVo.deptNo + " " + deptVo.deptName + " " + deptVo.deptLoc);
vDept.set(i, deptVo);
}
}
boolean isOk = vDept.contains(deptVo);
if (isOk) {
result = 1;
}
return result;
}
// 벡터에 부서정보 삭제하기-있는 것을 삭제
public int deptDelete(int deptNo) {
System.out.println("부서 정보 삭제 호출");
int result = 0; // 1이면 성공, 0이면 실패
for (int i = 0; i < vDept.size(); i++) {
DeptVO temp = vDept.get(i);
if (deptNo == temp.getDeptNo()) {
System.out.println("삭제할 부분=> " + temp.deptNo + " " + temp.deptName + " " + temp.deptLoc);
vDept.remove(i);
boolean isOk = vDept.contains(temp);
if (!isOk) {
result = 1;
}
}
}
return result;
}
// 벡터의 부서정보 상세보기-있는 것을 하나 꺼내보기
public void deptDetail(int deptNo) {
System.out.println("부서 정보 상세보기 호출");
for (int i = 0; i < vDept.size(); i++) {
DeptVO temp = vDept.get(i);
if (deptNo == temp.deptNo) {
System.out.print(temp.deptNo + " " + temp.deptName + " " + temp.deptLoc);
}
}
}
public static void main(String[] args) {
VectorCRUD1_2 vCrud = new VectorCRUD1_2();
// 입력 테스트
DeptVO oneRow = new DeptVO(10, "개발부", "인천");
int result = vCrud.deptInsert(oneRow);
System.out.println(result);
oneRow = new DeptVO(20, "총무부", "경기");
result = vCrud.deptInsert(oneRow);
System.out.println(result);
oneRow = new DeptVO(30, "영업부", "서울");
result = vCrud.deptInsert(oneRow);
System.out.println(result);
vCrud.deptList();
// 수정 테스트
oneRow = new DeptVO(20, "자재부", "부산");
int result4 = vCrud.deptUpdate(oneRow);
System.out.println(result4);
vCrud.deptList();
// 삭제 테스트
int result5 = vCrud.deptDelete(10);
System.out.println(result5);
vCrud.deptList();
// 상세보기 테스트
vCrud.deptDetail(20);
}
}