전체 글 64

자바 리플렉션(Reflection)

리플렉션(Reflection)은 프로그램이 실행 중에 자기 자신의 구조를 들여다보고 분석하고 수정할 수 있게 해주는 메커니즘이다.자바에서는 java.lang.reflect 패키지를 통해 이 기능을 제공한다.보통 자바 코드를 작성할 때 우리는 컴파일 시점(Compile Time)에 이미 어떤 클래스를 사용할지 어떤 메서드를 호출할지 알고 있다.그런데 리플렉션을 사용하면 컴파일 시점에는 전혀 모르던 클래스를 런타임에 동적으로 로딩하고 그 클래스의 내부 구조를 탐색하며 객체를 생성하고 메서드를 호출할 수 있다.리플렉션은 자바만의 기능이 아니다. C#, Python, Go, Kotlin, Ruby 등 다양한 언어에서 유사한 기능을 지원한다.다만 자바의 리플렉션은 강타입(Strongly Typed) 언어에서 동적..

Language/JAVA 2026.05.04

Java의 static 예약어

static 예약어는 클래스 전역 변수에 사용하는 일이 굉장히 많은데, static 변수로 선언하게 되면 객체 생성 없이도 아래와 같이 바로 접근할 수 있다.클래스명.변수명물론 객체를 생성하고 아래와 같이 접근해도 상관은 없다.객체명.변수명하지만 대부분 IDE에서는 Warning을 보여줄 것이다.어째서 static 이라는 예약어가 있다면 객체 필드 변수가 아니라 클래스 변수로 사용할 수 있는 것일까.그 해답은 간단하게 사용자나 개발자 관점이 아니라 메모리 관점에서 보면 굉장히 편하게 이해할 수 있다. 아래와 같은 Java 소스코드가 있다고 가정해보자.class Student{ String name; String studentId;}public class Main{ public static void ..

Language/JAVA 2026.05.04

자바 파일 변경 감지 (WatchService)

자바에서는 한 디렉토리 내부 파일의 변화를 감지할 수 있는 WatchService라는 기능을 제공한다.디렉토리 안에 있는 파일이 생성, 삭제, 수정되었을 때를 감지할 수 있다.import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.StandardWatchEventKinds;import java.nio.file.WatchEvent;import java.nio.file.WatchEvent.Kind;import java.nio.file.WatchKey;import java.nio.file.WatchService;import ja..

Language/JAVA 2026.05.04

유클리드 호제법(Euclidean algorithm)

유클리드 호제법은 두 자연수 사이에 존재하는 최대 공약수를 빠르게 구하는 알고리즘이다.최대 공약수자연수 a와 b의 최대 공약수를 구하는 방법은 아래의 절차를 따른다.예를 들어 176과 121의 최대 공약수를 구한다고 생각해보면 흐름은 아래와 같다.176를 121로 나눈다. 나누어 떨어지지 않는다. 나머지는 55121를 55로 나눈다. 나누어 떨어지지 않는다. 나머지는 1155를 11로 나눈다. 나누어 떨어진다. 따라서 최대 공약수는 11 소스코드로 표현해보면 아래와 같다.public static int gcd(int a, int b) { return a%b==0 ? b : gcd(b,a%b);} 최소 공배수두 수의 곱은 최대 공약수와 최소 공배수의 곱과 같다 라는 관계식에 의해 최대 공약수를 구했다면 최..

Programming Note 2026.05.04

자바 Random 과 SecureRandom 차이

자바에서 난수를 생성할 때 흔히 Random 클래스나 Math.random()을 쓰지만 보안이 중요한 상황에서는 반드시 SecureRandom을 사용해야 한다. 이들의 결정적인 차이는 "예측 가능성"과 "내부 알고리즘"에 있다.java.util.Random (의사 난수)Random은 선형 합동 생성기(LCG, Linear Congruential Generator)라는 알고리즘을 사용한다.원리는 특정 시드(Seed) 값을 넣으면 정해진 공식에 따라 숫자를 만들어내는데 컴퓨터는 완전한 우연을 만들어낼 수 없기에 계산된 숫자를 내놓는 식이다.이 클래스의 문제는 동일한 시드 값을 알거나 출력된 난수의 패턴을 어느 정도 파악하면 다음에 어떤 숫자가 나올지 완벽하게 예측할 수 있다. 해커가 시드값을 알아내면 난수 ..

Language/JAVA 2026.05.04

자바 ConcurrentModificationException 발생 이유 및 해결방법

java.util.ConcurrentModificationException 예외는 흔히 List나 ArrayList를 for 문에 직접 집어넣고 돌리며 remove를 호출했을 때 발생한다.ArrayList list = new ArrayList();for(String name : list){ list.remove(name);}위의 메서드를 실행할 때 예외가 발생하는 이유는 단순히 인덱스가 밀려서가 아니라, Java의 Fail-Fast 메커니즘 때문이다. for-each 문은 내부적으로 반복자(Iterator)를 사용하는데 리스트에 수정이 일어나면 내부의 modCount(변경 횟수)가 변한다.이때 반복자가 처음에 알고 있던 변경 횟수와 실제 리스트의 변경 횟수가 달라지면 "데이터가 오염되었다"라고 판단..

Language/JAVA 2026.05.04

자바 AES 암호화, 복호화

아래 암호화 알고리즘은 여러가지 인코딩 방식을 제공해주고 있는 Apache Commons Codec 라이브러리를 사용한다.이 라이브러리는 게시물 하단에 링크를 걸어두겠다.암호화파라미터는 순서대로 암호화할 문자열, 비밀번호 문자열이다.public String Encryption(String str, String pw) throws Exception{ byte[] bytes = pw.getBytes(); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(bytes); KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128, sr); Secret..

Language/JAVA 2026.05.04
반응형