Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

Java 2장(with 자바의 정석) 본문

Java

Java 2장(with 자바의 정석)

H.S-Backend 2024. 4. 10. 21:36

연산자 (Operator)

어떠한 기능을 수행하는 기호(+, -, *, / 등)

 

피연산자(Operand)

  • 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

 

연산자의 종류

단항 연산자 
  •   + - (타입) ++  -- ~ !
이항연산자
  • 산술 : + - * / % << >> >>>
  • 비교 : > < >= <= == !=
  • 논리 : && || & ^ |
삼항 연산자
  • ? :
대입 연산자
  • = op=

 

연산자의 우선 순위

출처 : 자바의 정석

연산자의 우선순위
  • 괄호의 우선순위가 제일 높다
  • 산술 > 비교 > 논리 > 대입
  • 단항 > 이항 > 삼항
  • 연산자의 연산 진행방향은 왼쪽에서 오른쪽
  • 단, 단항, 대입 연산자만 오른쪽에서 왼쪽
Ex1 ) -x + 3    단항 > 이항
Ex2) x + 3 * y   곱셈, 나눗셈 > 덧셈, 뺄셈
Ex3) x + 3 > y -2  산술 > 비교
Ex4) x > 3 && x<5   비교 > 논리
Ex5) int result = x+ y * 3; 항상 대입은 맨 끝에 한다.

 

<<, >>, >>> 는 덧셈 연산자보다 우선순위가 낮다.
  •  x << 2 + 1  는  x <<  (2+1) 과 같다.
||,|(OR)는 &&, &(AND) 보다 우선순위가 낮다.
  •  x < -1 || x > 3 && x <5 는 x < -1 || (x >3 && x <5) 와 같다.
증감연산자 -, ++, --
  • 증가연산자(++) : 피연산자의 값을 1 증가시킨다
  • 감소연산자(--) : 피연산자의 값을 1 감소시킨다.
전위형  j = ++i; ++i;
j= i ;
값이 참조되기 전 증가시킨다.
후위형  j = i++; j = i;
i++;
값이 참조된 후에 증가시킨다.

 

부호연산자(+, -)와 논리부정연산자(!)

부호연산자(+,- )
  • '+'는 피연산자에 1을 곱하고
  • '-'는  피연산자에 -1을 곱한다.
논리부정연산자(!) 
  • true는 false로, false는 true로 피연산자가 boolean일 경우에만 가능하다.
비트전환연산자 - ~
  • 정수를 2진수로 표현했을 때  1을 0으로 0은 1로 바꾼다. 정수형에만 사용이가능하다.

출처 : 자바의정석


이항연산자의 특징

이항연산자는 연산을 수행하기 전에 피연산자의 타입을 일치시킨다.

 

  1. int보다 크기가 작은 타입은 int로 변환한다.(byte, char, short -> int)
  2. 피연산자 중 표현범위가 큰타입으로 형변환 한다.

산술변환

  • char + int -> int + int -> int
  • float + int -> float + float -> float
  • long + float -> float + float -> float
  • float + double -> double + double -> double
byte a = 10;
byte b = 20;    // byte + byte -> int + int -> int
byte c = a + b;  // Error, int값을 byte에 저장이 불가능하다

byte c = (byte)a + b; //Error
byte c = (byte)(a+b); // Ok
int a = 1000000; // 1,000,000
int b = 2000000; // 2,000,000
long c = a * b; // c는 -1454759936 원하는 값이 나오지 않음                       
//int * int -> int 이므로 long을 추가하여 형변환을 해야 원하는 값이 나온다.

//long으로 형변환 예시
long c = (long) a * b; // c는 2,000,000,000,0000
//long * ing -> long *long -> long
long a = 1000000 * 1000000; // a = -727,379,968
long b = 1000000 * 1000000L; // b = 1,000,000,000,000

int c = 1000000 * 1000000 / 1000000; // c는 -727
int d = 1000000 / 1000000 * 1000000; // d는 1,000,000
char c1 = 'a';
char c2 = c1 + 1; //에러
char c2 = (char)(c1 + 1); //ok
char c2 = ++c1; // ok

