*, /, % 연산방향 : 왼쪽 -> 오른쪽
단항 연산자(++, --, ~, !), 부호 연산자(+, -), 대입 연산자(=, +=, -=) 연산방향: 오른쪽 -> 왼쪽
ex1) 100 * 2 / 3 % 5 => 왼쪽에서 오른쪽 방향으로 순서대로 실행
ex2) a = b = c = 5 => 오른쪽에서 왼쪽 방향으로 순서대로 실행
~ : 비트 반전 연산자 ( 비트값을 반전시킴 (0->1, 1->0) )
String str1 = "JDK" + 3 + 3.0; // JDK33.0 (1. JDK + 3) (2. JDK3 + 3.0)
String str2 = str1 + "특징"; // JDK3.0특징
String str3 = "JDK" + 3 + 3.0; // JDK33.0
String str4 = 3 + 3.0 + "JDK" // 6.0JDK
and : && 또는 &
or : || 또는 |
xor : ^ ( => 피연산자 하나가 true, 다른 하나가 false일떄 결과가 true)
not : !
피연산자의 각 비트들의 연산
ex) 3 & 5
=> 3: 0000011 이고, 5 : 00000101
이므로 0000011 & 00000101 의 결과는 000000001 이 된다.
a << b : a의 각 비트를 b만큼 왼쪽으로 이동. (이동 후 생긴 빈자리는 0으로 채운다.)
=> a에다 2를 b번 곱하는 것
a >> b : 각 비트를 오른쪽으로 b만큼 이동. (이동 후 생긴 빈자리는 이동 전의 최상위 비트 값으로 채운다)
=> a에다 2를 b번 나누는 것
a >>> b : 각 비트를 오른쪽으로 이동(이동 후 생긴 빈 자리는 0으로 채운다)
=> 나누기으로 볼순 없음. 부호가 바껴버리기 때문에
byte a = 5; // 0 0 0 0 0 1 0 1 => 5에다 2를 2번 곱하면 20이된다.
byte b = (byte)(a << 2); // 0 0 0 1 0 1 "0" "0" (빈자리 2개는 0으로 채워짐)
byte a = 20; // 0(최상위 비트) 0 0 1 0 1 0 0
byte b = (byte)(a >> 2); // "0" "0" 0 0 0 1 0 1 (빈자리 2개는 최상위 비트 0으로 채워진다)
byte a = (byte)0xf8; // -8 => 1(최상위 비트) 1 1 1 1 0 0 0
byte b = (byte)(a >> 2) // -2 => "1" "1" 1 1 1 1 1 0 (빈자리 2개는 최상위 비트 1로 채워짐)
형태 : 조건식 : 리턴값1(true일때 리턴) : 리턴값2(false일때 리턴)
int score = 95;
char grade = (score > 90) ? 'A' : 'B';
10진수를 2진수 문자열로 변환 : Integer.toHexString(8);
형태 : Integer.toBinaryString(8); // 1000
int v1 = 10;
int v2 = ~v1;
int v3 = ~v1 + 1;
System.out.println(toBinaryString(v1) + "(십진수:" + v1 + ")" ); // 00000000000000000000000000001010 (십진수 : 10) // 11111111111111111111111111110101 (십진수 : -11)
System.out.println(toBinaryString(v2) + "십진수:" + v2 + ")" );
System.out.println(toBinaryString(v3) + "십진수:" + v3 + ")" );
공백을 기준으로 입력값들을 나눠서 처리
형태 : Scanner(System.in)
import java.util.Scanner; 를 꼭 선언해줄것
System.in 이라는 녀석을 인자로 넣어줌
(System.in : 표준 입력 스트림.)
Scanner a = new Scanner(System.in); // Scanner 객체 생성
import java.util.Scanner;
public class hi {
public static void main(String[] args) {
System.out.println("입력하셈~");
Scanner scan1 = new Scanner(System.in);
String name = scan1.next();
System.out.print("이름은:" + name + ',');
String city = scan1.next();
System.out.print("도시는:"+city+',');
int age = scan1.nextInt();
System.out.print("나이는" + age + "살,");
double weight = scan1.nextDouble();
System.out.print("체중은" + weight + "kg");
scan1.close();
}
}
예제1
부호 연산자를 사용하면 결과물이 int타입이되어서 그 결과물을 short 변수에 할당 불가능
예제2
wrapper 클래스 => Integer 클래스
int타입을 감싸고 있는 클래스
내부적으로 값은 int 타입 하나를 가지고있지만 그걸 클래스 형태로 만듬
wrapper 또한 클래스이므로 멤버함수 등을 가지고 있다.
toBinaryString() 는 wrapper 클래스 멤버 함수중 하나이다.
예제 7,8
실수 타입으로는 비교연산 가급적 하지말것!
char타입은 내부적으로 가지고 있는 값이 정수이기 때문에 비교 연산 가능
하지만, 실수 타입은 정확한 비교연산 불가능
0.1 은 부동소수점으로 표현할 수 없는 대표적인 숫자로,
두 가지 타입(double,float) 의 숫자는 정밀도가 다르다.
즉, 두 타입의 변수에 근사값을 저장하는데 정밀도 단위가 달라서,다시 말해 근사값의 정확한 정보가 달라서 정확한 비교가 불가함
package practice;
public class hi {
public static void main(String[] args) {
int v2 = 1;
double v3 = 1.0;
System.out.println(v2 == v3);
double v4 = 0.123;
float v5 = 0.123f;
double v6 = 0.123;
System.out.println(v4+v6); // 0.246
System.out.println(v4+v6 == 0.246f); // false
System.out.println(v4+v6 == 0.246d); // true
System.out.println(v4-v6); // 0.0
System.out.println(v4 == v6); // true
System.out.println("=====================");
System.out.println(v4); // 0.123
System.out.println(v5); // 0.123
System.out.println(v4-v5); // -3.3974647539736225E-9
System.out.println(v4 == v5); // false;
System.out.println((float)v4 == v5); // true
System.out.println();
System.out.println("===================");
System.out.println((int)(v4*10)); // 1
System.out.println((int)(v5*10)); // 1
}
}
예제9
참조자.
기본 타입을 제외한 나머지 변수들을 참조자 타입으로 만들어지고,
비교연산을 진행시 안에 들어있는 값이 아니라 "대상을 비교"한다.
값을 비교하고 싶다면 equals( ) 를 사용하기!
예제 11
왼쪽으로 3번 쉬프트 => 2를 3번 곱합
오른쪽으로 3번 쉬프트 => 나누기 2를 3번 진행
오른쪽 쉬프트 연산자 3개('>>>') : 나누기 연산이라고 할순없음(부호가 바뀌니까)
예제 12
삼항연산자