🍎 How's the 14th day going?
오늘.....도 까였다... 까이면서 배우는 즐거..운 코딩 교실. 객체화 어제 고찰 많이 했는데 역시 어제 걱정하던 문제에 대해서 너무나도 당연하게 지적 당했다. 스태틱으로 클래스에 직접 전근할 경우 스파게티 코드가 되서. 문제가 있는 건 알았는데 그 부분이 동시에 접근할 수 있는 경우 때문인 건 잘 몰랐는데 새롭게 배웠다. 그리고 뭔가 저장소에 데이터를 넘겨주는 문제를 고민헀었는데 그게 잘 해결이 안되서 스태틱을 사용했는데,.. 매개변수로 넘겨 준다는 개념도 새로웠다. 하지만.. 너무 번거로우니.. 싱글톤으로 만들어서 설정해야겠다.객체화에 대한 고찰이 오늘도 필요할 거 같다.

🍊코드카타 목록
- 가격이 제일 비싼 식품의 정보 출력하기
- 흉부외과 또는 일반외과 의사 목록 출력하기
- DATETIME에서 DATE로 형 변환
-
소수 만들기 소
-
모의고사
-
과일 장수가겨
💡오늘 정리 목록
- SQL 데이터 서식
- 싱글톤(Sigleton) 패턴을 구현하는 6가지 방법
- 객체화에 대한 고찰2
🚩오늘의 회고
1. 코드카타
1) 가격이 제일 비싼 식품의 정보 출력하기
- sql 문제 / 난이도 하
- order by와 limit에 대한 문제
- 아직 초반이라 문제가 계속 쉽다
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1
2) 흉부외가 또는 일반외가 의사 목록 출력하기
- SQL문제 / 난이도 하
- where, or , ORDER BY 문제
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC
3) DATETIME에서 DATE로 형 변환
- SQL문제 / 난이도 중하
- DATE_FORMAT에 대한 문제
- 처음 써본 거라서 배우는 재미가 있었다
SELECT ANIMAL_ID, NAME,
DATE_FORMAT(DATETIME,'%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
4) 소수 만들기
- 어떤 알고리즘이라고 표현해야 할지 모르곘다
- 수의 범위가 1000으로 제약되있어서 3000까지 소수를 미리 만들어주고 매개변수는 있는지 여부만 체크했다
- 뭐 나쁘지 않게 풀었던 거 같다
- 하지만 소수 관련은 몇번 해봐서... 첨에는 어려웠는데 이제는 좀 쉽게쉽게 사실 프로그래머스가 시간이 넉넉해서 쉬운듯
import java.util.*;
class Solution {
public int solution(int[] nums) {
int answer = 0;
List<Integer> sosu = makeSosu();
for(int i=0;i<nums.length-2;i++){
for(int j=i+1;j<nums.length-1;j++){
for(int k=j+1;k< nums.length;k++ ) {
int sum=nums[i]+nums[j]+nums[k];
if(sosu.contains(sum)) answer++;
}
}
}
return answer;
}
public static List<Integer> makeSosu(){
boolean[] visited = new boolean[3000];
visited[0]=visited[1]=true;
for(int i=2;i<3000;i++){
if(!visited[i]){
for(int j=i+i;j<3000;j+=i){
visited[j]=true;
}
}
}
List<Integer> sosu = new ArrayList<>();
for(int i=2;i<3000;i++){
if(!visited[i])sosu.add(i);
}
return sosu;
}
}
5) 모의고사
- 그냥 브루트포스 알고리즘 문제
- 이거 언젠가.. 풀었던 문제였다.
- 다시 새롭게 풀어 봤는데 자잘한 부분에서 실수가 많았다
- 내 문제점 중 하나인데 너무 알고리즘 설계 없이 느낌대로 푸는 거 같다.(주의!)
import java.util.*;
import java.util.stream.Collectors;
import static java.util.Collections.sort;
class Solution {
public int[] solution(int[] answers) {
int[] cnt = {0,0,0};
int [] supo1= {1,2,3,4,5};
int[] supo2={2,1,2,3,2,4,2,5};
int[] supo3={3,3,1,1,2,2,4,4,5,5};
for(int i=0;i<answers.length;i++){
if(answers[i]==supo1[i%5]) cnt[0]++;
if(answers[i]==supo2[i%supo2.length]) cnt[1]++;
if(answers[i]==supo3[i%supo3.length]) cnt[2]++;
}
List<Integer> answer = new ArrayList<>();
int m=0;
for(int i: cnt){
if(m<i) m=i;
}for(int i=0; i<3; i++) if(m==cnt[i]) answer.add(i+1);
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
6) 과일장수
- 정렬 관련된 문제 그냥 정렬해서 역순으로 가져오는 방식을 취했다.
- 아직까진 별 막힘 없이 풀어서.. 뭐 그냥 그렇다.
import java.util.*;
class Solution {
public int solution(int k, int m, int[] score) {
int answer = 0;
Arrays.sort(score);
for(int i=score.length-m;i>=0;i-=m){
answer+=score[i]*m;
}
return answer;
}
}
오늘의 정리 목록
1. SQL 데이터 서식
1) 데이터 타입 변경
SQL에서는 다양한 데이터 타입을 지원합니다. 기본적으로 많이 쓰는ㄴ INT, CHAR 등등 다양한 데이터의 서식을 변경하기 위해 데이터 타입을 변경할 수 있습니다. 가장 일반적인 데이터 타입 변경 방법은 "CAST" 또는 "CONVERT" 함수를 사용하는 것입니다. 이 함수들은 데이터 타입을 다른 데이터 타입으로 변환할 수 있게 해줍니다. 예를 들어, "CAST(column_name AS new_data_type)"와 같이 사용할 수 있습니다.
SELECT CAST(date_column AS VARCHAR) AS formatted_date FROM table_name;
-- 결과: 날짜 데이터가 문자열로 변환됨
2) 데이터 문자열 포맷 변경
SQL에서는 문자열을 원하는 형태로 포맷할 수 있는 다양한 함수를 제공합니다. 가장 일반적인 함수로는 "CONCAT", "SUBSTRING", "REPLACE" 등이 있습니다.
- "CONCAT" 함수는 문자열을 연결하는데 사용 여러 개의 열이나 문자열을 합쳐 하나의 문자열로 만들 수 있습니다.
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM table_name;
-- 결과 : first_name = 홍, last_name = 길동 > 홍 길동
- "SUBSTRING" 함수는 문자열의 일부분을 추출합니다. 시작 인덱스와 길이를 지정하여 문자열을 잘라낼 수 있습니다.
SELECT SUBSTRING(id_num, 1, 6) AS birth_date FROM table_name;
- "REPLACE" 함수는 문자열 내의 특정 부분을 다른 문자열로 대체할 수 있습니다.
SELECT REPLACE(phone_num, '-', '') AS formatted_phone_num FROM table_name;
3. 날짜 및 시간 포맷 변경
SQL에서는 날짜와 시간을 원하는 서식으로 변환하는 기능을 제공합니다. 가장 일반적으로 사용되는 함수로는 "DATE_FORMAT"이 있습니다. 이 함수는 날짜 및 시간 값의 서식을 지정하여 반환합니다.
SELECT DATE_FORMAT(date_column, '%Y-%m-%d') AS formatted_date FROM table_name;
4. NULL 값 처리
NULL 값은 데이터에 누락된 값이나 알 수 없는 값으로 사용됩니다. 데이터의 표현 방식을 변경하거나 특정 값을 출력할 때, NULL 값에 대한 처리가 필요할 수 있습니다. SQL에서는 "IS NULL"이나 "IS NOT NULL"과 같은 연산자를 사용하여 NULL 값 처리를 할 수 있습니다.
SELECT DATE_FORMAT(date_column, '%Y-%m-%d') AS formatted_date FROM table_name;
2. 싱글톤(Sigleton) 패턴을 구현하는 6가지 방법
- 데이터 저장소 클래스 매개변수로 전달해주면 너무 불편할 거 같아서 싱글톤을 구현하는 방식을 떠올렸다.
- 근데 구현하려고 보니 싱글톤을 다양하게 구현 하는 방식이 있어서 정리한다.
싱글톤 정의
- 싱글톤 패턴은 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 다음은 여러 가지 싱글톤 생성 방법 중 6가지 방법을 정리
1. Eager Initialization (이른 초기화):
- 클래스 로딩 시점에 인스턴스를 미리 생성합니다.
- 장점: 스레드 안전성이 보장됩니다.
- 단점: 애플리케이션이 시작될 때 인스턴스가 생성되므로 메모리를 미리 차지하게 됩니다.
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
2. Lazy Initialization (늦은 초기화):
- 인스턴스가 필요한 시점에 생성합니다.
- 장점: 메모리를 절약할 수 있습니다.
- 단점: 다중 스레드 환경에서 동시 접근 문제가 발생할 수 있습니다
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
3. Thread-Safe Lazy Initialization (스레드 안전한 늦은 초기화):
- 이중 검사 락(Double-Checked Locking)을 사용하여 동시 접근 문제를 해결합니다.
- 장점: Lazy Initialization의 성능 문제를 해결할 수 있습니다.
public class ThreadSafeLazySingleton {
private static volatile ThreadSafeLazySingleton instance;
private ThreadSafeLazySingleton() {}
public static ThreadSafeLazySingleton getInstance() {
if (instance == null) {
synchronized (ThreadSafeLazySingleton.class) {
if (instance == null) {
instance = new ThreadSafeLazySingleton();
}
}
}
return instance;
}
}
4. Enum Singleton (열거형 싱글톤):
- 열거형(enum)을 사용하여 싱글톤을 구현합니다.
- 장점: 스레드 안전하며 직렬화에 대한 문제를 해결합니다.
public enum EnumSingleton {
INSTANCE;
public static EnumSingleton getInstance() {
return INSTANCE;
}
}
5. Initialization on Demand Holder (홀더 초기화):
- 내부 정적 클래스에 인스턴스를 생성합니다.
- 장점: 스레드 안전하며 Lazy Initialization의 성능 문제를 해결합니다.
public class HolderSingleton {
private HolderSingleton() {}
private static class SingletonHolder {
private static final HolderSingleton INSTANCE = new HolderSingleton();
}
public static HolderSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
6. Bill Pugh Singleton:
- 내부 정적 클래스를 사용하여 Lazy Initialization을 구현합니다.
- 장점: 스레드 안전하며 Lazy Initialization의 성능 문제를 해결합니다.
public class BillPughSingleton {
private BillPughSingleton() {}
private static class SingletonHelper {
private static final BillPughSingleton INSTANCE = new BillPughSingleton();
}
public static BillPughSingleton getInstance() {
return SingletonHelper.INSTANCE;
}
}
객체화에 대한 고찰2
오늘도 객체화에 대해서 생각 많이 해보는 시간이 었다. 객체화 어렵다. 그래도 일단 가장 기본적인건 독립적으로 구성되어 있어야 한다는 것, 이번에 만든건 너무 서로 간의 접근이 직접적인 문제가 있다.
통합하는 클래스를 만들고 수정하고, 저장소는 많이 접근할 수 밖에 없는 구조라서 무난하게 싱글톤으로 해결해야겠다.
그리고 디스플레이 뷰가 문제인데.. 이것도 큰 디스플레이 하나 만들어서 거기서 생성해오는 걸로 하고 메소드 호출은 함수 호출 전달 문제를 좀 고민해 봐야겠다.
🚩오늘의 회고
오늘은 그래도 어제보다는 좀 더 정진할 수 있는 날이었다. 일단 목표했던 코드카타 각각 3문제 씩 푼게 좋았다. 물론 아직 초반이라서 쉬워서 그런 부분도 있겠지만 좀 미리미리 해서 다시 백준 플레틴넘 목표로 좀 수준을 높여야 겠다.
5월 끝나기 전에는 최대한 알고리즘 부분은 백준 플래틴넘 목표로 하고 스프링 숙련도랑 자바의 다양한 클래스와 객체화 이해에 집중해야 겠다.
참고 사이트
https://gr-st-dev.tistory.com/627?category=1179035
[SQL] SQL 데이터 서식에 대해 알아보자, 원하는 형태로 데이터 포맷을 바꾸는 방법
SQL 데이터 서식에 대해 알아보자: 원하는 형태로 데이터 포맷을 바꾸는 방법 서문 SQL은 데이터베이스 관리 시스템에서 데이터를 조작하는 데 사용되는 언어입니다. 데이터를 삽입, 업데이트, 조
gr-st-dev.tistory.com
https://readystory.tistory.com/116
[생성 패턴] 싱글톤(Singleton) 패턴을 구현하는 6가지 방법
첫 번째로 소개할 디자인 패턴은 싱글톤(Singleton) 패턴입니다. 종종 싱글톤 패턴을 '단일체' 패턴으로 번역하고 있는 책도 있지만, 일반적으로 싱글톤 패턴이라고 부릅니다. 싱글톤 패턴은 객체
readystory.tistory.com