부트캠프수업정리

2주차 정리(1/11~1/14)

파뱁 2022. 1. 14. 21:12
728x90

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개월의 교육 무사히 마무리 하여 미래의 나에게 부끄럽지 않은 오늘의 내가 되고자 한다.

728x90
반응형

'부트캠프수업정리' 카테고리의 다른 글

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