gi_dor

[Java] CH3 연산자 (Operator) 본문

First/Java

[Java] CH3 연산자 (Operator)

기돌 2023. 1. 5. 00:51
728x90

 


1. 연산자와 피연산자

1-1

▪ 연산자 : 연산을 수행하는 기호   + , - , * ,/
▪ 피연산자 : 연산자의 연산 수행대상

1-2 연산자의 종류

 

2. 연산자 우선순위와 결합규칙

"하나의 식에 연산자가 2개 이상 있을때 , 어떤 연산을 먼저 수행할지 자동결정 하는것"
▪ 산술  (+,-)  >  비교 (< , >)  논리 (&& , ||)  > 대입 ( = )   , 대입은 제일 마지막에 수행된다
▪ 단항 (1) > 이항 (2) > 삼항 (3) 단항 연산자의 우선순위가 이항 연산자 보다 높다.
▪ 단항 연산자와 대입연산자를 제외한 모든 연산자의 진행방향은 왼쪽에서 -> 오른쪽이다

 

3. 증감연산자 , 부호연산자

증가 연산자(++) 피연산자의 값을 1증가 시킨다
감소 연산자 (--) 피연산자의 값을 1 감소 시킨다
전위형  값이 참조되기 전에 증가  j = ++i;
후위형 값이 참조된 후에 증가 j = i++;

3 - 1 증감 연산자

증감 연산자가 포함된 식을 이해하기 어려울 때는
증감 연산자를 따로 떼어내면 이해하기 쉬움

▶ 전위형의 경우 증감 연산자를 식의 이전으로
j = i++;   //전위형   →  ++i;   // 증가후에
                                   j = i;   // 참조하여 대입

▶ 후위형의 경우 증감 연산자를 식의 이후로 
j = ++i; // 후위형   →  j = i;   // 참조하여 대임
                                  i++;    // 증가

 


3 - 2 부호 연산자

' - ' 는 피연산자의 부호를 반대로 변경
' + ' 는 아무런 일도 하지 않는다  (실제로 사용 x)

 

 


4. 형변환 연산자 , 자동 형변환

4 - 1 형변환 연산자

변수 또는 상수의 타입을 다른 타입으로 변환하는것  
( 타입 ) 피연산자

double  d    =  85.4 ;             //d = 85.4
int score = ( int ) d ;            // int  는 4byte , double 은 8 byte 

▶ int score = ( int )85.4;        
▶ int score = 85;      // 정수는 소수점 자리 삭제

 


오류 :

해결방법: 무슨 뜻인지 몰라서 스택오버플로우  "how can int to float   in java" 검색 
다른 글을봐도 문법이 맞는데 에러,  혹시나 하고  " system.out.println() " 손 타이핑 

 

4 - 2  자동 형변환

서로 다른 타입간의 대입이나 연산을 할때 , 형변환으로 타입을 일치 시키는 것이 원칙이다.
그러나 경우의 따라 편의상의 이유로 형변환을 생략 할수가 있다

floar f = 1234;   
▶ 형변환 생략
▶ int 타입의 값을 float타입의 변수에 저장
▶ float f = (float) 1234; 에서 ( float )생략 

int i = 3.14f;
▶ int i = 3.14f; 에러
▶ int i = (int)3.14f;   , 수동형변환






형변환을 하는 이유는 주로 서로 다른 두 타입을 일치 시키기 위해서이다.
형변환을 생략 하려면 컴파일러가 알아서 자동적으로 형변환을 한다 

" 기존의 값을 최대한 보존할수 있는 타입으로 자동 형변환 된다"

표현 범위가 좁은타입에서 넓은타입 으로 형변환하는 경우 값 손실이 없으므로 
두 타입 중 표현범위가 더 넓은 쪽으로 형 변환된다

byte b = 100;   // byte 타입의 범위 ( -128 ~ 127 )
byte b = (byte)100;   

int i = 100;
byte b = i ;   // 에러  int 타입을 byte 타입에 대입
byte b = (byte)i;    // byte 타입으로 형변환하여 대입

 

