[JAVA]Call By Value

이권민·2025년 12월 7일

목차

  1. Call By Value vs Call By Reference
  2. currentMillis() vs nanoTime()

Call By Value vs Call By Reference

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;
    }
}
  • 원시 타입 → 값 복사 → 원본 불변

  • 참조 타입 → 참조값 복사 → 같은 객체 수정 가능

자바는 Call By Reference가 없음.(포인터 접근x)

  • C언어는 포인터를 통해 주소값을 가져와 엑세스 가능

  • 자바에서는 주소값 복사를 통해서만 이용가능

    • 원시값이 복사되느냐, 주소값이 복사되느냐의 차이
    • 원시타입은 stack, 참조타입은 Heap, stack에 있는 변수가 객체의 주소값 가짐.
    • 참조값 복사 시 stack영역에 생성되지만 Heap영역에 같은 객체 바라봄.
  • 비슷한 거 아닌가? -> 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도 바뀌어야됨. 동일한 메모리위치, 직접 조작 가능.
}


*/

currentMillis() vs nanoTime()

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타입으로 반환(개발한 프로그램의 실행시간 구할 때 사용_성능 측정)

  • 서버 간 통신시간 측정에는 사용x.JVM마다 측정 기준값 다름.
long startTime = System.nanoTime();

// 시간을 측정할 실행 코드

long endTime = System.nanoTime();

long runTime = endTime - startTime;

// 나노초 -> 초 변환
double seconds = (endTime - startTime) / 1000000000.0;
System.out.println(seconds);

참조

profile
이것저것이것 개발자

0개의 댓글