반응형

분류 전체보기 141

[Java] JDK 부수기 - (2) java.lang.System - 5. currentTimeMillis, nanoTime

5. currentTimeMillis, nanoTime 각각 OS로부터 밀리초, 나노초 단위로 시간을 받아온다. JVM 뜯어보기 System.currentTimeMillis(), System.nanoTime()은 System클래스에서 시간을 다루는 두 메서드지만 전자는 주로 현재 시간을 나타내거나 시간 차이를 비교할 때 사용하지만, 후자는 시간 차이를 정밀하게 비교할 때 사용한다. 두 메서드의 작동 방식에 차이가 있기 때문인데 JVM을 뜯어보면서 함께 비교해보자. System 클래스에서 두 메서드는 다음과 같이 코딩되어 있다. // src/java.base/java/lang/System.java public final class System { @IntrinsicCandidate public static..

[Java] JDK 부수기 - (2) java.lang.System - 4. getProperties

4. getProperties JVM의 시스템 속성을 리턴한다. JVM 뜯어보기 System.getProperties() 메서드는 JVM과 자바 애플리케이션 환경에 대한 설정을 담고 있는 Properties 객체를 리턴한다. 이 Properties 객체는 JVM이 시작될 때 설정되며 'java -DpropertyKey=value' 형식의 명령줄 인수를 이용해 시스템 속성을 설정해 줄 수도 있다. 이 글을 진행하면서 알게 되겠지만 System.setProperty("propertyKey", "value") 메서드를 사용해 시스템 속성을 새롭게 설정할 수도 있다. 시스템 속성에는 대표적으로 자바의 버전이나 CPU 정보, OS정보, OS의 File 구분자(Windows의 \, Linux의 /), OS의 행 구..

[Java] JDK 부수기 - (2) java.lang.System - 3. console

3. console 현재 실행 중인 JVM에 연관된 문자형 콘솔이 존재하는 경우 이를 리턴한다 JVM 뜯어보기 System.console() 메서드는 JVM이 콘솔 환경에서 실행될 때 해당 콘솔 객체를 리턴하고 없다면 null을 리턴한다. // src/java.base/java/lang/System.java public final class System { private static volatile Console cons; public static Console console() { Console c; if ((c = cons) == null) { synchronized (System.class) { if ((c = cons) == null) { cons = c = SharedSecrets.getJava..

[Java] JDK 부수기 - (2) java.lang.System - 2. arraycopy

2. arraycopy 배열의 일부를 다른 배열에 복사한다. JVM 뜯어보기 System.arraycopy() 메서드는 System의 스트림들 다음으로 많이 쓸 수 있는 메서드다. arraycopy() 메서드는 배열 객체의 일부를 다른 배열에 빠르게 복사할 수 있다. 배열을 복사하는 방법은 여러 가지가 있다. 예를 들어 for문을 이용해 배열의 요소를 반복적으로 추가해준다거나 Arrays.stream().toArray(), Arrays.copyOf(), clone()과 같은 메소드를 활용할 수도 있다. arraycopy() 메서드를 이용하면 위의 방법들과 동일한 결과를 얻을 수 있으며, 네이티브 메서드를 활용하므로 큰 배열을 복사할 경우에 비교적 더 빠른 결과를 얻을 수 있다. arraycopy()를 공..

[Java] JDK 부수기 - (1) java.lang.Object - 5. toString

4. toString() 해당 객체의 문자열 표현을 리턴한다. JVM 뜯어보기 Object.toString() 메서드는 해당 객체를 출력할 때 호출되는 메서드다. 앞선 getClass글에서도 언급됐지만 출력을 담당하는 PrintStream의 print()나 println() 메서드는 String.valueOf() 메서드를 호출하고 다시 valueOf() 메서드는 객체에 toString() 메서드를 호출한 결과를 출력한다. 따라서 객체를 출력한 결과를 바꾸기 위해서는 해당 클래스의 toString() 메서드를 오버라이딩해주면 된다. 해당 코드를 보자. // src/java.base/java/lang/Object.java public class Object { public String toString() {..

[Java] JDK 부수기 - (1) java.lang.Object - 4. getClass

4. getClass() 해당 객체가 실제로 속한 클래스(runtime class)를 리턴한다. JVM 뜯어보기 Object.getClass() 메서드는 해당 객체가 실제로 속한 클래스(runtime class)를 리턴한다. 좀 더 자세하게 말하면 해당 객체의 Class 객체가 리턴된다. // src/java.base/java/lang/Object.java public class Object { @IntrinsicCandidate public final native Class getClass(); } 역시 Object의 getClass() 메서드도 네이티브 메서드로 구현되어 있다. JVM에서 해당 구현 코드를 찾아보자. // src/java.base/share/native/libjava/Object.c ..

[Java] JDK 부수기 - (1) java.lang.Object - 3. hashCode

3. hashCode() 해당 객체의 해시 코드 값을 리턴한다. JVM 뜯어보기 Object.hashCode() 메서드는 해당 객체의 해시 코드 값을 리턴하는 메서드다. 해시 코드를 생성하는 해시 함수가 자바에서 어떻게 구현되어 있는지 궁금해진다. // src/java.base/java/lang/Object.java public class Object { @IntrinsicCandidate public native int hashCode(); } 역시 Object의 hashCode() 메서드도 네이티브 메서드로 구현되어 있다. JVM에서 해당 구현 코드를 찾아보자. // src/hotspot/share/prims/jvm.cpp JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, ..

[Java] JDK 부수기 - (1) java.lang.Object - 2. equals

2. equals(Object obj)또 다른 객체 obj가 해당 객체와 동등(equal to)한지 보여준다. JVM 뜯어보기  Object.equals() 메서드는 null이 아닌 객체와 다른 객체 간의 동등성을 평가하는 메서드다. 구현 코드 자체는 굉장히 단순하다. 아래를 보자. // src/java.base/java/lang/Object.javapublic class Object { public boolean equals(Object obj) { return (this == obj); } }  equals() 메서드는 네이티브 코드가 아닌 일반적인 자바 코드로 되어 있다. this == obj를 통해 해당 객체와 파라미터로 넘겨 받은 obj 객체의 ..

[Java] JDK 부수기 - (1) java.lang.Object - 1. clone

개요 기계를 뜯어보는 것은 기계가 어떻게 동작하는지 이해하는 데 많은 도움이 된다. 예를 들어 필자가 잠자기 전 뒤척일 때, asmr처럼 틀어놓는 손목시계 복구 영상처럼 시계를 쌀알 크기의 톱니바퀴 하나까지 다 뜯어보는 것은 이 톱니바퀴가 왜 필요한지 이해하는 데 도움이 될 수 있고, 결과적으로 같은 모델의 시계가 고장 났을 때 이상 현상만 보고도 어떤 부분이 문제가 있는지 예측할 수 있다. JDK 또한 하나의 기계라고 생각하면 각 부분이 어떻게 구현되어 있는지 살펴보는 것이 자바를 이해하는 데 도움이 될 것으로 판단된다. 또한 수십년에 걸쳐 깎아온 코드를 보면 더 효율적이고 직관적인 코드를 어떻게 짤 수 있는지 도움을 받을 수 있지 않을까 하는 마음에 JDK 부수기 컨텐츠를 하려고 한다. 전부 다 하기..

반응형