상수란, 변하지 않는 수를 뜻하며.
변수와 달리 값을 단 한번만 초기화가 가능하다.
초기화란, 변수 또는 상수를 선언 한 후 첫 값을 대입해주는 것을
초기화라고 한다.
리터럴은 데이터 그 자체를 뜻 한다. 변수에 넣는 변하지 않는 데이터를 의미하는 것이다.
예를 들어, int a = 3; 이란 값이 있다면,
int는 자료형
a는 변수
3은 리터럴을 의미한다.
System.out.println(3147483647 + 3147483648); //에러남
기본 연산을 할때는 int형으로 연산이 이루어지는데,
따로 선언을 하지 않아도 정수값 리터럴을 입력받았을땐 int형으로
자동 메모리 할당이 된다.
하지만 int형이 표현할수있는 범위인 21억~(생략)을 넘겼기때문에
연산이 되지 않고, 에러가 발생하게 된다.
이때 "명시적 형변환"을 사용해서 연산할 정수값들을 long타입으로 변환해주어야 한다.
수정 예 : System.out.println(3147483647L + 3147483648L);
자료형의 크기가 큰 방향쪽으로 형 변환이 자동으로 이루어지는것을 의미한다.
자동 형변환 규칙에 부합하지는 않지만, 형 변환이 필요한 상황에 사용할때 명시적으로 표기해주는 변환방법을 의미한다.
int a = 3;
int b = 4;
double result = a / b;
System.out.println(result);
정확히 말하자면 문법 상의 에러는 없다.
실행도 된다. 하지만 return 되는 값이 원하던 값이 아닌
0.75가 아닌 0이 return이 된다.
a/b를 연산할때 일단 정확히 0.75로 값이 도출되는건 맞으나,
문제는 순서상 a/b를 연산 한 후, 기본 자료형이 int이기 때문에 강제적으로 자동 형변환이 이루어져 몫이 0이고, 이하 소숫점은 버려진다.
따라서 대입할때 0이란 값이 반환되며, result를 저장하는 자료형이 double이기 때문에 정확히는 0.0이 반환이 되는 것이다.
이때도 0.75라는 값을 return받고 싶다면, "명시적 형변환"을 통해서
double result = (double) a / b;
로 수정해주어야 우리가 원하던 실행결과인 0.75가 도출된다.
이스케이프 시퀀스란, 화면상의 어떤 상황 또는 상태를 표현하고자 했을때
사용하는 문자를 뜻한다.
종류에는 '\b', '\t', '\\', '\'', '\"', '\n', '\t'
등이 있으며, '\t'는 탭, '\n'은 개행을 뜻한다.
System.out.println('A');
System.out.println('A' + 'A');
65
130
A라는 값은 아스키(ASCII)코드 값으로 65라는 정수 값을 가지고 있다.
따라서 65 + 65 = 130이란 값이 도출된다.
만약 A 또는 AA라는 값을 출력해주고싶다면
System.out.println("A");
System.out.println("A"+'A');
등으로 자동 형변환이 이루어지게 유도하는 방법이나, 아예 따로 문자열로 출력되게 해주면 된다.
첨부한 이미지와 같이 결합방향에는 왼쪽과 오른쪽이 있다.
말 그대로, 실행했을때 결합방향이 왼쪽이라면 왼쪽부터,
오른쪽이라면 오른쪽부터 실행된다는 뜻이다.
또한, 우선순위가 높은 순서대로 가장 먼저 실행된다.
예시↑
a라는 변수가 있다면,
1 < a < 100으로 표현하지 않고,
&&라는 논리 연산자를 이용해
1 < a && a < 100 등으로 표현한다.
result = ((num2 % 2) ==0) || ((num2 % 3) == 0);
&&은 논리 연산자에서 AND를 뜻하며, 피연산자들의 값들이 모두 참일때만 true, 아니라면 false를 반환한다.
||은 논리 연산자에서 OR을 뜻하며, 피연산자들의 값들중 하나 이상이 참이라면 true, 전부 거짓이라면 false를 반환한다.
class SCE {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
boolean result;
result = ((num1 += 10) < 0) && ((num2 += 10) > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2 + '\n');
result = ((num1 += 10) > 0) || ((num2 += 10) > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
결과값 예측 : false, 10, 10 / true, 20, 20
실제 출력값 : false, 10, 0 / true, 20, 10
이런 결과값이 나오는 이유는, AND 논리연산자의 조건을 검사한 후 첫번째 결과가 거짓이라면 무조건 false가 반환되기 때문에 뒷부분의 조건 자체를 검사하지 않기 때문에 두번째 식에 num2에는 10이 대입이 되지 않는다.
그러나 OR 연산자를 사용한다면 결과가 참이건 거짓이건 무조건 마지막 조건까지 검사하기때문에 num2에 10이 더해진다.
short num1 = 3 ;
short num2 = -num1;
-num이란 연산 자체는 (-1)*(num)을 의미한다.
기본적으로 연산할때 int형으로 연산되기때문에 형변환이 이루어지지 않으면, short와 int형의 연산으로 취급되기때문에 명시적 형변환을 해주면 된다.
short num1 = 3;
short num2 = (short)-num1;
전위연산자는 처리되기 전에 미리 값을 증가시키고,
후위연산자는 처리된 후에 값을 증가시킨다.
&,|,^,~
& : 비트 단위로 AND 연산을 한다.
| : 비트 단위로 OR 연산을 한다.
^ : 비트 단위로 XOR 연산을 한다.
~ : 비트 단위로 NOT 연산을 한다.
현재 값의 비트값에서
"a >> 2" 이라면 a의 비트값을 두번 오른쪽으로 이동시킨다.
예 : a가 0000 1000 = 8이라면
0000 0010 = 2로 변환된다
"a << 3" 이라면 a의 비트값을 세번 왼쪽으로 이동시킨다.
같은 원리로 a가 0000 1000 = 8이라면
0100 0000 = 64로 변환된다.
class AssignSteResult {
public static void main(String[] args) {
int num1 = 10, num2 = 20, num3 = 30;
num1 = num2 = num3;
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
출력값 예측 :
30
30
30
class SCE {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
boolean result;
num1 += 10;
num2 += 10;
result = (num1 < 0) && (num2 > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2 + '\n'); //+ "\n"??
num1 += 10;
num2 += 10;
result = (num1 > 0) || (num2 > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
출력값 예측 :
result = false
num1 = 10
num2 = 10
result = true
num1 = 20
num2 = 20
class AddNum {
public static void main(String[] args) {
int result = 3 + 6;
System.out.println("3 + 6 = " + result);
result += 9;
System.out.println("3 + 6 + 9 = " + result);
result += 12;
System.out.println("3 + 6 + 9 + 12 = " + result);
}
}
출력값 예측 :
3 + 6 = 9
3 + 6 + 9 = 18
3 + 6 + 9 + 12 = 30
결과값 :
240
80