Language
-
2024-03-29 1. 방법 import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; public class ImageResizer { public static final int MAX_WIDTH = 1920; public static final int MAX_HEIGHT = 1080; // 이미지 크기 조정 private BufferedImage resizeImage(BufferedImage originalImage) { int width = originalImage.getWidth(); int height = originalImage.getHeight(); // 이미지 크기가 최대 크기보다..
자바 이미지 리사이징 및 비율 변경 하는 방법 알아보기2024-03-29 1. 방법 import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; public class ImageResizer { public static final int MAX_WIDTH = 1920; public static final int MAX_HEIGHT = 1080; // 이미지 크기 조정 private BufferedImage resizeImage(BufferedImage originalImage) { int width = originalImage.getWidth(); int height = originalImage.getHeight(); // 이미지 크기가 최대 크기보다..
2024.03.29 -
2024-02-16 1. 문제 발생 IDE에서는 src/main/.../test.properties 이런 식으로 사용해도 문제없이 동작을 했지만 -jar 파일로 생성 후 해당 부분을 그대로 쓰면 java.nio.file.NoSuchFileException 가 발생하게 된다. 2. 원인 배포시에 src/main/resources의 루트 경로가 target/classes 또는 build/classes로 변경되게 된다. 이를 위해 리소스 파일을 읽어 올 때는 동적으로 root를 잡을 수 있게 코드를 수정해야 한다. 3. 해결 방법 getClass.getClassLoader().getResourceAsStream('자신의 정적파일 위치')를 통해 자신이 위치시킬 파일의 정보를 읽어올 수 있다. private I..
-jar resources folder 접근 java.nio.file.NoSuchFileException 해결2024-02-16 1. 문제 발생 IDE에서는 src/main/.../test.properties 이런 식으로 사용해도 문제없이 동작을 했지만 -jar 파일로 생성 후 해당 부분을 그대로 쓰면 java.nio.file.NoSuchFileException 가 발생하게 된다. 2. 원인 배포시에 src/main/resources의 루트 경로가 target/classes 또는 build/classes로 변경되게 된다. 이를 위해 리소스 파일을 읽어 올 때는 동적으로 root를 잡을 수 있게 코드를 수정해야 한다. 3. 해결 방법 getClass.getClassLoader().getResourceAsStream('자신의 정적파일 위치')를 통해 자신이 위치시킬 파일의 정보를 읽어올 수 있다. private I..
2024.02.16 -
2024-01-22 1. 정의 오토박싱은 Java 컴파일러가 기본 유형(원시타입)과 해당 객체 래퍼 클래스 간에 수행하는 자동 변환이다. 예를 들어 int를 Integer로, double을 Double로 변환하는 등의 작업을 뜻한다. 변환이 반대 방향으로 진행되는 경우 이를 언박싱(Unboxing)이라고 한다. 2. 예제 나머지(%) 및 단항 더하기(+=) 연산자는 Integer 객체에 적용되지 않으나, Java 컴파일러가 오류를 발생시키지 않고 메서드를 컴파일하는 이유는 런타임에 Integer를 int로 변환하기 위해 intValue 메서드를 호출하기 때문에 오류를 생성하지 않는다. 때문에 아래 예제에서는 오류 없이 동일한 값을 리턴한다. import org.junit.jupiter.api.Test; ..
자바 오토박싱(autoBoxing) 알아보기2024-01-22 1. 정의 오토박싱은 Java 컴파일러가 기본 유형(원시타입)과 해당 객체 래퍼 클래스 간에 수행하는 자동 변환이다. 예를 들어 int를 Integer로, double을 Double로 변환하는 등의 작업을 뜻한다. 변환이 반대 방향으로 진행되는 경우 이를 언박싱(Unboxing)이라고 한다. 2. 예제 나머지(%) 및 단항 더하기(+=) 연산자는 Integer 객체에 적용되지 않으나, Java 컴파일러가 오류를 발생시키지 않고 메서드를 컴파일하는 이유는 런타임에 Integer를 int로 변환하기 위해 intValue 메서드를 호출하기 때문에 오류를 생성하지 않는다. 때문에 아래 예제에서는 오류 없이 동일한 값을 리턴한다. import org.junit.jupiter.api.Test; ..
2024.01.22 -
2024-01-19 1. 예제 아래와 같이 싱글톤 패턴이 있다고 할 때 몇 가지 문제점이 발생할 수 있다. class SampleSingleton { private static SampleSingleton instance; public static synchronized SampleSingleton getInstance() { if (instance == null) { instance = new SampleSingleton(); } return instance; } } 2. volatile private static SampleSingleton instance; 위의 변수는 volatile 로 선언되어 있지 않아 멀티스레드의 환경에서의 안정성이 떨어질 수 있다. 멀티 스레드 환경에서는 각 스레드가 자체 ..
자바 싱글톤 패턴과 이중 체크락(Double-Checked Locking) + volatile2024-01-19 1. 예제 아래와 같이 싱글톤 패턴이 있다고 할 때 몇 가지 문제점이 발생할 수 있다. class SampleSingleton { private static SampleSingleton instance; public static synchronized SampleSingleton getInstance() { if (instance == null) { instance = new SampleSingleton(); } return instance; } } 2. volatile private static SampleSingleton instance; 위의 변수는 volatile 로 선언되어 있지 않아 멀티스레드의 환경에서의 안정성이 떨어질 수 있다. 멀티 스레드 환경에서는 각 스레드가 자체 ..
2024.01.19 -
2023-11-08 1. swtich 패턴 개선 @Test public void test1(){ String today =""; int day = 1; switch (day) { case 1: today = "월"; case 2: today = "화"; case 3: today = "수"; case 4: today = "목"; case 5: today = "금"; case 6: today = "토"; case 7: today = "일"; } System.out.println(today); // 변수에 매번 할당 하는 방식에서 case 에 따라 바로 변수에 할당할 수 있게 변경 되었다. String today2 =""; int day2 = 1; today2 = switch (day2) { case 1 ->..
[Java] 자바 14 주요 변경점 살펴 보기2023-11-08 1. swtich 패턴 개선 @Test public void test1(){ String today =""; int day = 1; switch (day) { case 1: today = "월"; case 2: today = "화"; case 3: today = "수"; case 4: today = "목"; case 5: today = "금"; case 6: today = "토"; case 7: today = "일"; } System.out.println(today); // 변수에 매번 할당 하는 방식에서 case 에 따라 바로 변수에 할당할 수 있게 변경 되었다. String today2 =""; int day2 = 1; today2 = switch (day2) { case 1 ->..
2023.11.08 -
2023-10-20 1. 방법 java.lang.reflect Field 를 활용하면 주어진 클래스의 필드 정보를 확인 할 수 있다. public class Person { private String name; private int age; private boolean isStudent; private boolean isEmployed; // Getter and Setter methods go here... public static void main(String[] args) { Person person = new Person(); // Assume you have set values for the fields using setter methods. Class personClass = person.get..
[Java] 자바 Reflection API를 사용하여 특정 필드 타입 변수 확인하기 ex) boolean2023-10-20 1. 방법 java.lang.reflect Field 를 활용하면 주어진 클래스의 필드 정보를 확인 할 수 있다. public class Person { private String name; private int age; private boolean isStudent; private boolean isEmployed; // Getter and Setter methods go here... public static void main(String[] args) { Person person = new Person(); // Assume you have set values for the fields using setter methods. Class personClass = person.get..
2023.10.20 -
2023-08-25 1. 방법 Java에서는 java.awt.image.BufferedImage와 javax.imageio.ImageIO를 사용해서 만들면 됩니다. import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; public class CaptchaGenerator { public static BufferedImage createCaptcha(String word, int imgWidth, i..
[Java] 자바 텍스트 들어간 이미지 만드는 방법2023-08-25 1. 방법 Java에서는 java.awt.image.BufferedImage와 javax.imageio.ImageIO를 사용해서 만들면 됩니다. import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; public class CaptchaGenerator { public static BufferedImage createCaptcha(String word, int imgWidth, i..
2023.08.25 -
2023-08-18 1. repeat(반복횟수) repeat는 문자열을 반복 횟수만큼 연결한 값의 문자열을 반환합니다. 앞에 문자열이 비어 있거나 카운트가 0이면 빈 문자열이 반환됩니다. @Test public void whenRepeatStringTwice_thenGetStringTwice() { String output = "La ".repeat(2) + "Land"; System.out.println(output); MatcherAssert.assertThat(output, Matchers.is("La La Land")); } 2. strip() 모든 선행 및 후행 공백이 제거된 문자열을 결과값으로 반환합니다. 문자열 개체가 빈 문자열을 나타내거나 문자열의 모든 코드 포인트가 공백인 경우 빈 문자열..
[Java] java 11 String 메서드 살펴보기2023-08-18 1. repeat(반복횟수) repeat는 문자열을 반복 횟수만큼 연결한 값의 문자열을 반환합니다. 앞에 문자열이 비어 있거나 카운트가 0이면 빈 문자열이 반환됩니다. @Test public void whenRepeatStringTwice_thenGetStringTwice() { String output = "La ".repeat(2) + "Land"; System.out.println(output); MatcherAssert.assertThat(output, Matchers.is("La La Land")); } 2. strip() 모든 선행 및 후행 공백이 제거된 문자열을 결과값으로 반환합니다. 문자열 개체가 빈 문자열을 나타내거나 문자열의 모든 코드 포인트가 공백인 경우 빈 문자열..
2023.08.18 -
2023-06-24 1. 방법 Object를 DTO로 매핑하고 싶다면, 해당 Object를 먼저 JSON 문자열로 변환한 다음 ObjectMapper를 사용하여 매핑해야 합니다. 이를 위해 Jackson 라이브러리의 ObjectMapper를 사용할 수 있습니다. 다음은 ObjectMapper를 사용하여 Object를 DTO로 매핑하는 예시입니다 ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(object); // Object를 JSON 문자열로 변환 DTO dto = objectMapper.readValue(json, DTO.class); // JSON 문자열을 DTO로 매핑 2. 의존..
[Java] Object to DTO 하는 방법 [ObjectMapper]2023-06-24 1. 방법 Object를 DTO로 매핑하고 싶다면, 해당 Object를 먼저 JSON 문자열로 변환한 다음 ObjectMapper를 사용하여 매핑해야 합니다. 이를 위해 Jackson 라이브러리의 ObjectMapper를 사용할 수 있습니다. 다음은 ObjectMapper를 사용하여 Object를 DTO로 매핑하는 예시입니다 ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(object); // Object를 JSON 문자열로 변환 DTO dto = objectMapper.readValue(json, DTO.class); // JSON 문자열을 DTO로 매핑 2. 의존..
2023.06.24 -
2023-05-19 1. 방법 우선적으로 주어진 문자열을 Char 형태의 배열로 바꾼후 Array 에 맵핑을 해주면 깔끔하게 변환이 된다. fun main() { val a = "abcde" val aArr : Array = a.toCharArray().map { it.toString() }.toTypedArray() for(aStr in aArr){ println(aStr) } } 메인 이미지 출처 : 사진: Unsplash의NEOM
[Kotlin] String 을 Array<String>으로 변환 하는 방법2023-05-19 1. 방법 우선적으로 주어진 문자열을 Char 형태의 배열로 바꾼후 Array 에 맵핑을 해주면 깔끔하게 변환이 된다. fun main() { val a = "abcde" val aArr : Array = a.toCharArray().map { it.toString() }.toTypedArray() for(aStr in aArr){ println(aStr) } } 메인 이미지 출처 : 사진: Unsplash의NEOM
2023.05.19 -
2023-05-10 1. 방법 @JsonProperty라는 어노테이션을 사용하면 해당 문제를 손쉽게 해결할 수 있습니다. 아래의 예제 코드를 살펴봅시다. 예시 Json { "이름": "홍길동", "나이": 30, "주소 정보": "서울시 강남구" } 예시 DTO import com.fasterxml.jackson.annotation.JsonProperty; public class PersonDTO { @JsonProperty("이름") private String name; @JsonProperty("나이") private int age; @JsonProperty("주소 정보") private String address; // Getter와 Setter 메서드 생략 } 아래 코드에서 objectMapper..
[Java] Key에 공백과 한글이 들어간 Json 객체 DTO 맵핑하는 방법2023-05-10 1. 방법 @JsonProperty라는 어노테이션을 사용하면 해당 문제를 손쉽게 해결할 수 있습니다. 아래의 예제 코드를 살펴봅시다. 예시 Json { "이름": "홍길동", "나이": 30, "주소 정보": "서울시 강남구" } 예시 DTO import com.fasterxml.jackson.annotation.JsonProperty; public class PersonDTO { @JsonProperty("이름") private String name; @JsonProperty("나이") private int age; @JsonProperty("주소 정보") private String address; // Getter와 Setter 메서드 생략 } 아래 코드에서 objectMapper..
2023.05.10 -
2023-05-09 1. 방법 사용 라이브러리 : Jackson: https://github.com/FasterXML/jackson GitHub - FasterXML/jackson: Main Portal page for the Jackson project Main Portal page for the Jackson project. Contribute to FasterXML/jackson development by creating an account on GitHub. github.com // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind implementation group: 'com.fasterxml.jacks..
[Java] 중첩된 구조의 JSON 데이터를 DTO 맵핑 방법2023-05-09 1. 방법 사용 라이브러리 : Jackson: https://github.com/FasterXML/jackson GitHub - FasterXML/jackson: Main Portal page for the Jackson project Main Portal page for the Jackson project. Contribute to FasterXML/jackson development by creating an account on GitHub. github.com // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind implementation group: 'com.fasterxml.jacks..
2023.05.09 -
2023-05-08 1. 방법 라이브러리 정보를 추가한다. /* 메이븐 */ com.fasterxml.jackson.core jackson-databind 2.12.3 /* 그레이들 */ dependencies { implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3' } @JsonInclude 어노테이션을 import 합니다. import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude 어노테이션을 DTO 클래스에 추가합니다. @JsonInclude(JsonInclude.Include.NON_NULL) public class MyDTO { private String name; pr..
[Java] DTO to Json 시 null값 제외시키는 방법2023-05-08 1. 방법 라이브러리 정보를 추가한다. /* 메이븐 */ com.fasterxml.jackson.core jackson-databind 2.12.3 /* 그레이들 */ dependencies { implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3' } @JsonInclude 어노테이션을 import 합니다. import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude 어노테이션을 DTO 클래스에 추가합니다. @JsonInclude(JsonInclude.Include.NON_NULL) public class MyDTO { private String name; pr..
2023.05.08 -
2023-04-28 1. 원인 This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible. 이 예외는 객체의 동시 수정이 허용되지 않을 때 객체의 동시 수정을 탐지한 방법에 의해 발생할 수 있습니다. For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined ..
[Java] ConcurrentModificationException 예외 처리 및 원인2023-04-28 1. 원인 This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible. 이 예외는 객체의 동시 수정이 허용되지 않을 때 객체의 동시 수정을 탐지한 방법에 의해 발생할 수 있습니다. For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined ..
2023.04.28 -
2023-04-07 1.?(Elvis Operation) 엘비스 연산자 코틀린에? 엘비스 연산자라고 불리며, 변수의 안전한 호출을 가능하게 해 준다. 아래의 코드에서 str 변수는 타입에? 기호 없이 선언하여 컴파일 단계에서 에러가 발생하는 반면 str_1의 경우 타입에? 를 붙여 에러가 발생하지 않는다. fun main() { var str : String = "Hello World" str = null //error var str_1: String? = "Hello World" str_1 = null //Nullable // val str_2: String? = null print(str_2.toString()) // Logs "null", does not throw an exception } 2. ..
[Kotlin] 코틀린 Null Safe 알아보기 (null 연산자)2023-04-07 1.?(Elvis Operation) 엘비스 연산자 코틀린에? 엘비스 연산자라고 불리며, 변수의 안전한 호출을 가능하게 해 준다. 아래의 코드에서 str 변수는 타입에? 기호 없이 선언하여 컴파일 단계에서 에러가 발생하는 반면 str_1의 경우 타입에? 를 붙여 에러가 발생하지 않는다. fun main() { var str : String = "Hello World" str = null //error var str_1: String? = "Hello World" str_1 = null //Nullable // val str_2: String? = null print(str_2.toString()) // Logs "null", does not throw an exception } 2. ..
2023.04.07 -
2023-03-24 1. 방법 우선 주어진 배열과 동일한 크기의 배열을 생성해 준다. 해당 주어진 배열을 1회 순회하며, 새로운 배열(sumArr)에 sumArr [i-1] + arr [i] 공식으로 대입해 주면 된다. 이후에 주어진 구간합을 구할때는 구간 끝 - 구간시작-1 공식을 이용하면 기존 배열을 다시 반복 순회하지 않아도 답을 도출할 수 있다. static int [] sumArr; @Test public void test(){ int [] arr = new int [] {4,5,13,43,22,1,5,7,8}; sumArr = new int [arr.length]; sumArr[0] = arr[0];//구간합 첫번째 인자 셋팅 //구간합 구하기 for(int i = 1; i < arr.leng..
[Java] 자바 구간합 구하는 방법 알아보기2023-03-24 1. 방법 우선 주어진 배열과 동일한 크기의 배열을 생성해 준다. 해당 주어진 배열을 1회 순회하며, 새로운 배열(sumArr)에 sumArr [i-1] + arr [i] 공식으로 대입해 주면 된다. 이후에 주어진 구간합을 구할때는 구간 끝 - 구간시작-1 공식을 이용하면 기존 배열을 다시 반복 순회하지 않아도 답을 도출할 수 있다. static int [] sumArr; @Test public void test(){ int [] arr = new int [] {4,5,13,43,22,1,5,7,8}; sumArr = new int [arr.length]; sumArr[0] = arr[0];//구간합 첫번째 인자 셋팅 //구간합 구하기 for(int i = 1; i < arr.leng..
2023.03.24 -
2023-03-23 1. 방법 스택을 사용하면 해결을 할 수 있다. 주어진 숫자형 배열의 인덱스를 스택에 저장하고 각 인덱스 마다 비교하여 다음 큰 수를 찾을 수 있다. public int[] test(int[] numbers) { Stack stack = new Stack(); int[] answer = new int[numbers.length]; for (int i = 0; i 스택최상단인덱..
[Java] 숫자형 배열에서 다음 큰 수 찾는 방법2023-03-23 1. 방법 스택을 사용하면 해결을 할 수 있다. 주어진 숫자형 배열의 인덱스를 스택에 저장하고 각 인덱스 마다 비교하여 다음 큰 수를 찾을 수 있다. public int[] test(int[] numbers) { Stack stack = new Stack(); int[] answer = new int[numbers.length]; for (int i = 0; i 스택최상단인덱..
2023.03.23 -
2023-03-17 1. 방법 방법은 각각의 rgb 값을 인터형으로 받아 문자열 format을 이용해 변경해 주면 된다. public static String rgbToHex(int r, int g, int b) { if(r 255) r = 255; if(g 255) g = 255; if(b 255) b = 255; String hex = String.format("%02X%02X%02X", r, g, b).toUpperCase(); return hex; } 메인 이미지 출처 : 사진: Unsplash의Mona
[Java] RGB 코드를 Hex 코드로 바꾸는 방법2023-03-17 1. 방법 방법은 각각의 rgb 값을 인터형으로 받아 문자열 format을 이용해 변경해 주면 된다. public static String rgbToHex(int r, int g, int b) { if(r 255) r = 255; if(g 255) g = 255; if(b 255) b = 255; String hex = String.format("%02X%02X%02X", r, g, b).toUpperCase(); return hex; } 메인 이미지 출처 : 사진: Unsplash의Mona
2023.03.17 -
2023-03-10 1. 방법 우선 아래의 라이브러리들의 import가 필요하다. import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.StringReader; 이후 처리해야 할 xml 형태의 String 변수를 해당 라이브러리들을 사용하여 원하는 값을 추출할..
[Java] String 형태의 Xml의 태그 값 추출하는 방법2023-03-10 1. 방법 우선 아래의 라이브러리들의 import가 필요하다. import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.StringReader; 이후 처리해야 할 xml 형태의 String 변수를 해당 라이브러리들을 사용하여 원하는 값을 추출할..
2023.03.10 -
2023-02-27 1. 방법 첫 번째 방법은 순차탐색하는 방법으로 O(n)의 복잡도를 가지게 된다. 주어진 n의 정수만큼 복잡도가 증가하기 때문에 비효율적이다. 반면에 sum2와 같은 방식은 n 값의 증가와는 상관없이 항상 O(1)의 복잡도를 가지게 되면 굉장히 효율적이기 때문에 1부터 시작하는 n의 정수의 합을 구하는 경우 sum2와 같은 방법을 구하는 것 이 좋다. @Test public void test11(){ int n = 100; int sum1 = 0; for(int i = 0; i
[Java] 정수 n 까지의 합 구하기2023-02-27 1. 방법 첫 번째 방법은 순차탐색하는 방법으로 O(n)의 복잡도를 가지게 된다. 주어진 n의 정수만큼 복잡도가 증가하기 때문에 비효율적이다. 반면에 sum2와 같은 방식은 n 값의 증가와는 상관없이 항상 O(1)의 복잡도를 가지게 되면 굉장히 효율적이기 때문에 1부터 시작하는 n의 정수의 합을 구하는 경우 sum2와 같은 방법을 구하는 것 이 좋다. @Test public void test11(){ int n = 100; int sum1 = 0; for(int i = 0; i
2023.02.27