반응형

프로그래밍/Java 23

[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 부수기 컨텐츠를 하려고 한다. 전부 다 하기..

[Java] Java기초 - (3) 배열

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 파이썬은 동적 배열인 list를 사용해서 다른 타입의 요소들을 저장할 수 있지만, 자바에서의 배열의 요소들은 모두 같은 타입이어야만 한다. 01. 배열 1. 배열의 선언과 생성 // Case 1 int[] arr; arr = new int[3]; // Case 2 int[] arr = new int[3]; // Case 3 int arr[] = new int[3]; // Case 4 int[] arr = {1, 2, 3}; 예를 들어 int배열에 대한 선언은 위의 네 가지 경우가 모두 가능하다. Case 1은 첫 줄에서 배열을 선언(배열을 다루는 참조변수 선언)하고 두번째 줄에서 배열을 생성(실제 저장공간을 생성)한다. Case 2는..

[Java] Java Build Tools 발전과정 - (3) Gradle

05. Gradle ( 2012 - ) Gradle은 Ant, Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합해 만든 오픈 소스 빌드 도구 프로젝트다. 기존 도구들이 xml과 같은 마크업 언어로 프로젝트를 관리했던 것과는 달리 Groovy기반의 DSL(Domain Specific Language)를 이용해 프로젝트를 관리한다. 최근에는 Kotlin DSL을 사용할 수 있게 되어서 Groovy기반 DSL의 아쉬운 부분(예를 들어 자동 완성 안됨)도 보완되었다. 또한 Gradle Wrapper를 이용해 Gradle이 설치되어 있지 않은 시스템에서도 프로젝트 빌드가 가능하다. 뒤늦게 개발된 빌드 도구라서 그런지 기존 도구를 대체할 많은 장점을 가지고 있다. Maven, Ivy같은 기존 저..

[Java] Java Build Tools 발전과정 - (2) Maven

04. Apache Maven ( 2004 - ) Maven은 "전문가"라는 뜻의 이디시어에서 따온 Ant의 대안 프로젝트다. Maven 프로젝트는 자바 기반 오픈소스들을 모아서 지원하기 위한 아파치의 자카르타 프로젝트 중에서 Servlet기반의 자바 웹 프레임워크인 터빈의 빌드 과정을 단순화하기 위해 시작되었다. 초기 터빈에는 몇 개의 Ant 빌드 파일이 존재했는데, Ant의 빌드 파일에는 어떠한 기준이 없으므로 서로 조금씩 달라서 어려움이 있었다. 따라서 이를 해결하기 위해 어떤 기준, 즉 프로젝트를 빌드하는 방법, 프로젝트 구성에 대한 명확한 정의, 프로젝트 정보를 게시하는 쉬운 방법, 그리고 여러 프로젝트에 걸쳐 jar파일을 공유하는 방법에 대한 기준이 필요했다. 그리고 그 결과가 Maven이다...

[Java] Java Build Tools 발전과정 - (1) Make vs Ant

자바를 빌드할 때 여러 가지 빌드 도구들을 사용할 수 있다. 현재는 Maven과 Gradle을 대표적으로 많이 사용한다. '둘 중 어느 것을 사용하는 것이 좋을까'에 대한 궁금증을 해소하기 위해 Google Trends를 이용해 두 단어의 검색량 추이를 비교해봤다. 절대적인 수치는 아니지만 사람들의 관심도를 통해 간접적으로 위 질문에 대한 해답을 얻을 수 있을 것 같다. 전세계를 상대로 검색량을 조사한 결과 2012년 Gradle 1.0이 발표된 이후 꾸준히 검색량이 증가하다가 현재는 주춤하는 모습이다. 2002년 발표된 Maven도 발표 이후 꾸준히 증가하다가 현재는 어느 정도 Gradle과 비율을 맞추고 있다. 아직까지 전세계에서는 Maven이 Gradle에 비해 3배 정도 관심도가 높은 것으로 보인..

반응형