티스토리 뷰
728x90
서문
자바의 정석 기초편 챕터 3편을 기재합니다.
목적은 공부한 내용을 기록하는 것에 있기 때문에 완전한 문장이 아닐 수도 있습니다.
- 참고 자료
본문
자바의 정석 ( CH.3 )
연산자
- 연산자 : 연산을 수행하는 기호
- "+ - * /" 등등
- 피연산자 : 연산의 연산 수행 대상
- x + 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
- int / int = int
산술 변환
연산 전에 피연산자의 타입을 일치시키는 것
두 피연산자의 타입을 같게 일치(보다 큰 타입으로)
- 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로 나누면 \n", 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<x<10$ 이라고 하면 안된다.
$5<x$ && $x<10$ 이라고 표현해야 한다.
!는 부정 연산
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에서는 연산자의 정의와 특성 및 종류들, 형변환에 대해 배웠습니다.
댓글