일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SQL
- 반복문
- 오버로딩
- SpringSecurity 로그아웃
- spring 게시판 삭제
- StringBuffer
- 친절한 SQL 튜닝
- SQL 튜닝
- 객체
- 연산자
- java
- 친절한 SQL
- 객체지향
- 함수
- 스프링시큐리티 로그아웃
- 상속
- SpringSecurity 로그인
- 배열
- 자바의정석
- 오버라이딩
- 인텔리제이 Web 애플리케이션
- 예약어
- 비교 연산자
- SQL튜닝
- join
- 산술 연산자
- 식별자
- @PreAuthorize("isAuthenticated()")
- 논리 연산자
- 이클립스 설치
- Today
- Total
gi_dor
[Java] CH3 연산자 (Operator) 본문
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 복합 대입연산자
대입 연잔사와 다른연산자를 하나로 축약
'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 |