본문 바로가기

Old Posts/Java108

[Java] Java Reflection 소개 및 사용법, 예제 자바 리플렉션(Java Reflection)은 구체적인 클래스의 타입을 알지 못하는 상황에서그 클래스에 구현되어 있는 메소드와 필드 등의 정보, 즉 클래스의 구조를 확인할 수 있도록 자바가 제공해주는 API다. 리플렉션은 자바에서 제공해주는 API이기 때문에 별도의 jar 파일을 포함하거나 Maven 의존성을 추가하지 않아도 사용할 수 있다. 일반적으로 자바 리플렉션은 많이 사용되지는 않는다. 다만 프레임워크(Frame Work) 소프트웨어를 작성하거나 IDE 같은 소프트웨어를 작성하는 경우 사용자가 나중에 어떤 타입의 클래스를 사용할지 소프트웨어를 작성하는 당시에는 알지 못하는 경우가 많이 있다. 이 때, 런타임에 사용자가 넘겨준 클래스의 정보를 분석해서 동작할 수 있도록 리플렉션을 이용해 코드를 작성.. 2022. 8. 12.
[Maven] Maven으로 테스트 케이스 실행하는 방법 메이븐 프로젝트에 정의되어 있는 테스트 케이스는 다음 명령으로 실행할 수 있다. $ mvn test 메이븐의 test 페이즈를 이용해 target/test-classes에 컴파일 되어 있는 Unit 테스트 클래스들을 실행하고, 실행 결과물을 target/surefire-reports 디렉토리에 생성한다. 만약 전체 테스트의 실행 대신 일부 테스트 파일에 있는 테스트 케이스들을 테스트해보고 싶으면 다음과 같이 실행하면 된다. $ mvn -Dtest=테스트클래스 test $ mvn -Dtest=테스트클래스1,테스트클래스2 test 이렇게 실행하면 테스트클래스에 정의되어 있는 테스트 케이스들만 실행한다. 프로젝트 전체 테스트 케이스 중 일부가 실패해서 반복적으로 실행해야할 경우 유용하다. 만약 특정 테스트클래.. 2022. 7. 25.
[Java] ConcurrentModificationException 원인과 해결방법 자바 언어로 프로그래밍을 하다보면 가끔씩 ConcurrentModificationException을 만나게 된다. ConcurrentModificationException의 발생 원인과 해결방법에 대해서 간단하게 소개하겠다. ConcurrentModificationException ConcurrentModificationException은 몇 가지 상황에서 발생할 수 있는데, 가장 흔한 것이 컬렉션을 순회하면서 순회하는 대상 컬렉션에 수정을 가하는 경우다. 다음 코드를 실행하면 ConcurrentModificationException이 발생한다. List list = new ArrayList(); list.add("str1"); list.add("str2"); list.add("str3"); for (S.. 2022. 5. 26.
[Java] 메모리 가시성(Visibility) 소스코드의 특정 블럭을 동기화시키고자 할 때, 항상 메모리 가시성(Memory Visibility) 문제가 발생한다. 특정 변수의 값을 사용하고 있을 때 다른 스레드가 그 변수의 값에 접근하지 못하도록 막아야 하는 ‘상호배제’도 중요하지만 값을 수정한 다음 동기화 블록을 빠져나가고 나면 다른 스레드가 변경된 값을 즉시 사용할 수 있어야 하는 ‘가시성(Visibility)’도 중요하다. 메모리 가시성(Memory Visibility) 싱글 스레드 환경에서는 프로그램의 코드가 특정 변수에 값을 수정한 다음 다시 그 변수의 값에 접근해보면 이전에 수정한 값을 다시 가져올 수 있다. 멀티 스레드 환경에서는 반드시 수정한 값을 읽는 것이 보장되지는 않는다. 공유 변수에 대해서 어떤 스레드가 값을 수정했을 때, 그.. 2022. 5. 15.
[Java] synchronized 키워드 -고유락(Intrinsic Lock) 자바는 멀티스레드 환경에서 동기화를 지원하기 위해 가장 기초적인 장치인 '고유락(Intrinsic Lock)'을 지원한다.(고유락은 모니터락(Monitor lock) 혹은 모니터(monitor)라고 부르기도 한다) 개발자는 synchronized 키워드를 이용해서 특정 객체의 고유락을 사용해 여러 스레드를 동기화 시킬 수 있다. Java의 synchronized 자바의 synchronized 블럭은 다음과 같이 생겼다. synchronized(obj) { // critical section } synchronized 블럭은 객체를 필요로 한다. 동일한 객체에 대해서 synchronized 블록을 사용하는 두 스레드는 한 번에 하나의 스레드만 synchronized 블록 내부로 들어갈 수 있다. 자바에서 .. 2022. 4. 7.
[Java] 스레드 안전성(Thread Safety) 이전 포스트에서 자바는 멀티 스레드를 지원하여 여러 작업들을 동시에 실행할 수 있다고 했다. (링크 : [Java] 자바 병렬 프로그래밍 - 멀티 스레드의 장단점) 요즘 출시되는 CPU들은 기본적으로 여러개의 코어를 탑재하고 있다. 따라서 멀티 스레드들은 동시에 다른 코어에서 병렬적으로 실행될 수 있다. 문제는 이 스레드들이 동시에 같은 데이터에 접근할 때 발생한다. 스레드 안전(Thread-Safe) 조금 따분한 주제일 수도 있지만 '스레드 안전(Thread-safe)'에 대해서 정리를 하고 넘어가야 한다. 자바 클래스는 어떻게 동작해야하는지에 대한 '클래스 명세(Class Specification)'를 가지고 있다. 잘 정의된 클래스 명세는 객체의 상태를 제약하는 '불변조건(Invariants)'와 .. 2022. 3. 31.
[Java] 자바 병렬 프로그래밍 - 멀티 스레드의 장단점 복잡한 프로그램이 제대로 동작하도록 코드를 작성하는 일은 어렵다. 하지만 그 복잡한 프로그램이 빠르면서 제대로 동작하도록 작성하는 것은 더욱 어렵다. 즉, 어떤 작업들을 순차적으로 실행하는 프로그램보다 동시에 여러 작업들이 수행되도록 프로그램을 작성하는 것은 더욱 어렵다. 자바에서는 스레드를 이용해 프로그램의 여러 작업들을 동시에 실행하도록 해준다. 하나의 자바 프로그램에서 여러 스레드가 동작한다는 의미는 하나의 자바 프로그램이 여러 개의 프로세서를 활용해 최대한 성능을 끌어올린다는 것을 의미한다. 잘 알려져 있듯이 CPU의 성능을 향상시키기 위해 클럭 속도를 빠르게 올리는 방향에서 코어의 개수가 늘어나는 방향으로 전환되었다. 클럭 주파수를 끝없이 올리기엔 물리적인 한계가 있기 때문이다. CPU 코어의 .. 2022. 3. 15.
[Java] 스레드 그룹(Thread Group) JVM에서 생성되는 스레드들은 모두 어떤 스레드 그룹(Thread Group)에 속해 있다. 스레드 그룹은 연관되어 있는 스레드들을 묶어서 관리하기 위해 사용된다. JVM이 시작되면 system 스레드 그룹이 생성된다. GC를 담당하는 Finalizer 스레드를 비롯하여 JVM 운영에 필요한 몇 가지 스레드들이 생성되어 system 그룹에 포함된다. 이후 system 스레드 그룹의 하위 그룹으로 main 스레드 그룹이 생성되고, main 메서드를 실행하는 main 스레드가 포함된다. 새로운 스레드를 생성할 때, 스레드 그룹을 지정할 수 있다. 만약 스레드가 포함될 스레드 그룹을 지정하지 않았다면 스레드를 생성하는 스레드가 포함된 스레드 그룹에 기본적으로 속하게 된다. 스레드 그룹 확인 특정 스레드가 어떤.. 2022. 2. 26.
[Java] JMX (JavaManagement eXtension) 간단한 예제 코드 JMX는 Java Management eXtention의 약자로 애플리케이션의 상태를 모니터링하고 설정을 변경할 수 있는 프레임워크다. JMX는 JDK 1.5부터 제공되기 시작했으며 많은 자바 개발자들 사이에서 사용되고 있는 기능이다. 구성 JMX 아키텍처는 3개의 레이어로 구성되어 있다. Instrumentation layer (MBeans) JMX agent layer (MBeanServer) Remote management layer (Connector, tools) JMX를 통해 리소스를 관리하려면 MBean이라는 Managed Beans를 생성해야한다. 이렇게 생성한 MBean을 MBeanServer에 등록하면, MBeanServer는 등록된 MBean을 관리하는 에이전트 역할을 하게 된다. 외.. 2022. 2. 24.