Call By value: 값에 대한 복사
Call By Reference: 참조 자체를 전달. 참조 자체를 넘겨서 원본을 직접 변경 가능
public class main
{
public static void main(String[] args)
{
Sample sample = new Sample();
int var = 1; // primitive 타입 변수 int
int[] arr = { 1 }; // reference 타입 변수 int[] 배열
// 변수 자체를 보냄 (call by value)
add_value(var);
System.out.println(var); // 1 : 값 변화가 없음
// 배열 자체를 보냄 (call by reference)
add_reference(arr);
System.out.println(arr[0]); // 101 : 값이 변화함
}
static void add_value(int var_arg) {
var_arg += 100;
}
static void add_reference(int[] arr_arg) {
arr_arg[0] += 100;
}
}
원시 타입 → 값 복사 → 원본 불변
참조 타입 → 참조값 복사 → 같은 객체 수정 가능
C언어는 포인터를 통해 주소값을 가져와 엑세스 가능
자바에서는 주소값 복사를 통해서만 이용가능
비슷한 거 아닌가? -> Call By Reference는 참조 자체를 넘김.참조값 복사 x
public class CallByExampleTest {
@Test
void referenceTest() {
// 스택에 참조값인 arr 지역변수, 힙에 { 10 }
int[] arr = { 10 }; // 0x001
// 참조값 복사해서 넘김. 스택에 참조값인 arrArg 지역변수, 0x001
newArr(arr);
assertThat(arr[0]).isEqualTo(10);
}
void newArr(int[] arrArg) {
// 새 배열 객체 힙에 생성. arrArg 참조값변경
arrArg = new int[]{ 20 }; // 0x002
}
}
/*
Call By Reference
void newArr(int[] arrArg) {
arrArg = new int[]{ 20 }; // 원본 arr도 바뀌어야됨. 동일한 메모리위치, 직접 조작 가능.
}
*/
System.currentMillis: 현재시간과 UTC 차이. 밀리세컨드 값 반환(날짜와 날짜사이 갭 측정)
long curLong = System.currentTimeMillis();
System.out.println(curLong);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); // HH 24시간 hh 12시간
String curTime = sdf.format(new Date(curLong));
System.out.println(curTime);
// 시간을 측정할 실행 코드
long endLong = System.currentTimeMillis();
// 밀리초 -> 초 변환
double seconds = (endLong - curLong)/1000;
System.out.println(seconds);
System.nanoTime: 10억분의 초. JVM이 시작시간 - 종료시간 long타입으로 반환(개발한 프로그램의 실행시간 구할 때 사용_성능 측정)
long startTime = System.nanoTime();
// 시간을 측정할 실행 코드
long endTime = System.nanoTime();
long runTime = endTime - startTime;
// 나노초 -> 초 변환
double seconds = (endTime - startTime) / 1000000000.0;
System.out.println(seconds);