개요 Java GUI 로 게임을 만들어 보다가 다음과 같은 예외가 발생했다. 공식 문서에는 이렇게 정의되어 있다. This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible. ... 번역을 해보면 "이 예외는 동시 수정이 허용되지 않은 객체에서 동시 수정이 발생할 경우 수정을 감지한 메서드에서 throw 될 수 있다." 이다. 즉, 객체의 상태를 동시에 수정하는 것을 방지하고 싶을 때 throw 하는 예외이다. 해당 예외는 Collection을 사용하는 중 흔하게 만날 수 있으며 필자는 Java의 향상된 for문을 사용..
Class Loader Class Loader는 자바 런타임 환경의 일부로써 바이트코드로 컴파일된 클래스파일을 동적 로딩하여 JVM의 메모리에 올리는 역할을 합니다. 동적 로딩 클래스 로더는 프로그램의 모든 클래스를 한 번에 메모리에 로드하지 않고, 애플리케이션이 필요로 할 때 로드됩니다. 이것을 동적 로딩이라 하는데 클래스 로더는 2가지의 동적 로딩을 합니다. Load-time Dynamic Loading (로드타임 동적 로딩) 클래스 로더가 클래스들의 메타 데이터를 로드할 때 우선적으로 필요한 상위 클래스의 메타 데이터가 있을 것입니다. 클래스의 메타데이터를 로드하는 시점에 필요한 다른 클래스들의 메타데이터를 로딩하는 것을 로드 타임 동적로딩이라고 합니다. Run-time Dynamic Loading..
목차 JVM JVM의 구성요소 바이트코드? 컴파일? 컴파일된 코드 실행 JIT(Just-In-Time)컴파일러? JDK? JRE? JVM JVM이란, 바이트코드로 컴파일 된 파일들을 운영체제 대신 실행하는 가상의 컴퓨터(소프트웨어)이다. JVM은 H/W와 OS 위에서 실행되기 때문에 JVM자체는 플랫폼에 종속적이다. 즉, 플랫폼에 따라 호환되는 JVM을 실행시켜줘야 한다. Java뿐만아니라 Scala등과 같이 다른언어로 작성되었어도 바이트코드로 컴파일만 시킨다면 JVM으로 실행이 가능하다. JVM의 구성요소 JVM은 JRE안에있는 가상머신으로서 작은 가상 컴퓨터이기 때문에 독자적인 데이터메모리 영역과 실행엔진을 가지고 있다. Class Loader : 동적로딩을 통해 필요한 클래스들을 로딩하여 Runti..
목차 스트림(Stream), 버퍼(Buffer), 채널(Channel) 기반의 I/O InputStream, OutputStream Byte와 Character 스트림 표준스트림(System.in, System.out, System.err) 파일 읽고 쓰기 개요 I/O란 Input/Output으로 데이터를 입력하고 출력하는 것을 의미한다. 예를 들면, 우리가 컴퓨터에게 데이터를 전달하기 위해 키보드를 입력하는 것을 Input이라 할 수 있고 그 Input을 적적히 처리하여 화면에 출력하여 보여주는 것이 Output이라 할 수있다. 그렇다면 데이터는 어떤 방법으로 전달될 수 있을까? 오늘 포스팅하는 Stream과 Channel, Buffer는 데이터를 전달하기 위해 사용하는 그릇과 통로라고 할 수있다. 더..
개요 요즘 코딩테스트 준비를 위해 알고리즘 문제들을 풀고있다. 그러던 중 옆에서 같이 공부하던 생각한대로 동작하지 않는다며 보여준 코드를 보고 이번 포스팅의 주제를 정했다. public void method(){ ArrayList list = new ArrayList(); list.add("first "); list.add("second "); list.add("third"); while(true){ //... Iterator it = list.iterator(); list.clear(); while(it.hasNext()){ System.out.print(it.next()); } } } 동생이 직면한 문제는 간단히 적어보았다. 동생이 말히기를 list의 내용을 복사하여 Iterator를 만들고 다음 루..
개요 public class Main{ public static final void main(String[] args){ StringBuilder sb1 = new StringBuilder("apple"); StringBuilder sb2 = new StringBuilder("apple"); if(sb1.equals(sb2)){ System.out.println("같다"); } System.out.println("다르다"); } } 얼마 전에 같이 공부하던 동생이 한 실수를 간단히 코드로 나타내었다. 동생은 String과 똑같게 생각하여 "같다"의 결과를 생각했지만.. 결과는 "다르다"가 나온다. 왜 이런 실수를 했는지, 그 원인과 실수를 하지 않기 위한 개념을 다져보도록 한다. 물리적 동치성('==')..
이전 포스팅 [ JAVA ] Arrays.sort()의 내부 동작(2) 이전 포스팅 https://javanitto.tistory.com/6 [ JAVA ] Arrays.sort()의 내부 동작(1) 개요 알고리즘 공부를 하다 Arrays.sort()와 Collections.sort()의 내부는 어떤 정렬을 사용하는지 궁금해졌다. 공부한 결과.. javanitto.tistory.com 개요 지금까지 알아본 바에 의하면 Java에서는 배열에 대한 정렬 메서드인 Arrays.sort 제공하는데, 인자로 넘기는 배열의 타입에 따라 내부적으로 알고리즘을 달리했다. 원시타입 배열을 인자로 넘겼을 때는 DualPivotQuickSort.sort를 사용했고 Object타입 배열을 넘겼을 때는 TimSort를 사용했다..
이전 포스팅 [ JAVA ] Arrays.sort()의 내부 동작(1) 개요 알고리즘 공부를 하다 Arrays.sort()와 Collections.sort()의 내부는 어떤 정렬을 사용하는지 궁금해졌다. 공부한 결과부터 말하자면 Arrays.sort는 인자의 타입이 원시타입(PrimitiveType) 인 경우에는 Dual javanitto.tistory.com 개요 저번 포스팅에서는 원시타입(Primitive type)배열을 정렬할 때 사용되는 자바의 기본정렬인 DualPivotQuicksort.sort()에 대해 알아보았다. 이번엔 Object타입의 배열을 정렬할 때 사용되는 TimSort.sort()를 알아보자. java.util.Arrays.sort(:Object[]) String 배열을 인자로 A..
개요 알고리즘 공부를 하다 Arrays.sort()와 Collections.sort()의 내부는 어떤 정렬을 사용하는지 궁금해졌다. 공부한 결과부터 말하자면 Arrays.sort는 인자의 타입이 원시타입(PrimitiveType)인 경우에는 DualPivotQuicksort.sort()가, Object Type인 경우에는 TimSort.sort()가 사용된다. 이번 포스팅에서는 DualPivotQuicksort.sort()에 대해 알아보자. (JAVA 11기준으로 작성하였다.) java.util.Arrays.sort() int타입의 배열을 인자로 호출한 sort메서드이다. 내부적으로 DualPivotQuicksort.sort메서드를 호출한다. 메서드에 대한 설명이 적혀있는데, 해석해보면 기존의 퀵정렬은 ..