[java/javascript] call by value or call by reference

천진우·2021년 12월 29일
0

1. call by value & call by reference란?

1. call by value

  • 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다
  • 함수 안에서 인자 값이 변경되어도 외부에서는 변하지 않는다

2. call by reference

  • 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달
  • 함수 안에서 값이 변경되면 전달된 값이 함께 변한다.

3. 예시(c++)

call by value

void swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}

int a1 = 10;
int a2 = 20;
swap(a1, a2);
cout << "a1: " << a1 << ", a2: " << a2 << endl;

// a1: 10, a2: 20

call by reference

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int a1 = 10;
int a2 = 20;
swap(&a1, &a2);
cout << "a1: " << a1 << " a2: " << a2 << endl;

// a1: 20, a2: 10

2. java / javascript

  • call by value

swap example

public class SwapTest {
    public static void swap(int a, int b) {
        int tmp = a;
        a = b;
        b = tmp;
    }
 
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
 
        System.out.println(a + " " + b);
        swap(a, b);
        System.out.println(a + " " + b);
        
    }
}
// 결과
// 1 2
// 1 2

call by reference??

public class CallByValue {

  public static void main(String[] args) {
    Person p = new Person("name1");
    System.out.println("p.name: " + p.name);
    callByValue(p);
    System.out.println("p.name: " + p.name);
  }

  public static void callByValue(Person p) {
    p.name = "name2";
  }
}

class Person  {
  String name;

  public Person(String name) {
    this.name = name;
  }
}

// 결과
// p.name: name1
// p.name: name2

name 값이 변함 -> call by reference??
-> 주소값을 그대로 사용하는 것이 아니라 새로운 지역변수에 주소값을 복사

public class CallByValue {

  public static void main(String[] args) {
    Person p = new Person("name1");
    System.out.println("p.name: " + p.name);
    callByValue(p);
    System.out.println("p.name: " + p.name);
  }

  public static void callByValue(Person p) {
    p = new Person("name2");
  }
}

class Person  {
  String name;

  public Person(String name) {
    this.name = name;
  }
}

// 결과
// p.name: name1
// p.name: name1

-> call by reference라면 뒤에서는 name2가 출력되어야 한다.

Primitive data type -> 값 복사

java

정수 타입 (byte, short, int, long)
실수 타입 (float, double)
논리 타입 (boolean)
문자 타입 (char)

javascript

boolean, number, string, null, undefined

객체 -> 참조값 복사

예시 - 원시타입(javascript)

var curstr = '!';
while(...) {
    result.push(curstr);
    curstr += '!';
}
// result : ['!', '!!', '!!!', ...]

예시 - Date 객체(javascript)

var curDate = startDate;
while(curDate <= lastDate) {
    result.push(curDate);
    curDate.setDate(curDate.getDate() + 1);
}
// result : [lastDate, lastDate, ...]

-> 참조값을 인자로 넘겨주기 때문에 결과 리스트의 각 값들이 lastDate로 같다

var curDate = startDate;
while(curDate <= lastDate) {
    result.push(new Date(curDate));
    curDate.setDate(curDate.getDate() + 1);
}
// result : [startDate, ..., lastDate]

java에서 string을 list에 add하는 경우

=> java는 string이 원시타입이 아니기 때문에 리스트 안에 다 같은 값이 들어가야 되는게 아닐까?

for(...){
	result.add(curStr);
    curStr += "!";
}
// result : ["!", "!!", "!!!", ...]

-> String 객체의 특징 : String 객체는 불변, 문자열 변경시 새로운 객체 생성(new 생략)

기타

java / javascript 차이점

  • 문자열 비교
// java : == -> 메모리 주소 비교
    public List<PushStatisticsMeter> preprocessingChart(List<PushStatisticsMeter> resChart){
        List<PushStatisticsMeter> response = new LinkedList<>();
        ...
        for(...){
            if(response.size() != 0 && response.get(endResponse).getDate() == resChart.get(i).getDate()){
                ...
            else{
                ...
            }
        }
        return response;
    }

// response.get(endResponse).getDate() : String : "2021-01-03 07:00"
// resChart.get(i).getDate() : String : "2021-01-03 07:00"
// == 결과 : false -> 다른 객체(메모리 주소가 다름)

   public List<PushStatisticsMeter> preprocessingChart(List<PushStatisticsMeter> resChart){
        List<PushStatisticsMeter> response = new LinkedList<>();
        ...
        for(...){
            if(response.size() != 0 && response.get(endResponse).getDate().equals(resChart.get(i).getDate())){
                ...
            else{
                ...
            }
        }
        return response;
    }
// 문자열 내용 비교를 위해 equals() 사용

=> javascript : ==이 문자열 내용 비교(=== : 문자열 내용 + 자료형 비교)

주의) == : 객체에 대해서는 참조에 의한 비교

Date 객체

  • <, <=, >, >= 비교 연산자를 통해 비교 가능
  • ==은 사용 불가
var date1 = new Date('2020-10-23');
var date2 = new Date('2020-10-22');

console.log(date1 > date2);
console.log(date1 >= date2);
console.log(date1 < date2);
console.log(date1 <= date2);

// 출력
true
true
false
false


let date1 = new Date();
let date2 = new Date(date1);

console.log(date1 == date2);
console.log(date1 === date2);
console.log(date1 != date2);
console.log(date1 !== date2);

// 출력
false
false
true
true

-> getTime(), valueOf(), Number(), toString()을 통해 타입 변경 후 == 사용

date1.getTime() == date2.getTime()

0개의 댓글