int i = 'B' - 'A'; //문자 코드로 변환하면 i = 1
int i = '2' -'0''; // 문자를 코드로 변환하면 i = 2
float pi = 3.141592f;
float shortPi = 
(int)(pi * 1000) / 1000f;                 // pi 값에 3.141592f 를 넣는다
(int)(3.141592f * 1000) / 1000f;    // 3.141592f 를 1000으로 곱한다.
(int)(3141.592f) / 1000f;                // int로 형변환한다
3141 / 1000f;                                //3141을 1000f로 나눈다.
3141.0f / 1000f                             //3141.0f를 1000f 로 나눈다
3.141f                                           //결과 값

형변환이란

작은 값을 큰값으로, 큰값을 작은값으로 넣기위한 과정

주로 서로 다른 두타입을 일치시키기 위해서
형변환을 생략하면 작은값에서 큰값은 자동형변환이 된다.
기존의 값을 최대한 보존할 수 있는 타입으로 형변환된다.

하지만 큰값을 작은값으로 변환시키려면
강제적으로 ()안에 동일 값을 써주어야 수동형변환이 가능하다.

byte(1byte) -> short(2byte)->int(4byte) -> long(8byte) -> float (4byte) -> double(8byte)

 

short 에서 char는 서로 같은 byte이지만 자동으로 되지않는다. 정수와 문자.

class Ex3_9 {
public static void main(String args[]) { 
int a = 1_000_000;    // 1,000,000   1백만 
int b = 2_000_000;    // 2,000,000   2백만 

long c = a*b ; //error
long c = (long)a * b;       // a * b = 2,000,000,000,000 ?

System.out.println(c);
        } 형변환을 위해 수동형변환을 해주어야한다.
}

Math.round() : 소수점 첫째자리에서 반올림한 값을 반환한다.

float pi = 3.141592f;
float shortPi = Math.round(pi *1000) / 1000f;     // pi 에 3.141592f 를 넣는다
Math.round(3.141592f * 1000) / 1000f;              // 3.141592f 에 1000을 곱한다
Math.round(3141.592f) / 1000f                          // 3141.592f 를 Math.round로 반올림한다.
3142 / 1000f;                                                     // 3142를 1000f로 나눈다.
3.142f                                                                //결과 값

 


나머지 연산자 (- ,%)

  • 오른쪽 피연산자로 나누고 남은 나머지를 반환한다.
  • 나누는 피연산자는 0이 아닌 정수로만 허용한다(부호는 무시된다.)
  • 홀수, 짝수 등 배수검사에 주로 사용한다.
int share = 10 / 8;             // 1
int remain = 10 % 8;        // 2
10 % 8 -> 2
10 % -8 -> 2
-10 % 8 -> -2
-10 % -8 -> -2               

쉬프트연산자 - <<, >> , >>>

  • 2ⁿ 으로 곱하거나 나눈 결과를 반환한다.
  • 곱셈, 나눗셈보다 빠르다.
x << n 은 x * 2ⁿ과 같다.
x >> n 은 x / 2ⁿ과 같다.
8 << 2 는 8 * 2²과 같다
8 >> 2는 8 / 2²과 같다.

비교연산자 (- >, <, >=, <=, == !=)

  • 피연산자를 같은 타입으로 변환한 후에 비교한다.결과 값은 true 또는 false이다.
  • 기본형 (boolean 제외) 과 참조형에 사용할 수 있으나 참조형에는 ==와 !=만 사용할 수 있다.
  • 문자열 비교에는 == 대신에 equals()를 사용해야한다.
