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
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
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가 출력되어야 한다.
정수 타입 (byte, short, int, long)
실수 타입 (float, double)
논리 타입 (boolean)
문자 타입 (char)
boolean, number, string, null, undefined
var curstr = '!';
while(...) {
result.push(curstr);
curstr += '!';
}
// result : ['!', '!!', '!!!', ...]
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이 원시타입이 아니기 때문에 리스트 안에 다 같은 값이 들어가야 되는게 아닐까?
for(...){
result.add(curStr);
curStr += "!";
}
// result : ["!", "!!", "!!!", ...]
-> String 객체의 특징 : String 객체는 불변, 문자열 변경시 새로운 객체 생성(new 생략)
// 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()