2주차는 월요일은 쉬는 날이어서 화요일이 2주차의 첫 날이었다.
우선 제어자에 대해 정리하는 시간을 가졌다.
제어자에는 크게 접근 제어자와 기타 제어자로 나뉜다.
접근 제어자
- 적용문법
class 선언구 : public 또는 default만 허용
변수, 생성자, 메소드 선언구에는 4가지 다 적용 가능
- 종류 및 용도
public : 동일 클래스, 동일 패키지의 다른 클래스, 다른 패키지의 하위 클래스, 다른 패키지의 클래스
protected : 동일 클래스, 동일 패키지의 다른 클래스, 다른 패키지의 하위 클래스
(default) : 동일 클래스, 동일 패키지의 다른 클래스
private : 동일 클래스
JDK 1.5 부터 표기법이 살짝 바뀜
E - Element
V - Value
T - Type
K - Key
모두는 Object 타입을 의미한다.
list 자료구조
1. Object[] 배열과 흡사
2. Index로 관리
3. 배열과의 차이점
- 클래스로 기능이 제공
- 데이터들을 메소드로 활용
- 배열은 한번 생성된 크키가 변경 불가
- 리스트는 동적으로 메모리 크기 변경
4. 특징 - 객체 타입들만 저장 가능
가령 3이라는 숫자값만 저장하고 싶은 경우 해결책
- 기본값들을 객체처럼 표현 가능하게 해주는 8가지 도우미 클래스 존재
- int : Integer, byte : Byte 등
- wrapper 클래스들 존재(8가지) : 기본 타입을 객체처럼 사용가능하게 서포트 해주는 클래스
5. 주요 API
저장 : add(Object)/활용(반환) : get(int)/삭제 : remove(int)
저장된 데이터 개수 왁인 : size()
6. 다른 관점에서의 리스트
- 속도 관점 : 실행속도 측면에서는 배열보다 더딤(메모리 증가, 데이터 삭제시에 re-index)
2주차의 두번째 날에는 CRUD를 간소하게 나마 구현하는 연습을 했다.
우선 모델은 다음과 같다.
package model.domain;
public class Employee {
private String empno;//사번
private String ename;
private int deptno;
public Employee() {
super();
}
public Employee(String empno, String ename, int deptno) {
super();
this.empno = empno;
this.ename = ename;
this.deptno = deptno;
}
public String getEmpno() {
return empno;
}
public void setEmpno(String empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
@Override
public String toString() {
return "Employee [empno=" + empno + ", ename=" + ename + ", deptno=" + deptno + "]";
}
}
CRUD를 구현한 코드는 아래와 같다.
//CRUD 코드 짜기
package step01.test;
import java.util.ArrayList;
import exception.IdInvalidateException;
import model.domain.Employee;
public class ListTest2 {
private static ArrayList<Employee> al = new ArrayList<>(); // static 붙여야 생성시점이 맞음, static{} 쓰기 때문
static {
al.add(new Employee("11", "smith", 20));
al.add(new Employee("22", "master", 30));
}
public static void create(Employee newEmp) throws IdInvalidateException{ // 확장성 면에서 이 객체 덩어리로 받는 게 좋음
for(Employee e:al) {
if(e.getEmpno().equals(newEmp.getEmpno())) { //AL에 이미 존재할 경우
throw new IdInvalidateException("사번이 중복 되었습니다.");//메소드 자체가 종료
}
}
al.add(newEmp);
}
public static Employee read(String empno) {
//Employee emp = null; //로컬 변수들은 선언시 기본값으로 초기화 권장
for(Employee e:al) {
if(e.getEmpno().equals(empno)) {
return e;
}
}
return null;
}
public static boolean update(String empno, int newDept) {
for(Employee e:al) {
if(e.getEmpno().equals(empno)) {
e.setDeptno(newDept);
return true;
}
}
return false;
}
public static boolean delete(String empno) {
for(Employee e:al) {
if(e.getEmpno().equals(empno)) {
return al.remove(e);
}
}
return false;
}
public static void main(String[] args) {
//미존재 하는 사원 저장
try {
create(new Employee("55", "mary", 50));
} catch (IdInvalidateException e1) {
e1.printStackTrace();
}
//존재하는 사원 저장
try {
create(new Employee("11", "mary", 50));
} catch (IdInvalidateException e1) {
e1.printStackTrace();
}
System.out.println(al);
Employee e = read("11");
//null 키워드는 절대 서비스시에 end user(사용자)에게 오픈 불가
if(e != null) {
System.out.println(e);
}
else {
System.out.println("해당 사번의 사원은 미존재");
}
e = read("66"); //없으니까 null
if(e != null) {
System.out.println(e);
}
else {
System.out.println("해당 사번의 사원은 미존재");
}
//부서 번호 수정
String s = "56";
if(update(s,60)) {
System.out.println(read(s));
}
else {
System.out.println("해당 사번의 사원은 미존재");
}
//사원 삭제 후 검색
if(delete(s)) {
System.out.println(al);
}
else {
System.out.println("해당 사번의 사원은 미존재 -> 삭제 불가");
}
}
}
물론 DB와의 연동을 통해 하는 CRUD는 아니었지만, 논리적 조건들에 대해 생각해 보며 코드를 짤 수 있는 시간이었다.
셋째날에는 어제의 코드를 발전시켜서 MVC 모델에 적용해보았다.
나는 핸드폰 정보를 프린트 하는 코드를 작성했다.
StartView.java
package view;
import org.junit.Test;
import controller.PhoneController;
import model.dto.Phone;
public class StartView {
@Test
public void getphone() {
PhoneController.phoneOne("s1");
}
@Test
public void setPhone() {
PhoneController.createPhone(new Phone("a2", "iphone 13 pro max", 149));
}
@Test
public void updatePhonePrice() {
PhoneController.updatePhone("s2", 119);
}
@Test
public void deletePhone() {
PhoneController.deletePhone("a3");
}
// 제일 비싼 핸드폰 찾기
@Test
public void maxPricePhone() {
PhoneController.mostExpensive();
}
}
Phone.java
package model.dto;
public class Phone {
private String id;
private String pName;
private int price;
public Phone() {
super();
}
public Phone(String id, String pName, int price) {
super();
this.id = id;
this.pName = pName;
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Phone [id=" + id + ", pName=" + pName + ", price=" + price + "]";
}
}
PhoneModel.java
/*
* CRUD 기능 자체를 어디에 구현? Model->컨트롤러 or 바로 컨트롤러?
*/
package model;
import java.util.HashMap;
import model.dto.Phone;
public class PhoneModel {
private static HashMap<String, Phone> phones = new HashMap<>();
static {
phones.put("s1", new Phone("s1", "갤럭시 s21", 99));
phones.put("s2", new Phone("s2", "갤럭시 z플립3", 129));
phones.put("a1", new Phone("a1", "iphone 13 pro", 135));
}
public static HashMap<String, Phone> phoneAll() {
return phones;
}
// ? 왜 있는 건지 생각해보기
// public static Phone phone(String id) {
// return phones.get(id);
// }
public static Phone phoneOne(String id) throws Exception {
Phone p = phones.get(id);
if (p == null) {
throw new Exception("해당하는 기종 없음");
} else {
return p;
}
}
public static boolean createPhone(Phone p) {
if (phones.get(p.getId()) == null) {
phones.put(p.getId(), p);
return true;
} else {
return false;
}
}
public static boolean updatePhonePrice(String id, int price) {
if (phones.get(id) != null) {
phones.get(id).setPrice(price);
return true;
} else {
return false;
}
}
public static boolean deletePhone(String id) {
if (phones.get(id) != null) {
phones.remove(id);
return true;
} else {
return false;
}
}
}
PhoneController.java
package controller;
import model.PhoneModel;
import model.dto.Phone;
import view.FailView;
import view.SuccessView;
public class PhoneController {
public static void phoneOne(String id) {
try {
Phone p = PhoneModel.phoneOne(id);
SuccessView.printPhone(p);
} catch (Exception e) {
// e.printStackTrace();
FailView.messageView(e.getMessage());
}
}
public static void createPhone(Phone p) {
if (PhoneModel.createPhone(p)) {
SuccessView.printPhoneAll(PhoneModel.phoneAll());
} else {
FailView.messageView("해당 id 이미 존재");
}
}
public static void updatePhone(String id, int price) {
if (PhoneModel.updatePhonePrice(id, price)) {
SuccessView.printPhoneAll(PhoneModel.phoneAll());
} else {
FailView.messageView("해당하는 기종 없음 - 가격 수정 불가");
}
}
public static void deletePhone(String id) {
if (PhoneModel.deletePhone(id)) {
SuccessView.printPhoneAll(PhoneModel.phoneAll());
} else {
FailView.messageView("해당하는 기종 없음 - 삭제 불가");
}
}
public static void mostExpensive() {
int max = 0;
String name = "";
for (String key : PhoneModel.phoneAll().keySet()) {
int price = PhoneModel.phoneAll().get(key).getPrice();
if (max < price) {
max = price;
name = PhoneModel.phoneAll().get(key).getpName();
}
}
SuccessView.print("제일 비싼 핸드폰 : " + name + "(" + max + "만원)");
}
}
SuccessView.java
package view;
import java.util.HashMap;
import model.dto.Phone;
public class SuccessView {
public static void printPhone(Phone phone) {
System.out.println(phone);
}
public static void printPhoneAll(HashMap<String, Phone> hm) {
System.out.println(hm);
}
public static void print(String s) {
System.out.println(s);
}
}
FailView.java
package view;
public class FailView {
public static void messageView(String message) {
System.out.println("발생된 문제 - " + message);
}
}
둘째주의 마지막 날은 기존 코드 채우기 + 리팩토링 실습과 선배의 깃 활용 특강이 있었다.
약간의 리팩토링을 하면서 느낀 점은 확실히 적절한 자료구조를 사용할 때 구조나 코드가 훨씬 알아보기 좋아진 다는 것이다. 또한 효율성 면에서도 좋고, 예외 처리도 꼼꼼히 해야 강인성이 좋아진다는 것을 다시 한번 느꼈다.
깃 활용 특강은 진짜 유용했다.
이미 프로젝트로 인해 사용하고는 있었지만 체계적으로 배워 사용한 것이 아니고, 그때마다 검색해서 알고 있는 흩어진 지식들이었는데, 그것들이 좀 정리된 시간이었어서 좋았다.
이렇게 2주가 끝났다. 아직 교육은 초반 단계이긴하나, 짧은 시간동안 많은 것을 느끼고 배우고 있다는 점에서 앞으로의 교육도 기대가 된다.
이 초심 잃지 않고 6개월의 교육 무사히 마무리 하여 미래의 나에게 부끄럽지 않은 오늘의 내가 되고자 한다.
'부트캠프수업정리' 카테고리의 다른 글
6주차 정리(2/7~2/11) (0) | 2022.02.14 |
---|---|
5주차 정리(2/3~2/4) (0) | 2022.02.04 |
4주차 정리(1/24~1/28) (0) | 2022.01.28 |
3주차 정리(1/17~1/21) (0) | 2022.01.21 |
1주차 정리(1/3~1/7) (0) | 2022.01.07 |