📢 오늘의 목표 📢
✔️ 알고리즘 특강
✔️ 알고리즘, SQL 문제 풀이
✔️ 데일리 루틴 알고리즘
✔️ 데일리 루틴 SQL
✔️ 프로그래머스 Level 1
✔️ 개인 과제 Level 3 + a
✔️ 점프 투 스프링 부트
✔️ 1장
✔️ 2장
⏱️ 오늘의 일정 ⏱️
9:00 ~ 10:00 - 알고리즘 특강
10:00 ~ 11:30 - 알고리즘, SQL 문제 풀이
11:30 ~ 13:00 - 개인 과제 Level 3 + a
12:30 ~ 14:00 - 점심시간
14:00 ~ 15:00 - 개인 과제 Level 3 + a
15:00 ~ 18:00 - 점프 투 스프링 부트
18:00 ~ 19:00 - 저녁 시간
19:00 ~ 20:00 - 점프 투 스프링 부트
20:00 ~ 21:00 - TIL 작성
📜 Chapter 1. 알고리즘 특강
9:00 ~ 10:30 - 알고리즘 특강
✔️ 알고리즘 특강
오늘 알고리즘 특강은 의사(수도) 코드, big O 표기법에 대해 배웠다.
big O 표기법을 배울 때 항상 궁금했던 것이 있었는데,
예를 들어 여러 개의 for이 적용되어 있어 n + n^2와 같은 복잡도로 이루어져 있으면 어떻게 표기해야 하는가였다.
big O 표기법은 단순화를 목적으로 하는 만큼 영향이 미미한 n은 지워버리고 최고차항만 적용한다고 한다.
n + n^2는 O(n^2)가 되는 것!
간단하지만 알고리즘 풀이에 도움이 되는 내용들로 이루어진 좋은 강의였다.
사실 금요일 아침이라 그런지 피곤이 누적되어... 복잡했으면 머리에 안 들어왔을 수도...
📜 Chapter 2. 알고리즘, SQL 문제 풀이
10:00 ~ 11:30 - 알고리즘, SQL 문제 풀이
✔️ 알고리즘, SQL 문제 풀이
✔️ 데일리 루틴 알고리즘
✔️ 데일리 루틴 SQL
✔️ 프로그래머스 Level 1
✔️ 데일리 루틴 알고리즘
숫자 비교하기
class Solution {
public int solution(int num1, int num2) {
int answer = 0;
if(num1 == num2)
answer = 1;
else
answer = -1;
return answer;
}
}
CodingTest_AutoSave/프로그래머스/0/120807. 숫자 비교하기 at main · MetroDefro/CodingTest_AutoSave
모든 코딩 테스트 자동 저장. Contribute to MetroDefro/CodingTest_AutoSave development by creating an account on GitHub.
github.com
✔️ 데일리 루틴 SQL
동물 수 구하기
SELECT COUNT(*)
FROM ANIMAL_INS
CodingTest_AutoSave/프로그래머스/2/59406. 동물 수 구하기 at main · MetroDefro/CodingTest_AutoSave
모든 코딩 테스트 자동 저장. Contribute to MetroDefro/CodingTest_AutoSave development by creating an account on GitHub.
github.com
✔️ 프로그래머스 Level 1
[PCCP 기출문제] 1번 / 붕대 감기
해당 문제는 아래의 포스팅에 자세하게 정리하였다.
https://mountain-noroo.tistory.com/129
[프로그래머스][Java] [PCCP 기출문제] 1번 / 붕대 감기 - level 1
문제 보기 https://school.programmers.co.kr/learn/courses/30/lessons/250137 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁
mountain-noroo.tistory.com
[PCCP 기출문제] 1번 / 이웃한 칸
해당 문제는 아래의 포스팅에 자세하게 정리하였다.
https://mountain-noroo.tistory.com/130
[프로그래머스][Java] [PCCE 기출문제] 9번 / 이웃한 칸 - level 1
문제 보기 https://school.programmers.co.kr/learn/courses/30/lessons/250125 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁
mountain-noroo.tistory.com
📜 Chapter 3. 개인 과제 Level3 + a
11:30 ~ 13:00 - 개인 과제 Level 3 + a
14:00 ~ 15:00 - 개인 과제 Level 3 + a
✔️ 개인 과제 Level 3 + a
enum 기능이 뭐 이리 많지? java의 enum은 내가 알던 enum이 아니다.
그래서 enum에 대해 학습하는 데 시간이 꽤 걸렸다.
내가 참고한 포스팅들은 아래와 같고, 전부 좋은 글이니 읽어보며 공부해 보자.
https://www.tcpschool.com/java/java_api_enum
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
☕ 자바 Enum 열거형 타입 문법 & 응용 💯 정리
Enum 열거 타입 먼저 Enum은 "Enumeration"의 약자다. Enumeration은 "열거, 목록, 일람표" 라는 뜻을 가지고 있으며, 보통 한글로는 열거형이라고 부른다. 즉, 열거형(enum)은 요소, 멤버라 불리는 명명된 값
inpa.tistory.com
https://duzi077.tistory.com/234
[Effective Java 규칙30] int 상수 대신 enum을 사용하라
[Effective Java 규칙30] int 상수 대신 enum을 사용하라Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 자바 1.5에서 enum 이라는 새로운 참조 자료형이 추가되었
duzi077.tistory.com
⬇️ 과제 보기 ⬇️
✔️ 1번
public class ArithmeticCalculator extends Calculator {
// 사용할 오버라이딩 메서드는 public으로 변경
@Override
public double calculate(int firstNumber, int secondNumber, char operator) throws InputErrorException {
double result = 0;
// 기존에는 switch 문을 사용했지만 상수값이 아니라 OperatorType.getSignal()로 char값을 얻어올 것이기 때문에
// if 문으로 수정하였습니다.
if(operator == OperatorType.ADD.getSignal()) { // enum 값에 매핑된 char 값과 대조한다.
result = OperatorType.ADD.operate(firstNumber, secondNumber); // enum 값에서 operate 호출. 반환값은 result에 저장된다.
}
else if(operator == OperatorType.SUB.getSignal()) {
result = OperatorType.SUB.operate(firstNumber, secondNumber);
}
else if(operator == OperatorType.MUL.getSignal()) {
result = OperatorType.MUL.operate(firstNumber, secondNumber);
}
else if(operator == OperatorType.DIV.getSignal()) {
if(secondNumber == 0) // 분모가 0일 경우 exception 발생!
throw new InputErrorException("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다."); // exception 만들어 던짐
else
result = OperatorType.DIV.operate(firstNumber, secondNumber);
} else if(operator == OperatorType.MOD.getSignal()) {
result = OperatorType.MOD.operate(firstNumber, secondNumber);
}
return result;
}
// 사용하지 않는 오버라이딩 메서드는 protected로 밖에서 접근 불가능하게 하였다
@Override
protected double calculate(int radius) {
return 0;
}
}
// 1. 현재 사칙연산 계산기는 +, -, *, /, % 이렇게 총 5가지 연산 타입으로 구성되어있습니다.
public enum OperatorType { // 연산 타입을 나타내는 enum
ADD('+') { // char와 매핑해 주고 확장 메서드를 사용합니다
public double operate(int a, int b) {
return addOperator.operate(a, b); // 그대로 클래스의 operate를 호출합니다.
}
},
SUB('-') {
public double operate(int a, int b) {
return substractOperator.operate(a, b);
}
},
MUL('*') {
public double operate(int a, int b) {
return multiplyOperator.operate(a, b);
}
},
DIV('/') {
public double operate(int a, int b) {
return divideOperator.operate(a, b);
}
},
MOD('%') {
public double operate(int a, int b) {
return modOperator.operate(a, b);
}
};
// 사칙연산 인스턴트은 enum에 생성한다.
// 즉 ArithmeticCalculator는 이 클래스를 알 필요가 없다.
// enum은 처음에 한 번 생성되고 유지된다. (싱글턴)
// 그래서 final static으로 하지 않으면 나중에 변경 가능성이 생기기 때문인지 오류가 발생했습니다.
private final static AddOperator addOperator = new AddOperator();;
private final static SubstractOperator substractOperator = new SubstractOperator();
private final static MultiplyOperator multiplyOperator = new MultiplyOperator();
private final static DivideOperator divideOperator = new DivideOperator();
private final static ModOperator modOperator = new ModOperator();
private final char signal; // 연산 기호를 매핑하기 위한 char signal
OperatorType(char signal) {
this.signal = signal; // 매핑 진행
}
public char getSignal() {
return signal; // enum의 char 값을 얻기 위함
}
public abstract double operate(int a, int b); // 추상 클래스. 그대로 operator의 operate 메서드를 반환할 예정이라 똑같은 형태.
}
✔️ 2번
public class App {
public static void main(String[] args) {
// ...
do { // 첫번째는 무조건 실행.
System.out.println("계산기 옵션(번호 입력): 1. 사칙연산, 2. 원의 너비 구하기"); // 사칙연산 원의 너비 중 선택하도록 제시
switch (sc.nextInt()) { // 입력 받은 값에 따라 두 갈래로 나뉜다.
case 1: // 사칙 연산 로직
try {
// double, int 중 선택하도록 제시
System.out.print("계산 할 타입을 선택해주세요(번호 입력): 1. 정수, 2. 실수 ");
int type = sc.nextInt(); // 무슨 타입인지 받는다
double result = 0; // result를 if 문 밖으로 뺐다.
if(type == 1) { // 정수 선택
System.out.print("첫 번째 숫자를 입력하세요: ");
int firstNumber = sc.nextInt(); // int를 입력 받는다.
System.out.print("두 번째 숫자를 입력하세요: ");
int secondNumber = sc.nextInt(); // int를 입력 받는다.
System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.next().charAt(0); // 입력 받은 string의 인덱스 0번 char을 가져온다.
result = arithmeticCalculator.calculate(firstNumber, secondNumber, operator);
}
else if(type == 2) { // 실수 선택
System.out.print("첫 번째 숫자를 입력하세요: ");
double firstNumber = sc.nextDouble(); // double 입력 받는다.
System.out.print("두 번째 숫자를 입력하세요: ");
double secondNumber = sc.nextDouble(); // double 입력 받는다.
System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.next().charAt(0); // 입력 받은 string의 인덱스 0번 char을 가져온다.
result = arithmeticCalculator.calculate(firstNumber, secondNumber, operator);
} else { // 이상한 값이 들어왔을 경우
System.out.println("잘못된 값이 입력되었습니다. 처음으로 돌아갑니다.");
continue; // 반복문 처음부터 다시 시작
}
// ...
} catch (InputErrorException e) {
System.out.println(e.getMessage()); // 예외 발생시 로그 출력
}
break;
case 2: // 원의 너비 구하기 로직
// ...
default: // 1, 2가 아닌 값이 들어왔을 경우
System.out.println("잘못된 값이 입력되었습니다. 처음으로 돌아갑니다.");
continue; // 반복문 처음부터 다시 시작
}
} while (!isEnd);
}
}
public abstract class Calculator {
// ...
// Integer, Double 모두 Number를 상속받기 때문에 Number와 그 자식 클래스로 한정지었다.
// 반환값은 Double로 저장하고 있기 때문에 전부 T가 아니라 double이다.
protected abstract <T extends Number> double calculate(T firstNumber, T secondNumber, char operator) throws InputErrorException;
// ...
}
public class ArithmeticCalculator extends Calculator {
// 2. 지금까지는 ArithmeticCalculator, 즉 사칙연산 계산기는 양의 정수(0 포함)를 매개변수로 전달받아 연산을 수행했습니다.
@Override
public <T extends Number> double calculate(T firstNumber, T secondNumber, char operator) throws InputErrorException {
// ...
}
// ...
}
public class CircleCalculator extends Calculator {
private static final double PI = 3.14; // 절대 변할 일 없는 필드이기 때문에 static final 활용
@Override
protected <T extends Number> double calculate(T firstNumber, T secondNumber, char operator) throws InputErrorException {
return 0;
}
// ...
}
public abstract class Operator {
public abstract <T extends Number> double operate(T firstNumber, T secondNumber);
}
public class AddOperator extends Operator {
@Override
public <T extends Number> double operate(T firstNumber, T secondNumber) { // 더하기 기능을 하는 메서드 구현
if(firstNumber.getClass() == Double.class) // 리플렉션을 사용해 제너럴 타입을 재분석하여 Double, Integer 따로 계산하였다.
return firstNumber.doubleValue() + secondNumber.doubleValue(); // Double이 들어왔을 경우
else
return firstNumber.intValue() + secondNumber.intValue(); // Integer가 들어왔을 경우
}
}
// 다른 오퍼레이터들 생략...
public enum OperatorType { // 연산 타입을 나타내는 enum
ADD('+') { // char와 매핑해 주고 확장 메서드를 사용합니다
public <T extends Number> double operate(T a, T b) {
return addOperator.operate(a, b); // 그대로 클래스의 operate를 호출합니다.
}
},
SUB('-') {
public <T extends Number> double operate(T a, T b) {
return substractOperator.operate(a, b);
}
},
MUL('*') {
public <T extends Number> double operate(T a, T b) {
return multiplyOperator.operate(a, b);
}
},
DIV('/') {
public <T extends Number> double operate(T a, T b) {
return divideOperator.operate(a, b);
}
},
MOD('%') {
public <T extends Number> double operate(T a, T b) {
return modOperator.operate(a, b);
}
};
// ...
public abstract <T extends Number> double operate(T a, T b); // 추상 클래스. 그대로 operator의 operate 메서드를 반환할 예정이라 똑같은 형태.
}
✔️ 3번
public class App {
public static void main(String[] args) {
// ...
System.out.println("입력 값보다 더 큰 값을 조회하겠습니다. 기준 숫자를 입력하세요.");
double standardNumber = sc.nextDouble();
arithmeticCalculator.inquiryBigger(standardNumber); // 결과 조회
// ...
}
}
public class ArithmeticCalculator extends Calculator {
// ...
// 3. 저장된 연산 결과들 중 Scanner로 입력받은 값보다 큰 결과 값 들을 출력하고 싶습니다.
public void inquiryBigger(double number) {
// 람다, 스트림 적용.
List<Double> biggerResults = results.stream().filter(o -> o > number).toList(); // 필터로 더 큰 숫자들만 뽑아 list화
for(double element : biggerResults ) { // foreach 문 사용하여 results linkedlist 순회
System.out.print(element + " "); // 출력하고 한 칸 띄기
}
System.out.println(); // 구분을 위한 한 줄 내리기
}
}
일단 할 건 다 하긴 했는데 썩 마음에 들진 않는다.
오늘은 이쯤 하고 다음 주 월요일에 마지막으로 리팩토링 작업을 거치고 제출해야겠다.
어차피 지금 제출 방법도 안 나와있다.
역시 이상한 값을 입력했을 때 예외 처리가 거의 없는 것이 신경 쓰인다.
📜 Chapter 3. 점프 투 스프링 부트
15:00 ~ 18:00 - 점프 투 스프링 부트
19:00 ~ 20:00 - 점프 투 스프링 부트
✔️ 점프 투 스프링 부트
✔️ 1장
✔️ 2장
✔️ 공부 방법
처음부터 끝까지 가볍게 따라 해보고 넘어갈 것이다.
즉 하나하나 파고들며 정리하지는 않겠다는 뜻.
대신 중요해보이는 키워드들을 정리하여 내가 제대로 스프링 공부를 시작할 때 찾아보도록 유도할 것.
✔️ 1장 스프링부트 개발 준비하기
인텔리제이가 아닌 이클립스 기준으로 되어있다는 의외의 문제가 발생했다.
부록에 인텔리제이를 사용할 경우 방법이 나와있긴 하지만 커뮤니티 버전 기준으로 작성되어있기도 하고 책 전체가 결국 이클립스에 맞춰져 있기 때문에 이 기능 인텔리제이에서는 어떻게 사용해야 하지? 하고 자꾸 헷갈린다.
아마 세팅하는 챕터라서 더 그런 듯하다.
키워드 lombok(롬복)
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Getter
public class HelloLombok {
private final String hello;
private final int lombok;
public static void main(String[] args) {
HelloLombok helloLombok = new HelloLombok("헬로", 5);
System.out.println(helloLombok.getHello());
System.out.println(helloLombok.getLombok());
}
}
생성자, 게터, 세터를 자동으로 만들어준다.
✔️ 2장 스프링 부트의 기본 기능 익히기
키워드 H2
자바로 만들어진 DBMS로 개발 도중 테스트 하기 위해 자주 사용.
IO Exception이 떠서 아래 글을 따라 다시 생성했더니 됐다.
https://www.inflearn.com/questions/271461/io-exception-null-90028-200-90028-90028-%EC%98%A4%EB%A5%98
IO Exception: null [90028-200] 90028/90028 오류 - 인프런
jpashop.mv.db파일이 생성되지 않고 , IO Exception: null [90028-200] 90028/90028 가 뜨는데 제가 이전 수업에서 사용했던 test.mv.db파일이 있어서 jpashop.mv.db파일이 생성이 안되는건지 모르겠습니다. 도움주시면
www.inflearn.com
application.properties
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
SQL을 미리 공부한 덕분에 엔티티에 대해서는 이해가 정말 빨랐다.
키워드 JPA
키워드 JUnit
- JUnit은 테스트 코드를 작성하고, 작성한 테스트 코드를 실행할 때 사용하는 자바의 테스트 프레임워크이다. 사실 JUnit은 리포지터리뿐만 아니라 소프트웨어 개발 시 테스트 작업을 수행할 때 많이 사용한다.
키워드 DI
@Autowired 애너테이션
스프링의 의존성 주입(DI, Dependency Injection)이란 스프링이 객체를 대신 생성하여 주입하는 기법을 말한다.
뻘짓 of 뻘짓
대체 어쩌다가 이런 테이블이 만들어졌냐... 하면
Junit Test를 돌리고 DB에서 잘 조회되는지 보려고 했는데 되지가 않았다.
그래서 일단 넘어가고 다음 테스트부터 해보려니 1이 안 됐는데 2가 될 리가 없다!
그래서 이유가 뭐였냐? 하면 그냥 로컬 서버를 안 켜놨던 것 ㅋㅋ
난 test를 돌리면 서버도 같이 켜지는 줄 알고... 왜 DB에서 조회가 안 될까... 코드에 문제가 있나 이러고 있었던 것이다...
오늘 안에 알아내서 다행이라고 할지 진짜 서버 켜고 저 타임스탬프들을 보니 헛웃음이 나오더라...ㅋ.................
🌙 오늘을 마치며 🌙
금요일이 되니 너무 피곤해서 오늘은 쉬엄쉬엄 했다.
내일부터 주말이지만 제사가 있어서 쉬지 못하는 이유도 있다.
앞으로의 여정도 많이 남았기 때문에 페이스대로 가도록 하자.
아무튼 고생했다.
'공부 기록 > 내배캠Java_5기' 카테고리의 다른 글
[내배캠][TIL] 12일 차 - 화요일, 빡세게 공부한 날 (1) | 2024.04.30 |
---|---|
[내배캠][TIL] 11일 차 - 월요일, 쉬면서 하자. (0) | 2024.04.29 |
[내배캠][TIL] 9일 차 - 목요일, 알고리즘 문제 풀이 시작과 개인 과제 (1) | 2024.04.25 |
[내배캠][TIL] 8일 차 - 수요일, 자바 강의 끝! (1) | 2024.04.24 |
[내배캠][TIL] 7일 차 - 화요일, 자바 문법 강의 뽀개기 (0) | 2024.04.23 |