반응형

프로그래밍 135

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

[백준] 1676. 팩토리얼 0의 개수

문제 https://www.acmicpc.net/problem/1676 1676번: 팩토리얼 0의 개수 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. www.acmicpc.net 일반적인 팩토리얼 구현 및 String 파싱 문제지만 N의 범위가 500까지다. 수가 매우 커질 수 있기 때문에 자료형에 대한 고려가 필요하다. 전략 01. 일반적인 풀이 N에 해당하는 팩토리얼을 구한 뒤 10으로 나눈 나머지가 0이 아닐 때까지 카운트하기 풀이 Java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigInte..

[백준] 1541. 잃어버린 괄호

문제 https://www.acmicpc.net/problem/1541 1541번: 잃어버린 괄호 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 www.acmicpc.net 값을 최소로 만들기 위해 괄호를 어떻게 쳐야 되는지 구하는 문제. 빼기(-)를 기준으로 수들을 나눈 뒤 각각 더해서 빼주면 되는 문제다. 전략 01. 파싱 계산식을 뭐 어떻게 하라. 이런 문제는 보통 파싱만 잘해도 풀린다. 괄호를 쳐서 최소값을 구해야 하므로 - 로 묶을 수 있는 묶음을 최대한 크게 해야 한다. 따라서 -에서 다음 -가 나올 때까지의 모든 수를 묶어서 괄호를 치면 그 수..

[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는..

반응형