티스토리 뷰

728x90

서문



자바의 정석 기초편 챕터 3편을 기재합니다.
목적은 공부한 내용을 기록하는 것에 있기 때문에 완전한 문장이 아닐 수도 있습니다.









본문


자바의 정석 ( CH.3 )


연산자


  • 연산자 : 연산을 수행하는 기호
    • "+ - * /" 등등
  • 피연산자 : 연산의 연산 수행 대상
    • x + 3 =
      • x, 3 피연산자
      • "+" 연산자

"모든 연산자는 연산결과를 반환한다."




  • 연산자 종류
종류 연산자 설명
산술 연산자 + - * / % >> <<(비트연산) 사칙연산과 나머지 연산(%)
비교 연산자 > < >= <= == != 크고 작음과 같고 다름을 연산
논리 연산자 && || ! (& | ^ ~) '그리고(and)'와 '또는(or)'으로 조건 연결
대입 연산자 = 우변의 값을 차변에 저장
기타 연산자 (type) ?: intanceof 형변환 연산자, 삼항 연산자, instanceof 연산자


  • 연산자 우선순위
    • 하나의 식에서 연산자가 둘 이상이 나왔을 때 어떤 연산자를 우선적으로 연산처리할 것인지 결정
종류 결합규칙 연산자 우선순위(위 높음 / 아래 낮음)
단항 연산자 <-------- ++ -- + - ~ ! (type) 높음
산술 연산자 --------> * / % + - << >>
비교 연산자 --------> < > <= >= instanceof == !=
논리 연산자 --------> & ^ | && ||
삼항 연산자 --------> ?:
대입 연산자 <-------- = += -= *= /= %= <<= >>= &= ^= |= 낮음


  • 연산자의 결합규칙
    1. 산술 > 비교 > 논리 > 대입. 대입이 가장 마지막에 수행
    2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높음
    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로 나누면 \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를 반환


  1. 예시) 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에서는 연산자의 정의와 특성 및 종류들, 형변환에 대해 배웠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함