자바 - 연산자

msung99·2022년 3월 10일
0
post-thumbnail


동일한 우선순위의 연산자

*, /, % 연산방향 : 왼쪽 -> 오른쪽
단항 연산자(++, --, ~, !), 부호 연산자(+, -), 대입 연산자(=, +=, -=) 연산방향: 오른쪽 -> 왼쪽

ex1) 100 * 2 / 3 % 5 => 왼쪽에서 오른쪽 방향으로 순서대로 실행
ex2) a = b = c = 5 => 오른쪽에서 왼쪽 방향으로 순서대로 실행


부호 연산자 +, -

  • 부호 연산자의 리턴 타입은 int

단항 연산자

~ : 비트 반전 연산자 ( 비트값을 반전시킴 (0->1, 1->0) )


산술 연산자 +, -, *, /, %

  • boolean 타입을 제외한 모든 기본 타입에 사용 가능
  • 결과값을 산출할 때 Overflow 주의
  • 정확한 계산은 정수를 사용하기!!!
  • Nan(Not a Nuber) 와 Infinity 연산은 주의할 것

문자열 연산자

  • 피연산자 중 문자열이 있으면 문자열로 결합
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 : !


비트 연산자 &, |, ^, ~, <<, >>, >>>

  1. 비트 논리 연산자 &, |, ^, ~
  • 피연산자가 boolean 타입일 경우 일반 논리 연산자 기능 수행
  • 반대로 정수 타입일 경우 비트 논리 연산자로 기능을 수행

피연산자의 각 비트들의 연산
ex) 3 & 5
=> 3: 0000011 이고, 5 : 00000101
이므로 0000011 & 00000101 의 결과는 000000001 이 된다.

  1. 비트 이동 연산자

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';

toBinaryString

10진수를 2진수 문자열로 변환 : Integer.toHexString(8);

  • java.lang 패키지에 있는 Interger 클래스는 toBinaryString 함수를 지원한다.

형태 : 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 객체 : 키 입력

  • 공백을 기준으로 입력값들을 나눠서 처리
    형태 : Scanner(System.in)

  • import java.util.Scanner; 를 꼭 선언해줄것

  • System.in 이라는 녀석을 인자로 넣어줌
    (System.in : 표준 입력 스트림.)

Scanner a = new Scanner(System.in); // Scanner 객체 생성
  • Scanner 주요 메소드
    • next() : 입력 대상을 문자열 타입으로 가져오는데, 공백 단위로 짤라서 가져온다. 즉, 단어 단위로 가져온다.
    • nextLine() : 한줄에 입력값을 입력시 next()는 문자열(단어) 단위로 짤라서 가져왔지만, nextLine() 은 한줄에 있는 입력값을 모조리 가져온다.
    • close() : Scanner안의 system.in 을 사용종료. 더이상 입력을 받지 않겠다
    • nextInt() : 입력 대상을 int타입으로 가져오는 것
    • nextDouble()
    • nextBoolean()
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

삼항연산자

profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글