2024/11 26

[JAVA] 공통 부분 문자열 백준-5582

공통부분 문자열https://www.acmicpc.net/problem/5582문제두 문자열이 주어졌을 때, 두 문자열에 모두 포함된 가장 긴 공통 부분 문자열을 찾는 프로그램을 작성하시오.어떤 문자열 s의 부분 문자열 t란, s에 t가 연속으로 나타나는 것을 말한다. 예를 들어, 문자열 ABRACADABRA의 부분 문자열은 ABRA, RAC, D, ACADABRA, ABRACADABRA, 빈 문자열 등이다. 하지만, ABRC, RAA, BA, K는 부분 문자열이 아니다.두 문자열 ABRACADABRA와 ECADADABRBCRDARA의 공통 부분 문자열은 CA, CADA, ADABR, 빈 문자열 등이 있다. 이 중에서 가장 긴 공통 부분 문자열은 ADABR이며, 길이는 5이다. 또, 두 문자열이 UPWJ..

알고리즘 2024.11.16

[JPA] 영속성 컨텍스트

jpa 란? JPA 저장멤버객체를 만든다고 가정해보자멤버 객체를 회원 DAO 에 넘기고 회원 DAO 가 JPA 에게 멤버 회원 객체를 저장해줘 라고 던지기만 하면 JPA 가 자동으로 JPA 가 회원 객체를 분석하고 자동으로 INSERT SQL 을 만들어줘도 JDBC API 를 사용해서 db 에 insert 쿼리를 날려준다.또한 패러다임의 불일치도 해결해준다.자바 컬렉션의 저장하듯 한줄의 코드로 JPA 에게 회원을 저장시킬 수 있따. 이떄 회원가 같은 객체를 JPA 에서 엔티티라 부른다. 엔티티란? DB 테이블에 대응하는 하나의 클래스라 생각하면 된다.  JPA 조회 조회또한 마찬가지로 JPA 가 다 알아서 해준다. EnityObject 를 잘 만들어서 결과로 돌려준다. jpa 에서 가장 중요한 두가지가 ..

JPA 2024.11.16

[JAVA] String intern()

String의 intern() 메서드에 대해 공부하다 보면 "절대 쓰지 말라"는 권고를 접할 수 있습니다.intern()은 힙 영역에 생성된 String 객체를 String Constant Pool로 옮겨 메모리를 절약하고 중복을 줄이기 위한 메서드지만, 잘못 사용하면 성능 문제가 발생할 수 있습니다. String Constant Pool 은 자바 7 이후에  메서드 영역에서 힙 영역으로 옮겨졌습니다. 즉 GC 의 대상이 된다는 것입니다.  intern() 메서드를 사용할 때 발생할 수 있는 문제점 Full GC 발생 가능성 증가로 인한 성능 저하객체는 처음 생성 시 에덴 영역에 할당되고, 참조되지 않으면 Minor GC에서 쉽게 수거됩니다. 하지만 intern()으로 객체를 String Constant..

JAVA 2024.11.15

[JAVA] 스레드 Join

스레드는 생성하고 시작하고, 종료되는 생명주기를 가진다. 스레드의 상태New (새로운 상태) : 스레드가 생성되었으나 아직 시작되지 않은 상태Runnable (실행 가능 상태) : 스레드가 실행 중이거나 실행될 준비가 된 상태Blocked (차단 상태) : 스레드가 동기화 락을 기다리는 상태Waiting (대기 상태) : 스레드가 무한으로 다른 스레드의 작업을 기다리는 상태Time Waiting (시간제한 대기 상태): 스레드가 일정 시간 동안 다른 스레드의 작업을 기다리는 상태Terminated (종료 상태) : 스레드의 실행이 완료된 상태.자바 스레드(Thread) 의 생명주기는 여러 상태(state)로 나뉘며, 각 상태는 스레드가 실행되고 종료되기까지의 과정을 나타낸다. 자바 스레드의 생명주기를 자..

JAVA 2024.11.12

[JAVA] Runnable 을 만드는 다양한 방법

Runnable을 만드는 다양한 방법 중첩 클래스를 사용하면 Runnable을 더 편리하게 만들 수 있다. 참고로 모두 결과는 같아. 정적 충첩 클래스 사용package thread.start;import static util.MyLogger.log;public class InnerRunnableMainV1 { // 특정 클래스만에서만 사용되는 경우 정적 중첩 클래스 사용 public static void main(String[] args) { log("main() start"); MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.sta..

JAVA 2024.11.11

[JAVA] 데몬 스레드

스레드는 사용자(user) 스레드와 데몬(daemon) 스레드 2가지 종류로 구분할 수있다.  사용자 스레드 (non-deamon 스레드)프로그램의 주요 작업을 수행한다.작업이 완료 될 때 까지 실행된다.모든 user 스레드가 종류되면 JVM 도 종료된다.  데몬 스레드 백그라운에서 보조적인 작업을 수행한다.모든 user 스레드가 종류되면  데몬 스레드는 자동으로 종료된다. jvm 은 데몬 스레드의 실행 완료를 기다리지 않고 종료된다. 데몬 스레드가 아닌 모든 스레드가 종류되면, 자바 프로그램도 종료된다. 용어 - 데몬 : 그리스 신화에서 데몬은 신과 인간 사이의 중간적 존재로 , 보이지 않게 활동하며 일상적인 일들을 도왔다. 이런 의미로 컴퓨터 과학에서는 사용자에게 직접적으로 보이지않으면서 시스템의 백..

JAVA 2024.11.11

[JAVA] 스레드란? run() start() 의 차이

스레드란 무엇이면 왜 스레드 실행 시 run() 메서드가 아닌 start()를 호출하라고 하는 걸까?해당 내용을 알아보자. 자바 메모리 구조자바 메모리 영역은 크게 메서드, 스택, 힙 영역으로 나눠져 있다. 메서드 영역(Method Area) :  메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 프로그램의 모든 영역에서 공유한다.클래스 정보 : 클래스의 실행 코드 (바이트 코드). 필드, 메서드와 생성자 코드 등 모든 실행 코드가 존재한다.static 영역 : static 변수들을 보관한다.런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.스택 영역 (Stack Area) : 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임..

JAVA 2024.11.11

[JAVA] String + 연산과 비효율성 StringBuilder의 해결 원리

String에 + 연산은 상수풀에 메모리가 할당되어 중간연산 과정에서 많은 객체를 생성한다. StringBuilider를 사용하면 중간과정의 비효율을 해결할 수 있다는데 어떠한 원리로 해결하였을까?궁금증이 생겨 해당 내용을 포스팅하게 되었다.   String에서 + 연산과 그 비효율성 String 객체에서 + 연산을 사용할 때마다 새로운 객체가 생성된다. 이는 불변 (immutable) 특성 때문에 발생하는데 , String 객체는 한번 생성되면 그 값을 변경할 수 없다.따라서 + 연산을 통해 여러 문자열을 이어 붙일 때, 중간 과정에서 새로운 String 객체들이 계속 생성되고,  이 객체들은 상수 풀에 할당되어 메모리를 추가로 차지한게 된다.  이로 인해 불필요한 객체가 계속해서 생성되고 메모리 사용..

JAVA 2024.11.10