JAVA 16

Jakarta Mail(JavaMail) API

구글 계정 설정- 계정 > 보안 > 2단계 인증 사용설정- 보안 > 앱비밀번호 > 원하는 앱 이름 입력 = 앱비밀번호 생성- Gmail > 라벨 관리 > 전달 및 POP/MAP : POP 사용 / IMAP 사용 체크 후 저장pom.xml 의존성 추가 org.springframework.boot spring-boot-starter-mail설정 추가 - properties 파일의 경우 spring.mail.default-encoding=UTF-8 spring.mail.host=smtp.gmail.comspring.mail.port=587spring.mail.username=구글계정spring.mail.password=앱 비밀번호spring.mail.properties.mail.smtp.startt..

JAVA 2025.02.11

Map.Entry와 Map.getKey 차이

일반적인 Map 사용char[] input = "bbbaa".toUpperCase().toCharArray();Map map = new HashMap();for (Character c : input) { int cnt = 0; for (char i : input) { if(c == i) cnt++; } map.put(c, cnt);} map.entry 를 사용하지 않을 때 keySet을 반복하고, Map.get으로 해당 값을 얻는다.for (Character c : map.keySet()) { System.out.println("c = " + c + "=" + map.get(c));} 결과c = A=3 c = B=2map.entry 를 사용하였을 때 key-valu..

JAVA 2024.12.29

중첩 클래스

중첩 클래스 종류정적 중첩 클래스 : 정적 중첩 클래스는 바깥 클래스의 안에 있지만 바깥 클래스와 관계 없는 전혀 다른 클래스내부 클래스 : 바깥 클래스의 내부에 있으면서 바깥 클래스의 인스턴스에 소속되는 클래스내부 클래스 : 바깥 클래스의 인스턴스 멤버에 접근지역 클래스 : 내부 클래스 특징 + 지역 변수에 접근익명 클래스 : 지역 클래스 특징 + 클래스 이름이 없음 사용하는 이유논리적 그룹화 : 특정 클래스가 다른 클래스 안에서만 사용되는 경우(다른 곳에서 사용될 필요가 없을 때)캡슐화 : 중첩 클래스는 바깥 클래스의 private 멤버에 접근이 가능, 바깥 클래스와의 긴밀하게 연결하고 불필요한 public 삭제 정적 중첩 클래스public class NestedOuter { private st..

JAVA 2024.12.22

동시성 문제와 동기화(synchronized)

동시성 문제두개 이상의 스레드가 공유자원을 여러 단계로 나누어 이용할 때 동시성 문제가 일어난다.   '잔액'이라는 공유자원을 사용하고 로직을 (1)잔액 확인 (2)잔액 출금 으로 나누어져있을 때  [한 번에 여러개의 스레드 실행할 경우]    한 스레드가 공유자원인 잔액의 값을 (2)출금 로직에서 변경했을 때    다른 스레드에서는 '잔액'을 처음으로 설정한 값을 기준으로(변경되지 않은 값을 기준으로) 검증을 하면 원치 않는 결과 초래 15:38:50.830 [ t2] 거래 시작 : BankAccountV115:38:50.830 [ t1] 거래 시작 : BankAccountV115:38:50.840 [ t1] [검증 시작] 출금액 : 800, 잔액 : 100015:38:..

JAVA 2024.11.24

멀티스레드 메모리 접근 방식/메모리 가시성/happens-before

실제 메모리의 접근 방식 각 CPU마다 캐시 메모리라는 것을 사용한다, 메인 메모리는 CPU입장에서 거리도 멀고, 속도도 상대적 느리다. 해당 캐시 메모리는 CPU의 빠른 연산을 위해 CPU와 가까이 붙어있고, 속도도 빠른 메모리이다. 보통 코어 단위로 캐시 메모리를 각각 보유하고있다.volatile을 사용하지 않을 경우 메인 메모리(힙 영역)에 있는 변수의 값을 각 캐시 메모리에서 불러오고, 그 이후 캐시 메모리에 있는 변수의 값을 사용하게 된다. 멀티스레드 환경에서 volatile 없이 변수의 값을 변경하는 경우 main 스레드에서 runFlag 변수의 값을 true 에서 false로 바꾸는 경우,메인메모리와 work스레드를 연산하는 CPU가 사용하는 캐시 메모리에 바로 반영이 되지 않는다.그러므로,..

JAVA 2024.11.21

스레드와 Yield

여러 스레드가 동시에 접근하는 경우 동시성 컬렉션{ java.util.concurrent 패키지} 및 동시성 변수 volatile을 사용하는 것이 안전하다.  ConcurrentLinkedQueue : QUEUE 상속, concuurent 패키지 / 여러 스레드에 의해 자료구조가 수정될 수 있음volatile : 동시에 실행되는 여러 스레드에 의해 필드가 수정될 수 있음을 나타냄package thread.control.printer;import java.util.Queue;import java.util.Scanner;import java.util.concurrent.ConcurrentLinkedQueue;import static util.MyLogger.log;import static util.Threa..

JAVA 2024.11.18

스레드 인터럽트

1. InterruptInterrupt - 1. 인터럽트를 사용하지 말고, 무한루프 스레드의 작업을 중단시키는 방법  아래  work 스레드를 중단하는데에 가장 쉬운 방법은 work스레드 작업에 변수를 지정하고,실행하는 메인 스레드에서 그 변수를 조작하는 것이다 [ while(true) -> while(false) ]그런데, 이런 방법은 sleep으로 초를 맞춰서 중단시키는거라,특정스레드가 끝나자마자 바로 중단하는게 아니라 sleep()이 있으면 sleep()이 끝난다음에 중단을 할 수 있다.↓  work 스레드 2번째 작업 시작하고 1초 지난 뒤(main스레드가 sleep(4000)에서 깨어나는 시점)에 while(false)를 인식하고 작업이 끝나면(2초뒤에) work 스레드가 작업을 끝냄21:46:..

JAVA 2024.10.31

스레드 _ JOIN

1. 멀티스레드에서 서로 연산된 결과를 써야 하는 경우만약 멀티스레드가 있을 경우 한 스레드가 다른 스레드에서 연산한 값을 가져와 연산을 해야할 때, 한 스레드가 다른 스레드의 연산결과를 기다리고 작업을 끝내야할 때가 있다.[ex]- main 스레드의 역할 = task1에서 계산한 값 + task2에서 계산한 값 ( 1부터 100까지의 합 )- task1 스레드의 역할 = 1부터 50까지의 합- task2 스레드 = 51부터 100까지의 합이럴 경우에는 메인 스레드는 task1스레드와 task2스레드의 연산을 기다린 후 작업을 해야 정상적인 값이 나온다※ 별도 처리 안하고 멀티스레드 각각 실행한다고 할 경우 task1, task2에서 연산을 끝내기도 전에 main 스레드가 연산한다면 결과는 0이 나올 것..

JAVA 2024.10.29

API - SimpleDateFormat (날짜 형식으로 포맷)

yyyy-M-d 형식으로 들어온 날짜(월/일이 한자리이든, 두자리이든 자동으로 인식한다)를yyyy-MM-dd 형식으로 바꿀때 사용  SimpleDateFormat의 생성자에 파라미터로 포맷을 지정해주고, format() 메소드를 사용  public static void main(String[] args) { String year = "2020"; String month = "8"; String date = "11"; String paramDate = String.format("%s-%s-%s", year, month, date); // yyyy-MM-dd SimpleDateFormat parseDate = new SimpleDat..

JAVA 2024.10.28