on
[JAVA] 자바의 정석 기초편 [Ch03] - Always From The Ground Up
[JAVA] 자바의 정석 기초편 [Ch03] - Always From The Ground Up
서문
자바의 정석 기초편 챕터 3편을 기재합니다.
목적은 공부한 내용을 기록하는 것에 있기 때문에 완전한 문장이 아닐 수도 있습니다.
참고 자료 자바의 정석 기초편 강좌 : https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
본문
자바의 정석 ( CH.3 )
연산자
연산자 : 연산을 수행하는 기호 "+ - * /" 등등
: 연산을 수행하는 기호 피연산자 : 연산의 연산 수행 대상 x + 3 = x, 3 피연산자 "+" 연산자
: 연산의 연산 수행 대상
"모든 연산자는 연산결과를 반환한다."
연산자 종류
종류 연산자 설명 산술 연산자 + - * / % >> <<(비트연산) 사칙연산과 나머지 연산(%) 비교 연산자 > < >= <= == != 크고 작음과 같고 다름을 연산 논리 연산자 && || ! (& | ^ ~) '그리고(and)'와 '또는(or)'으로 조건 연결 대입 연산자 = 우변의 값을 차변에 저장 기타 연산자 (type) ?: intanceof 형변환 연산자, 삼항 연산자, instanceof 연산자
연산자 우선순위 하나의 식에서 연산자가 둘 이상이 나왔을 때 어떤 연산자를 우선적으로 연산처리할 것인지 결정
종류 결합규칙 연산자 우선순위(위 높음 / 아래 낮음) 단항 연산자 <-------- ++ -- + - ~ ! (type) 높음 산술 연산자 --------> * / % + - << >> 비교 연산자 --------> < > <= >= instanceof == != 논리 연산자 --------> & ^ | && || 삼항 연산자 --------> ?: 대입 연산자 <-------- = += -= *= /= %= <<= >>= &= ^= |= 낮음
연산자의 결합규칙 산술 > 비교 > 논리 > 대입. 대입이 가장 마지막에 수행 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높음 단항 연산자와 대입 연산자를 제외하고 모든 연산은 왼쪽에서 오른쪽으로 진행
증감 연산자
증가 연산자 ( ++ ) : 피연산자의 값을 1 증가시킨다.
감소 연산자 ( -- ) : 피연산자의 값을 1 감소시킨다.
타입 설명 사용 전위형 값이 참조되기 전에 증가 j = ++i; 후위형 값이 참조된 후에 증가 j = i++;
"증감 연산자가 독립적으로 사용되었을 때, 전후위형의 차이는 없다."
// 전위 int j = ++i ; ++i; int j = i; // ---------------- // 후위 int j = i++; int j = i; i++;
형변환 연산자
변수 또는 상수의 타입을 다른 타입으로 변환할 때 사용하는 연산자
(바꿀 타입) 피연산자;
double d = 85.4; int score = (int) d; // 이 때 d 값이 변하는 건 아니다. 표현할 때만 바꾸는 것 System.out.println(score); // 85
형변환 예시
변환 수식 결과 int -> char (char)65 'A' char -> int (int)'A' 65 float -> int (int)1.6f 1 (cut) int -> float (float)10 10.0f
자동 형변환
컴파일러가 형변환을 해주는 것, 즉 타입이 다를 때 조건(작은 범위 타입을 큰 범위의 타입에 대입할 때)이 가능하면 형변환한 값을 저장
float f = 1234; // 작은 범위의 타입을 큰 타입으로 넣을 때는 자동으로 형변환을 컴파일러가 해줌 float f = (float)1234; ------------------------ int i = 3.14f; // 에러, 큰 범위의 타입을 작은 타입으로 하려면 자동 형변환 해주지 않는다. 값 손실 발생
"기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."
byte(1byte) -> short(2byte), char(2byte) -> int(4byte) -> long(8byte, $10^{19}$) -> float(4byte, $10^{38}$) -> double(8byte)
예외, 큰 타입에서 작은 타입으로 바꿀 경우
byte b = 100; byte b = (byte)100; // byte의 범위는 -128 ~ 127이기 때문에 데이터 손실 없이 대입이 가능하고 컴파일러가 자동 형변환을 해준다. --------------------------------------- int i = 100; byte b = i; // 에러, 변수이기 떄문에 상수일 때랑 다르다. 컴파일러는 변수 안에 값을 알지 못하기 때문에 byte b = (byte)i; --------------------------------------- byte b = 1000; // 에러, byte 타입의 범위를 넘었기 때문에 자동 형변환 x byte b = (byte)1000; // b에 -24가 대입된다.
사칙 연산 int / int = int 10 / 4 = 2 float / int = float ( 어느 한 쪽이라도 float면 float ) 10.0 / 4 = 2.5
산술 변환
연산 전에 피연산자의 타입을 일치시키는 것 두 피연산자의 타입을 같게 일치(보다 큰 타입으로) long + int = long + long = long long + long = long float + int = float + float = float float + long = float + float = float double + float = double + double = double 피연산자의 타입이 int보다 작은 타입이면 int로 변환 byte + short = int + int = int char + short = int + int = int char - char = int - int = int
int a = 2_000_000; int b = 1_000_000; long c = a * b; // 이 때 이상한 값이 나옴. 이미 a * b 일 때 int의 범위를 넘어선 값이 나오기 때문에 이때는 a나 b를 long으로 형변환하여 해결 long c = (long) a * b;
반올림 - Math.round()
실수를 소수점 첫 번째 자리에서 반올림 ( default )해서 정수로 반환
double pi = 3.141592; System.out.println(pi * 1000); // 3141.592 System.out.println((int)(pi * 1000)); // 3141 System.out.println((int)(pi * 1000)/1000.0); // 3.141
나머지 연산
오른쪽 피연산자로 나누고 나머지를 반환
나누는 피연산자가 0이 아닌 정수만 허용(부호는 무시)
int x = 10; int y = 8; System.out.println("%d를 %d로 나누면
", x,y); System.out.println("몫은 %d이고 나머지는 %d입니다.", x/y,x%y); > 10을 8로 나누면 > 몫은 1이고 나머지는 2입니다.
비교연산자
<, >, <=, >=, ==, !=
두 피연산자를 비교해 true와 false를 반환함
비교연산자 연산결과 > 차변의 값이 크면 true 아니면 false < 차변의 값이 작으면 true 아니면 false >= 차변의 값이 크거나 같으면 true 아니면 false <= 차변의 값이 작거나 같으면 true 아니면 false
비교연산자 연산결과 == 두 값이 같으면 true 아니면 false != 두 값이 다르면 true 아니면 false
문자열 비교
문자열 비교에는 == 대신 equals()를 사용해야 한다. == : 주소비교 equals() : 값 비교
String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); // true System.out.println(str1.equals(str2)); // true String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1==str2); // false, 주소를 비교 System.out.println(str1.equals(str2)); // true, 대상의 값을 비교
논리 연산자
조건식을 연결할 때 사용하는 연산자
||(or연결) : 피연산자 중 하나라도 true면 true의 결과를 반환
&&(and연결) : 피연산자 둘 다 true면 true 아니면 false를 반환
예시) x는 10보다 작고 5보다 크다.
x = 10 일 때, $5
$5
!는 부정 연산
true -> false
false -> true
boolean x = true
!x = false
!!x = true, 이 때 안쪽 !부터 연산처리가 된다. 단항연산자라서
조건 연산자
조건식의 결과에 따라 연산의 결과가 달라짐
조건식(조건판단) ? 식1(참) : 식2(거짓)
(x > y) ? x : y 이라고 할 때, x가 y보다 크면 x를 반환, 아니면 y가 반환된다.
대입 연산자
오른쪽의 피연산자의 값을 왼쪽 피연산자에 저장하는 연산자
lvalue = 왼쪽 피연산자, 공간이어야 함
rvalue = 오른쪽 피연산자, 값이어야 함
복합 대입 연산자
+=, -=, *=, /=, %=, <<=, >>=, &=, |=
x += 1 -> x = x + 1와 동일
자바의 정석 ch3에서는 연산자의 정의와 특성 및 종류들, 형변환에 대해 배웠습니다.
from http://orangebluestyle.tistory.com/35 by ccl(A) rewrite - 2021-12-23 00:27:51