1. 타입 변환
String str=”3”;
[1] 숫자->문자 - 숫자에 ‘0’을 더한다.
System.our.println((char)(3+’ 0’)); // 3(문자)
[2]문자->숫자 - 문자에서 ‘0’을 뺀다.
System.our.println(’ 3’-’ 0’+1); // 4
[3]숫자->문자열 -숫자에 빈 문자열(””)을 더한다.
System.our.println(3+” ”); // 3(공백)
[4]문자열->숫자 -정수형:Integer.parseInt(), 실수형:Double.parseDouble()
System.our.println(Interger.parseInt”3”+1); // 4
[5]문자열->문자 -”3”. charAt(0)=>’3’
[6] 문자열->문자 -’ 3’+”” => “3”
[더하기 개념]
System.out.println(’A’+’B’); System.out.println(’1’+2); System.out.println(’1’+’2’); |
131 51 99 |
*char+char의 덧셈 연산의 경우 int+int로 변환된다.
*int(4) 형보다 작은 타입(byte, char, short)은 int형으로 변환한 후
덧셈연산이 진행된다.
*A의 아스키코드는 65, B의 아스키 코드는 66이므로 답은 131
*1의 아스키 코드는 49, 2의 아스키 코드는 50이므로 답은 99
2. 연산자
*연산자:연산을 수행하는 기호(+, -, *, %, /)
*피연산자:연산자의 대상이 되는 것
*평가:식을 계산하여 결과를 얻는 것
*피연산자의 개수에 따라 단항연산자, 이항연산자, 삼항연산자로 구분
산술연산자 | +,-,*,%,/,<<,>> | 사칙 연산, 나머지 연산 |
비교연산자 | >,<,<=,>=,==,!= | 크고 작음, 같고 다름 |
논리연산자 | &&, ||,!,&,|,^,~ | 그리고와 또는으로 연결 |
대입연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type)?:instanceof | 형변환, 삼항, instanceof |
[더하기 개념]
-x+5
=> x앞의 -는 부호 연산자(=단항 연산자)로 -x를 의미하며
‘+’만이 산술 연산자(=이항 연산자)이다.
=>’-’의 피연산자는 x, 1개. ‘+’의 피연산자는 x와 5, 2개.
=> 피연산자가 정수인 경우, 나누는 수로 0 사용불가(에러발생)
2-1. 연산자의 결합 규칙
ex9.
(a) 연산자의 결합규칙이 왼쪽에서 오른쪽인 경우
3+4-5=2 : 단항 연산자, 대입 연산자를 제외한 모든 연산의 진행방
향은 왼쪽에서 오른쪽이다.
(b) 연산자의 결합규칙이 오른쪽에서 왼쪽인 경우
x=y=3 : 대입 연산자는 우변의 값을 좌변에 저장한다.
3. 증감 연산자 ++, --
[1] 증가 연산자(++) : 피연산자의 값을 1 증가시킨다.
[2] 감소 연산자(--) : 피연산자의 값을 1 감소시킨다.
=> 피연산자의 왼쪽에 위치하면 전위형(prefix)으로 값이 참조되기 전에 1 증가시킨다. ex) j=++i
=> 피연산자의 오른쪽에 위치하면 후위형(postfix)으로 값이 참조된 후에 1 증가시킨다. ex) j=i++
=> 증감 연산자의 피연산자로 정수, 실수 모두 가능하지만 값이 고정된 상수에는 적용할 수 없다.
=> 수식이나 메서드에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이가 없다.
ex10.
int i=5; j=5; System.out.println(i++); System.out.println(++j); System.out.println(”i=”+i+”j=”+j); |
5 6 i=5 j=6 |
4. 형변환 연산자
*형변환(casting):변수나 리터럴의 타입을 다른 타입으로 변환하는 것
*기본 방법:형변환하고자 하는 변수, 리터럴 앞에 변환하고자 하는 타입을 괄호와 함께 붙여준다.
->변환하고자 하는 타입을 캐스트 연산자, 형변환 연산자라고 한다.
*형변환 이후에 기존 피연산자값은 아무런 변화가 없다.
ex11.
double d=85.4; int score=(int)d; System.out.println(”score=”+score); System.out.println(”d=”+d); |
85 d=85.4 |
5. 자동 변환(=산술 변환)
: 서로 다른 타입 간의 대입이나 연산을 할 때, 먼저 형변환으로 타입을 일치시키는 것이 원칙이지만
기존의 값보다 변환하려는 값의 타입이 더 클 경우 자동 형변환된다.
[1] 큰 타입에서 작은 값으로의 형변환은 값손실이 발생하지만,
명시 후 형변환 할 경우 에러를 발생하지 않음
byte b=(byte) 1000; // 에러 발생하지 않음
[2] 산술 변환의 규칙
(1) 두 피연산자의 타입을 같게 일치시킨다. (둘 중 큰 타입으로 일치)
long+int->long+long->long
float+int->float+float->float
double+float->double+double->double
(2) 피연산자의 타입이 int보다 작으면 int로 변환된다.
byte+short->int+int->int
char+short->int+int->int
(3) byte+byte와 같은 경우 산술 변환으로 그 값이 int로 도출되는데
이때, int는 4byte 값이므로 명시적 형변환이 필요하다. (에러 발생)
(4) 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다.(ArithmeticException) 발생
(0.0f, 0.0d의 실수형은 가능하지만 결괏값으로 infinity를 얻는다.)
ex12.
byte a=10; byte b=30; byte c=a+b; System.out.println(c); => byte c=(byte)(a+b); System.out.println(c); |
(Error) 44 |
ex13.
int a=1_000_000; int b=2_000_000; long c=a*b; System.out.println(c) |
-1454759936 |
=> 위와 같은 예제의 경우 int타입과 int타입의 연산결과는 int타입이고
이것이 long형으로 자동 형변환되어도 값은 변하지 않는다.
=> 아래와 같이 long으로 형변환 필요
int a=1_000_000;
int b=2_000_000;
long c=(long)(a*b);
System.out.println(c);=2x10의 12승
ex14.
long a=1_000_000*1_000_000 long b=1_000_000*1_000_000L; System.out.println(”a=”+a); System.out.println(”b=”+b); |
a=-727379968 b=1000000000000 |
[더하기 개념]
<1.Math.round()= 소수점 첫 번째 자리에서 반올림 후 정수 추출>
=> long result=Math.round(4.52); //5
=> double pi=3.141592;
double shortpi=math.round(pi*1000)/1000.0;
System.out.println(shortpi); //3.142
*위 과정에서 1000.0이 아니라 1000으로 나누었으면 결과는 3이다.
->int와 int의 나눗셈 결과는 int이기 때문이다. (주의)
<2./(몫) %(나머지) 연산자 사용 시 부호는 왼쪽 피연산자와 동일>
*비교 연산자에서도 산술변환이 적용된다. ex) 10 == 10.0f // 10이 float로 변환
ex15.
System.out.println(-10%/8); System.out.println(10%/-8); System.out.println(-10%/-8); |
-2 2 -2 |
6. 논리 연산자 =>&&(and), ||(or)
[1] x는 10보다 크고, 20보다 작다. (and)
10 <=x && x <=20
[2] x는 2의 배수 또는 3의 배수이다. (or)
x%2==0||x%3==0
[3] x는 2의 배수 또는 3의 배수지만, 6의 배수는 아니다.
(x%2==0||x%3==0)&&x%6!=0
->&&가 ||보다 먼저 연산되므로 괄호 필요
7. 논리 부정 연산자 =>!
*true와 false를 반대로 바꾼다.
ex16.
boolean b=true; System.out.println(”b=%b%n”, b); System.out.println(”!b=%b%n”, !b); System.out.println(”!!b=%b%n”, !!b); System.out.println(”!!!b=%b%n”, !!!b); |
b=true !b=false !!b=true !!!b=false |
8. 비트 연산자
: & | ^ ~ << >>
- 피연산자를 비트단위로 논리 연산하며 피연산자로 정수형, 문자형만 허용.
- 쉬프트 연산자는 나눗셈/곱셈 연산자를 사용하는 것보다 빠르게 작동하지만 코드의 가독성이 떨어지므로,
곱셈 나눗셈 연산자를 주로 사용하고, 보다 빠른 실행속도가 요구되는 곳에만 사용하는 것이 좋다.
[1] | (or연산자) : 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻고 그 외에는 0을 얻는다.
[2] & (and연산자) : 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
[3] ^ (xor연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
[4] ~ (비트전환연산자) : 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다. 논리부정 연산자 ‘!’와 비슷하다.
- 비트전환이 되고 나면 부호 있는 타입의 피연산자는 부호가 반대로 변경.
- 따라서 1의 보수 연산자라고도 한다.
[5] <<, >> (쉬프트 연산자) : 2진수로 표현된 비트를 해당하는 방향(>>, <<)으로 이동시키는 연산자
(1) x << n : x * 2의 n승 값을 얻는다.
(2) x >> n : x / 2의 n승 값을 얻는다.
9. 조건 연산자(=삼항 연산자)
result=(조건)? 참일 경우 출력될 문구:거짓일 경우 출력될 문구;
=>두 문구의 타입이 다를 경우 자동 형변환 적용됨
10. 대입 연산자
[1] 대입 연산자의 왼쪽 피연산자 = lvalue(left value)
->리터럴이 올 수 없다.
[2] 대입 연산자의 오른쪽 피연산자 = rvalue(right value)
*대입 연산자의 진행방향은 오른쪽에서 왼쪽
*대입 연산자는 식의 제일 마지막에서 평가된다.
'Study > Java' 카테고리의 다른 글
06. <제어자, 캡슐화, 다형성, 형변환, 인터페이스 > ~자바의 정석 summary ~ (0) | 2023.01.13 |
---|---|
05. <오버로딩, 생성자, 상속, 포함 > ~자바의 정석 summary ~ (0) | 2023.01.12 |
04. <배열, 가변배열, 객체지향1 > ~자바의 정석 summary ~ (0) | 2023.01.11 |
03. <제어문, 화면으로부터 입력받기> ~자바의 정석 summary ~ (0) | 2023.01.10 |
01. <변수, 상수, 리터럴, 지시자> ~자바의 정석 summary ~ (4) | 2023.01.08 |
댓글