국비학원/수업기록

국비 지원 개발자 과정_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);
  }
}