byte b = 1000;  // 에러   byte 타입의 범위를 벗어난 값의 대입( -128 ~ 127 )  
byte b = (byte)1000;    // ok, 형변환 과정에서 값손실이 발생해서 변수 b에는 -24가 저장됨


1. 사칙연산자 , 산술 변환

1 - 1 사칙연산자

10  /  4   →  2       
int  /  int  →  int     // 답은2.5이지만 소수점 이하는 버려짐 , 같은 타입끼리 만 계산할수 있음.

10 / 4.0f  →  10.0f  /  4.0f  →   2.5f 
int / float  →   float  /  float  →  float  

 

1 - 2 산술변환

연산 전에 피연산자의 타입을 일치 시키는것

▶ 두 피연산자의 타입을 같게 일치시킨다 (큰 타입으로 일치)
▪  long + int → long + long → long   ( long 8byte , int 4byte)
▪ float + int → float + float  → float   (float 4byte , lint 4byte ,  크기는 float가 더큼)
▪ double  + float → double + double →  double (double 8byte , float 4byte)

▶ 피연산자의 타입이 int 보다 작은 타입이면 int로 변환한다 (int보다 작은 타입 :  byte , char , short)
▪ byte + short → int + int → int (byte 1byte , short 2byte )
▪ char + short → int + int → int (char 2byte , short 2byte)

byte  : - 128 ~127
char : 0 ~ 6만
short :  -3만 ~ 3만


long으로 형 변환 하기


2. 반올림 Math.round(),  나머지 연산자

2-1 반올림 Math.round()

실수를 소수점 첫째 자리에서 반올림한 정수를 반환

ex ) long result = Math.round(4.52);   //  result 에 5가 저장된다 

 

2-2 나머지 연산자 %

오른쪽 피연산자로 나누고 남은 나머지를 반환
나누는 피연산자는 0이 아닌 정수만 허용 (부호 는 무시됨)


1. 비교 연산자 , 문자열의 비교

1 - 1 비교 연산자 > , <  , >=  , <=  ,  ==   ,  !=

두연산자를 비교해서 true  또는 false 를 반환
> 좌변 값이 크면 true , 아니면 false
< 좌변 값이 작으면 true , 아니면 false
>= 좌변 값이 크거나 같으면  true, 아니면 false
<= 좌변 값이 작거나 같으면 true , 아니면 false
== 두 값이 같으면 true , 아니면 false
!= 두 값이 다르면 true , 아니면 false 

1 - 2  문자열의 비교

문자열 비교에는 == 대신 equals()를 사용해야한다.

Ex ) 

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

2. 논리 연산자 , 논리 부정 연산자

2 - 1 논리 연산자 &&  ||

조건식을 연결할 때 사용하는 연산자
|| (OR 결합) : 피연산자 중 어느 한쪽이 true이면 true를 결과로 얻는다
&& (AND 결합) :  피연산자 양쪽 모두 true 이어야 true 를 결과로 얻는다
x y x || y x && y
true true true true
true false true false
false true true false
false false false false

 

1)
▪ x는 10보다 크고 20보다 작다
x > 10 와 x < 20  (그리고)로 연결된 조건이므로 다음과 같이 쓴다
→ x > 10  && x <  20 

▪ x > 10 은 10 < x 와 같으므로 이렇게 쓸 수도 있다 보통 변수를 왼쪽에 쓰지만 이렇게 쓸 경우
가독성 측면에서 아래의 식이 더 나을수가 있다
→ 10 < x && x < 20   (  10 < x < 20 한번에 작성 불가  반드시 논리 연산자 사용하기)

2) 
▪  i 는 2의 배수 또는 3의 배수이다
= 어떤 수가  2의 배수 라는 얘기는 2로 나누었을 때 나머지가 0 이라는 뜻이다

나머지 연산의 결과가 0 인지 확인하면 된다.  ' 또는 ' 으로 두 조건이 연결 되었으므로 
논리 연산자 ' || '  (OR) 를 사용해야 한다
→ i%2 == 0 || i%3 == 0
      → i의 값이 8 일 때, 다음처럼 연산된다

▪ i%2==0 || i%3==0
▪ 8%2==0 || 8%3==0
▪ 0==0 || 2==0
▪ true || false
▪ true

 

