We don't need to discuss about historic meaning too much.
이 챕터에서 가장 기억해야할 컴퓨터 원리는 2가지이다.
1. 연산자에는 hierarchy가 있다는 것이다. 최고 대빵은 등호(=)이다. 그래서, 반드시 등호를 중심으로 오른쪽으로 간다. 그 개념을 기억해야한다.
2. 그리고 등호를 중심으로 오른쪽으로 갈 때 가능한 linear하게 간다. 좀 더 정확하겐 동등한 연산자끼리는 왼쪽에서 오른쪽으로 읽어내려간다.
3. 제일 중요! 연산자의 순서가 반드시 있다. 근데 이건 수학과 매우 다르다. 컴퓨터는 각 데이터의 저장소가 있고, 기록하면서 내려간다는 것을 명심해라.
- 컴퓨터는 아무리 객체지향이라 할지라도, 양자컴퓨터가 아닌 이상 모든 line을 그 순서에 맞게 저장하고 내려간다.
특히, 여기서 3번의 개념이 가장 헛갈리는데,
대표적인 것이 아래의 개념이다. a와 b모두 초기값 0이었다고 가정하자.
int c = a++;
int d = ++b;
System.out.println(a,b,c,d);
// a : 1 , b : 1, c : 0 d : 1
왜 C는 혼자 동떨어져서 0으로 표기가 되는 걸까? 직관적인 수학개념으로 볼 땐 a와 b둘다 1씩 추가하고 저장하라는 거니깐, a,b,c,d모두 1이 아닐까?
컴퓨터는 아무리 객체지향이라 할지라도, 양자컴퓨터가 아닌 이상 모든 line을 그 순서에 맞게 저장하고 내려간다. c에 a의 값을 저장하고, ++ 연산자를 만났기 때문에 a에 1을 추가해서 a에 저장한 것이다.
논리와 비트 연산자 차이.
삼항연산자
삼항 연산자는 T / F 구간에 반드시 값 혹은 조건문만 들어갈 수 있습니다.
자주하는 실수
(sum >= 90) ? grade = "VIP" : (sum >= 70) ? grade = "Gold" :grade = "silver";
올바른 것.
grade = (sum >= 90) ? "VIP" : (sum >= 70) ? "Gold" : "silver";
조건이 여러 요인이 있을 땐 이렇게 줄칸을 나눠주는 게 가독성이 좋을 것이야.
grade2 = (gender.equals("M")) ?
((score >= 90) ? "MVIP" : (score >= 80) ? "MGOLD" : "MNORMAL") :
((score >= 90) ? "FVIP" : (score >= 80) ? "FGOLD" : "FNORMAL") ;
소수점 이하
avr = (double) sum / 4 ; // 소수점 이하가 날라감. int값 avr = (double) sum / 4.0; // 소수점 이하가 남음.
int를 double로 바꿔주는 경우...
avr = sum / (cnt * 1.0 )