개요 우선 JVM 자체가 OS 위에서 자바 프로그램을 실행시켜 주는 역할을 수행해 운영체제에 독립적으로 실행할 수 있게 된다는 것은 당연히 알지만 JVM의 구성, 동작원리, 장단점 등에 대해 깊게 정리해보고자 한다. 컴파일 타입 환경에서의 자바 컴파일러 우리가 작성한 원시코드로 이루어진 java 파일은 JVM이 인식할 수 없기 때문에 자바 컴파일러가 java 파일을 자바 바이트코드로 이루어진 class 파일로 변환한다. (java파일 > 어휘 분석 > 구문 분석 > 의미 분석 > 중간 코드 생성 후 최적화 = class 파일) 실제로 프로그램을 실행한 후에 java 파일들과 이름은 같지만 확장자가 다른 class 파일이 생성된 것을 확인할 수 있다. cmd 창에서 직접 컴파일을 해봤으면 알 수도 있는데 ..
분류 전체보기
정의 N + 1 보다는 1 + N이라고 볼 수 있는데 한 개의 쿼리에 예상과는 다른 N개의 추가 쿼리가 발생하는 문제다. 원인 즉시로딩, 지연로딩, 연관 관계와 상관 없이 언제든 N + 1 문제가 발생할 수 있다 즉시로딩의 경우 N:M 관계에서 N을 조회하는 쿼리를 날렸을 때 M을 즉시로딩으로 가져오게 되어있다면 N을 조회할 때 M을 한 번의 쿼리만 날려서 조회할거라 예상할 수 있지만 JPQL은 N을 먼저 조회하는 쿼리를 날린 후에 M을 즉시로딩으로 가져오게 설정된걸 확인하고 M을 가져오는 추가 쿼리를 날리게 된다. 일대일 관계라면 쿼리가 한 번이 아닌 2번 발생할 것이고 일대다 관계라면 1 + M개만큼의 쿼리가 발생한다. 지연로딩의 경우 N:M 관계에서 N을 조회한 후에 지연로딩으로 가져온 M의 객체들..
문제 접근 방식 별 찍기 문제들은 재귀 처음 배울 때 너무 싫어했던 기억이 있어서 풀기 싫었는데 스트릭 유지할겸 오랜만에 재귀 문제를 풀어보았다. 정사각형이 점점 작아지는 형태로 예를 들면 가장 밖의 정사각형이 13 * 13이라면 그 안의 사각형은 상하좌우 한 칸 거리를 두고 9 * 9 그 안의 사각형도 상하좌우 한 칸 거리를 두고 5 * 5 마지막은 1 * 1이 된다. 규칙을 찾아보면 사각형의 가로세로 길이가 4씩 줄어드는 것을 알 수 있는데 재귀를 호출할 때마다 x축과 y축을 4씩 늘리거나 줄여주면서 2차원 문자 배열에 별을 저장한 후에 모두 끝나면 배열을 출력해주면 된다. 풀이 public class Main { private static char[][] stars; public static voi..
개념 SOLID 원칙 중 개방폐쇄의 원칙에 따라 확장에 대해서는 개방적이고 변경에 대해서는 폐쇄적으로 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 고안된 디자인 패턴이다. 변경될 것(전략)과 변하지 않는 것을 구분하여 두 모듈이 만나는 지점에 인터페이스를 정의해 인터페이스에 의존하도록 코드를 작성한다. 전략 패턴을 이용하는 역할을 수행하는 컨텍스트가 필요에 따라 구체적인 전략을 바꿀 수 있도록 의존관계를 주입하며, 전략은 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 호출할 수 있게 하며, 콘크리트 전략은 전략을 실제로 구현한 클래스를 의미한다. 장점 알고리즘을 캡슐화해 실행 중에 동적으로 바꿀 수 있다. 새로운 변경이 기존의 코드에 영향을 미치지 않는다. 전략은 독립적으로 사용될 수 ..
문제 접근 방식 문제에 적힌거처럼 위 함수를 그대로 구현하고 15, 15, 15 이상의 값들을 넘겨주면 재귀의 깊이가 너무 깊어져 시간 초과가 발생한다. 중복된 호출을 계속해서 반복하기 때문인데 이러한 문제를 해결하기 위해서는 간단하게 중복된 호출을 하지 않으면 되고 이를 해결하는 방법은 DP와 메모이제이션이 있고 이번에는 메모이제이션을 사용해서 풀어보겠다. 우선 입력의 범위가 -50부터 50까지이기 때문에 배열을 101칸 만들고 50씩 더해서 인덱스를 계산해줄까 생각했는데 문제의 코드를 보고 나니 어차피 1이상 20이하까지만 계산하기 때문에 그 외의 값들을 처리해줄 필요가 없다. 그래서 계산 결과를 처리해줄 3차원 배열을 각 21칸씩 만들어 a, b, c의 경우의 수마다 값을 저장해주면 된다. 이후 함..
각 언어별로 한 문제 이상이라도 풀기만 하면 주는 뱃지들이 추가된 거 같다. 솔브닥 사용자 기준 통계이긴 하지만 파이썬이 C++ 사용자보다 많은걸 보니 문득 새삼 파이썬이 대단하게 느껴진다... 자바가 파이썬이나 C++이랑 차이가 좀 있을거라 생각했는데 그렇게 차이가 없어서 의외긴 한데 자바 개발자가 많은 나라라 그런거 같기도 하고...
문제 접근 방식 기본적인 재귀 문제로 문제에 기저 조건부터 규칙까지 그대로 나와 있기 때문에 코드로 구현만 하면된다. 우선 재귀 함수의 기저 조건은 선의 길이가 1일 때일 것이고 현재 선의 중앙을 길이의 3분의 1만큼 공백으로 바꿔준 후에 나머지 왼쪽과 오른쪽 선도 재귀를 이용해 같은 과정을 반복해주면 된다. 풀이 public class Main { private static char[] chars; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder()..
문제 접근 방식 Merge Sort를 구현하여 k번째로 정렬되는 수를 구하면 된다. 정렬 후에 k번째 수를 구하는 것이 아닌 정렬 과정에서의 k번째 수인 것에 유의해야 한다. 문제에서 요구하는 구현 방식은 바텀업이 아닌 탑다운 방식이기 때문에 주어진 의사코드대로 구현하면서 카운팅을 해주다 k번째일 때 수를 기록만 하면 된다. 바텀업 방식은 정렬 순서가 조금 다르기 때문에 정렬 결과는 같더라도 해당 문제를 풀기에는 적합하지 않다. 우선 0번째 인덱스부터 n-1번째 인덱스를 정렬하기 위해서는 왼쪽과 오른쪽 절반으로 나누어가면서 더 이상 나눌 수 없을 때까지 나눈 후에 다시 배열을 합쳐가면서 더 작은 값들을 임시 배열에 기록한 후에 임시 배열의 결과를 원본 배열에 옮겨주면 된다. 풀이 public class ..