3)
▪ i 는 2의 배수 또는 3의 배수 지만 6의 배수는 아니다
= 이전 조건에서 6의배수를 제외하는 조건이 추가되었다 
6의 배수가 아니어야 한다는조건은  i%6! = 0
(i%2 == 0  || i%3 == 0) && i%6 != 0       

▪ 식에서 괄호를 사용한 이유 :  && 가 || 보다 우선순위가 높기 때문에 괄호를 사용하지 않으면 &&를 먼저 연산한다
→ i % 2 == 0 || i%3 == 0 && i % 6 != 0       ,   i %2 == 0 || ( i % 3 == 0 && i % 6 != 0 )    두 식은 같은의미 , 동일함.

4) 
▪ 문자 ch 는 숫자 ( '0' ~ '9' )이다
사용자로부터 입력된 문자가 숫자 ('0' ~ '9')인지 확인 하는 식

'0' <= ch && ch <= '9'
유니코드에서 문자 '0' 부터 '9' 까지 연속으로 배치되어 있기 때문에 가능하다 

▪ 문자 '0' 부터 문자 '9' 까지의 유니코드 10진수 표

 5) 문자 ch는 대문자 또는 소문자 
문자 'a' 부터 'z' 까지   'A' 부터 'Z' 까지 연속적으로 배치 되어있다.

( 'a' <= ch && ch <= 'z' ) || ( 'A' <= ch && ch <= 'Z')


2 - 2 논리 부정연산자  ( !=  ,  not )
피연산자가 true 이면 false로 
false이면 true로 바꾼다 

X !X
true false
false true

! 논리 부정연산자 = 단항연산자 ,  연산 진행 방향 ←←방향
boolean b =  true ;
!!b → !!true → !false → true
                  ( → ! !true = ! false  → !false = true )

ch < 'a' && ch > 'z'   문자 ch가  소문자가 아니다    ! ('a' <= ch && ch <= 'z') 

3. 조건연산자 , 대입연산자

3 -1  조건 연산자  ? :  

1번 조건식 true 일 경우 2
1번 조건식 false 일 경우 3


result = (x > y) ? x : y ;  

Ex)  x = 5 , y = 3 ;
result = (x > y) ? x : y ;
→ result = ( 5 > 3) ? 5 : 3 ;
→ result = ( true ) ? 5 : 3 ;
→ result = 5;


3 - 2 대입 연산자
▪ 오른쪽 피연산자를 왼쪽 피연산자에 저장후 저장된 값을 반환

→ System.out.println(x = 3);   //변수 x에 3이 저장되고
→ System.out.println(3); // 연산 결과인 3이 출력된다

▪ lvalue  : 대입 연산자의 왼쪽 피연산자
▪ rvalue : 대입 연산자의 오른쪽 피연산자
                (lvalue)     x = 3   (rvalue)
→ 대입 연산자의 rvalue 는 변수 뿐만 아니라 식이나 상수등이 모두 가능함
  lvalue는 반드시 변수처럼 값을 변경할수 있는 것이어야 한다.
리터럴이나 상수 같은 값을 저장할수 없는 것들은 lavlue가 될수가 없다 

Ex) 

  • int i = 0;  
  • 3  =  i + 3;   // 에러 , lvalue 가 값을 저장할수 있는 공간이 아님
  • i + 3 = i;  // 에러 , lavlue의 연산결과가 리터럴  (i + 3 → 0 +3 → 3)
  • flinal int MAX  = 3;  // 변수 앞에 키워드 final 을 붙여서 상수가 됨
  • MAX = 10; // 에러  , 상수 MAX에 새로운 값을 저장할수가 없음.

3 - 3 복합 대입연산자

대입 연잔사와 다른연산자를 하나로 축약

728x90

'First > Java' 카테고리의 다른 글

[Java] CH6 객체지향 개념  (0) 2023.03.13
[Java] CH5 배열  (0) 2023.01.15
[Java] CH4 조건문과 반복문  (0) 2023.01.11
[Java] CH2 변수(variable)  (0) 2022.12.27
ch1 - 자바 시작하기  (0) 2022.12.26