수식 연산결과
x > y x가 y보다 클 때 true, 그외 false
x < y x가 y보다 작을 때 true, 그 외 false
x >= y x 가 y보다 크거나 같을 때 true, 그 외 false
x <= y x가 y보다 작거나 같을 때 true, 그 외 false
x == y x와 y가 같을 때 true, 그 외 false
x != y x와 y가 다를 때 true, 그 외 false
'A' < 'B' -> 65 < 66 -> true    
'0' == 0 -> 48 == 0 -> false  
'A' ! = 65 -> 65 ! = 65 -> false
10.0d == 10.0f -> 10.0d == 10.0d -> true                  //double 이 더 크므로 double로 형변환함
0.1d == 0.1f -> 0.1d == 0.1d -> ?                             //float의 함수가 double을 맞출 수 없다.
 !('a' <= ch && ch<='z')                                            // ch < 'a' || ch >'z' 보다 논리부정연산자를 사용하는것이 좋다

double d= (double) 0.1f;
Sytem.out.println(d); // 0.10000000149011612가 나온다.
(float)0.1d == 0.1f -> 0.1f == 0.1f -> true                        //double의 함수가 더 크므로 float에 맞춰야 한다.

비트연산자 -, &, | ^

피연산자를 비트단위로 연산한다. 실수형(float, double)을 제외한 모든 기본형에 사용이 가능하다.

  • OR연산자(|) : 피연산자 중 어느 한 쪽이 1 이면 1이다.
  • AND연산자(&) : 피연산자 양 쪽 모두 1이면 1이다.
  • XOR연산자(^) : 피연산자가 서로 다를 때 1이다.

출처 : 자바의 정석


논리연산자 - &&, ||

피연산자가 반드시 boolean이어야 하며 연산결과도 boolean이다. 

&&가 || 보다 우선순위가 높다. 같이 사용되는 경우 괄호( )를 사용해야 한다.

 

  • OR연산자(||) : 피연산자 중 어느 한쪽이 true이면 true 이다
  • AND연산자(&&) : 피연산자 양 쪽 모두 true 이면 true이다
  • or와 and 가 같이 들어가게 된다면 () 괄호를 해주는것이 좋다.
  • 논리 부정 연산자 (!)true를 false로 false는 true로 바꿔준다.

출처 : 자바의 정석

int i = 7;
i > 3 && i < 5                       // 3보다 크다(ture) "그리고"  5보다 작지않다. (false) -> false
i > 3 || i < 0                          // 3보다 크다 (true) "또는" 0보다 작지않다 (false) -> true 

char x = 'j';
x >= 'a' && x<= 'z'               // 'a' 보다 크거나 같다 (ture) "그리고" z 보다 작거나 같다 (true) -> true
(x >='a' && x<='z') || (x >= 'A' && x<='Z') 
// a보다 크고 z보다 작다(true)  "또는" A보다 크거나 같지않고 Z보다 작다 (false) -> true

 


조건연산자

삼항연산자 (-?, :)

조건식의 연산결과가 true이면 '식1'의 결과를 반환하고 false이면 '식2'의 결과를 반환한다.
(조건식)? 식1:식2

 

int x = -10;                                           // x 는 -10
int absX = x >=0 ? x : -x;                     // x는 -10, -x는 10  absX 의 결과는 ?
-x                                                         // x가 0보다 작아서 결과는 -x
//if문과 같다.

if(x >=0) {
   absX = x;
} else {
   absX = -x;
}
-x // 위와 같다.

 

int score = 50;
char grade = score >= 90?  'A' : (score >= 80? 'B':'C');
C                                                       // A는 90, B는 80이기에 score는 50이므로 C 

if(score >= 90){
  score = A;
} else if (score >=80){
  score = B;
} else {
  score = C;

C                                                        // 위와 같다.

대입연산자( -, = ,op=)

오른쪽 피연산자의 값을 왼쪽 피연산자에 저장한다.
단, 왼쪽 피연산자는 상수(고정값)가 아니어야 한다.

복합 대입 연산자

대입 연산자와 다른 연산자를 하나로 축약한 표

출처 : 자바의 정석

int i = 0;
i = i + 3;                                 //0이였던 i 에서 3을 더해 i 는 3이 되었고


final int MAX = 3;                    
MAX = 10;                         //마지막에 상수로 변경이 되었으므로 10의 값을 입력할 수 없다.

 

반응형