JAVA - 이항연산자, 삼항연산자

갓김치·2020년 7월 23일
0

초급자바

목록 보기
4/8
post-thumbnail

참고

Operation_03.java

산술연산자 공통점

  • 사칙연산자 (+,-,* ,/), 나머지 연산자(%), 쉬프트 연산자(<<, >>, >>>)
  • 두개의 피연산자를 취하는 이항연산자.
  • 두 피연산자 모두 4byte형보다 작은 경우, 둘다 4byte형 int로 변환하여 연산을 수행한다.

사칙연산자 (+,-,* ,/)

  • 두 피연산자 중 하나 이상이 4byte형보다 큰 경우에는 큰 자료형으로 변환 후 연산
    -- : int + float => float + float -> float
  • 두 피연산자 모두 4byte형보다 작은 경우, 둘다 4byte형 int로 변환 후 연산.
    -- : byte + short => int + int
  • 정수형 간의 나눗셈에서 0으로 나누는 것은 금지

예제 (p34)

class Qu2_8{
	public static void main(String[] args){
    	//1. byte형 변수 b1 선언, 80 으로 초기화
        byte b1 = 80;
        
        //2. byte형 변수 b2 선언, 100 으로 초기화
        byte b2 = 100;
        
        //3. long형 변수 lo1 선언, 642 으로 초기화
        long lo1 = 642L;
        
        //4. lo1과 b1의 합을 변수 result1에 저장
        long result1 = lo1 + b1;
        
        //5. result1의 값 출력
        System.out.println(result1); // 642L + 80L = 722
        
        //6. b1과 b2의 합을 변수 result2에 저장
        //byte + byte => int + int => int
        int result2 = b1 + b2;
        
        //7. result2의 값 출력
        System.out.println(result2); // 180
        
        //8. byte형 변수 result3을 선언, b1과 b2의 합으로 초기화
        //byte + byte => int + int => int
        byte result3 = (byte)(b1 + b2);
        
        //9. result3의 값 출력
        System.out.println(result3); // 
        
        //10. 변수 lo2 선언, 60000과 80000의 곱을 저장.
        //long lo2 = 60000 * 80000 //int로 인식해서 오버플로우 발생
        //long lo2 = 60000L * 80000L // 하나만 L붙여줘도 나머지도 바뀜
        long lo2 = 60000L * 80000;
        
        //11. lo2에 저장된 값 출력
        System.out.println(lo2); //4800000000

	}
}

문제9는 여기 참고 : https://coderanch.com/t/411768/java/converting-int-byte

나머지 연산자 (%)

  • 왼쪽의 피연산자를 오른쪽의 피연산자로 나누고 난 나머지 값을 반환하는 연산자.
  • boolean 형을 제외한 모든 기본형 변수에 사용할 수 있다.
  • 0으로 나눌 수 없고, 두 피연산자 모두 정수만 허용 (음수,양수)
  • 짝수, 홀수 또는 배수 검사 등에 주로 사용.
// 사용자가 값을 두개를 주면 사용자가 원하는 숫자의 몫과 나머지 구하기
int a = 94;
int b = 11;

int share = a/b;
int remain = a%b;

// a를 b로 나눈 몫은 share이고 나머지는 remain이다.
System.out.println(a+"을 "+b+"로 "+"나눈 몫은 "
+share+"이고 나머지는 "+remain+"이다.")

쉬프트 연산자 (<<, >>, >>>)

  • 정수형 변수에만 사용 가능
  • 피연산자의 각자리(2진수로 표현시)를 오른쪽 또는 왼쪽으로 이동
  • n은 정수만 가능, 음수일 경우 양수로 자동변환
  • 산술연산자중 가장 나중에 계산됨
  • 곱셈과 나눗셈 시, 비트연산을 수행하기때문에 연산속도가 매우 빠름.
    • << : x< n -> x * 2^n (곱셈)
    • '>> : x>>n -> x / 2^n (나눗셈)
  • < : 큰숫자 (은행권, 천문학)
  • '>> : 그래픽 흑백전환
int shift = 10;
System.out.println(10<<33); //10 * 2^33 = 10 * 2^32 * 2 => 20
System.out.println(10>>3); //10 / 2^3 = 1

long shift = 200L;
System.out.println(200<<65); // 200 * 2^65 = 200 * 2^64 * 2 = 400

한칸씩 움직이는거

10 ---- (0)0001010
10<<2 (0)0101000
10>>2 (0)0000001

비워진 자리가 채워질때 앞의 부호(괄호안 숫자)에 따라 빈칸이 채워진다
여기서는 부호가 0이라 빈자리도 0으로 채워진다
이러면 8칸 움직일때 한칸한칸 차례로 0,1따라 달리 채워지면서 결국 원래모습이 된다

  • << : n값 커질때, 오버플로우를 고려해야함
  • '>> : n값은 커도 됨. 결과값이 0으로 수렴하기때문에.

비교 연산자 공통점

  • 두 개의 변수 또는 리터럴을 비교하는데 사용
  • 주로 조건문과 반복문의 조건식에 사용되며 연산결과는 true 또는 false이다.
  • 피연산자 타입이 서로 다를 경우, 자료형 범위가 큰 쪽으로 자동 형변환하여 타입을 일치시킨 후 비교한다

대소 비교 연산자 ( <, >, <=, >= )

  • 기본 자료형 중에 boolean을 제외한 나머지 자료형에 사용
  • 예외) 참조형은 안됨: 주소 비교에 의미가 없기때문

등가 비교 연산자 ( ==, != )

  • 모든 자료형에 사용 가능
  • 예) 1. 기본형: 변수에 저장된 값이 같은지? 2. 참조형: 주소가 같은지?
  • ==: 두 값이 같으면, true 아니면 false
  • !=: 두 값이 다르면, true 아니면 false

문제 2-10 (p.38)

class Qu2_10{
    public static void main(String[] args){
    	//1. 변수 f01 선언, 0.1f 로 초기화
        float f01 = 0.1f;
        
        //2. 변수 f02 선언, 10.0f 로 초기화
        float f02 = 10.0f;
        
        //3. 변수 do01 선언, 0.1 로 초기화
        double do01 = 0.1;
        
        //4. 변수 do02 선언, 10.0 로 초기화
        double do02 = 10.0;
        
        //5. 변수 str1 선언, "화이팅" 초기화
        String str1 = "화이팅";
        
        //6. "변수 f01과 do01의 값은 같은가?"의 결과를 출력
        //f01 = 0.1f, do01 = 0.1
        //f01 = do01 --프로그래밍--> f01 == do01
        System.out.println(f01==do01); 
        //false.
        //1) double 타입은 2^n으로 표현이 됨, 연산은 빠르나 근사치.
        //2) float 타입은 정확한 값.
        //3) 둘다 2^n으로 표현되는 값이면 true로 나온다.
        
        //7. "변수 f02과 do02의 값은 같은가?"의 결과를 출력
        //f02 = 10.0f, do02 = 10.0
        //f02 = do02 --프로그래밍--> f02 == do02
        System.out.println(f02==do02);
        //true. 소숫점 이하가 없이 0에서 끝나기때문에
        
        ★★
        //8. "str1의 값이 "화이팅"과 같은 값인가?"의 결과를 출력
        //등가비교연산자는 기본형, 참조형 둘다 사용 가능
        //str1 = "화이팅", "화이팅" 둘의 비교
        //str1 = "화이팅" --프로그래밍--> str1 == "화이팅"
        System.out.println(str1=="화이팅"); //true
        //★ 비교연산자: 문자열이 완전히 같은 것인지 비교
  
        System.out.println(str1.equals("화이팅"); //true
        //★ equals(): 문자열의 내용이 같은지 비교. (p.182)

	}
}

string.equals()

  • 무조건 있어야 할때는 문자가 앞으로
  • null은 equals 앞에 와서 비교할 수 없음

비트 연산자 ( &, |, ^ )

  • 이진비트연산을 수행 (비트가 나오면 2진수 바로 떠올리기!)
  • 실수형을 제외한 모든 곳에 사용 가능
    - 실수는 우리가 알고 있는 bit형 연산형태가 아니다. bit 후 추가과정 필요
  • 예) 전기회로 만들 때
  • 예2) OR, AND: 는 그래픽에서 모두 0인 bit와 모두 1인 bit트와의 연산을 통하여 전체 화면의 색상을 변경할 때
  • 예3) XOR: 일부분의 색상 변경
  • & (AND연산) - 피연산자 양쪽 모두 1이면 1의 결과를 얻는다.
  • | (OR연산) - 피연산자 중 한 쪽의 값이 1이면 1의 결과를 얻는다.
  • ^ (XOR연산) - 피연산자의 값이 서로 다르면 1의 결과를 얻는다.
int a = 3;
int b = 5;

//   3 : 00000011
//   5 : 00000101
// 3&5 : 00000001
// 3|5 : 00000111
// 3^5 : 00000110

System.out.println(a&b); //1
System.out.println(a|b); //7
System.out.println(a^b); //6

논리 연산자 ( &&, || )

  • 7 <= a <= 20 (수학적 연산)
  • 7 <= a 그리고 a <= 20 (프로그래밍 연산)
  • 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만 허용
  • 조건식의 결합에 사용
  • '&&'이 '||'보다 우선순위.
    - 예) 1. ( && ) || ( && ) 2. && || && 결과: 둘다 ||가 맨나중에 연산됨.
  • 예) 비밀번호 16자 이하, 대소문자 포함 등의 기준코드
  • || (OR결합) : 피연산자중 어느 한쪽만 true일 때 true의 결과
  • && (AND결합) : 피연산자중 양쪽 모두가 true일 때 true의 결과
int a2 = 7;

//Q. 5 이상 15이하일 때 true가 나오게 해라
//5 <= a2 <= 15 (수학적 연산)
//5 <= a2 그리고 a2 <= 15 (프로그래밍 연산)
//(5 <= a2) && (a2 <= 15)
System.out.println( (5 <= a2) && (a2 <= 15) ); // true

예제 2-7 (p.40)

피연산자: boolean형

class Ex2_8{
	public static void main(String[] args){
    	boolean b1 = true;
        boolean b2 = false;
        System.out.println( b1 && b2); // false.
        
        int in01 = 10;
        boolean re1 = in01 % 2 == 0;
        //int01이 2의 배수인가? -> true
        boolean re2 = in01 % 4 == 0;
        //int01이 4의 배수인가? -> false
        System.out.println(re1 || re2);
        //|| or결합이기때문에 둘중 하나만 true여도 됨 --> -> true

	}
}

문제 2-11 (p.40)

피연산자: boolean형 값을 결과로 하는 '조건식'

class Qu2_11{
	public static void main(String[] args){
    	//1. 변수 ch01 선언, 원하는 문자로 초기화
        char ch01 = 'A';
        
        //2. 변수 ch01의 값이 영어 대문자일 때 true인 조건식
        // 'A' <= ch01 <= 'Z'
        System.out.println('A' <= ch01 && ch01 <= 'Z'); //true
        
        //3. 변수 ch01의 값이 영어 소문자일 때 true인 조건식
        // 'a' <= ch01 <= 'z'
        System.out.println('a' <= ch01 && ch01 <= 'z'); //false -> ch01 대문자
        
        //4. 변수 ch01의 값이 영문자일 때 true인 조건식
        // 'A' <= ch01 <= 'Z' 또는 'a' <= ch01 <= 'b'
        System.out.println(( 'A' <= ch01 && ch01 <= 'Z' ) || ( 'a' <= ch01 && ch01 <= 'z' )); //true
        
        //5. 변수 ch01의 값이 ASCII값 숫자 때 true인 조건식
        // '0' <= ch01 <= '9'
        System.out.println('0' <= ch01 && ch01 <= '9'); // false -> ch01 대문자
        
	}
}

조건 연산자 ( ? : _ ) (삼항)

  • 세 개의 피연산자 필요
  • 삼항연산자의 조건식에는 연산결과가 되어야한다.
  • 삼항연산자 안에 삼항연산자 들어갈 수 있다.
    - 문제) 양수, O, 음수 구별
    • 방법) 양수 ? 양수 : 0과 음수 구별
    •   ) 양수 ? 양수 : 0 ? 0 : 음수
  • 조건식) ? true일 때 수행 : false일 때 수행 (기본적으로 경우의 수 2개: T/F)
  • true, false 안에 들어가는 변수 타입 일치되어야 함
int a3 = -10;

int abs = a3 >= 0 ? a3 : -a3;
System.out.println(abs); // 절대값 구하는 프로그래밍

예제 2-9 (p.41)

class Ex2_9{
	public static void main(String[] args){
    	//변수에 저장된 값의 절대값을 구하는 코드이다.
        int num = -10;
        int result = num >= 0 ? num : -num;
        System.out.println(result); // num의 초기화 값과 상관없이 절대값이 출력됨.
	}
}

★★★ 문제 2-12 (p.41)

class Qu2_12{
	public static void main(String[] args){
    	//1. 변수 x를 선언 및 'B'의 값으로 초기화
        char x = 'B';
        //2. 변수 result 선언, x의 값이 대문자일 때 "대문자"를, 소문자일 때 "소문자"를, 그 외에는 "영문자 아님" 을 저장해라.
        //x가 대문자 -y-> "대문자"
        //         -n-> x가 소문자? -y-> "소문자"
        //                        -n-> "영문자 아님"
        
        //대문자: 'A' <= x && x <= 'Z'
        //소문자: 'a' <= x && x <= 'z'
        
        //정답
        //1. 대문자 조건식: 'A' <= x && x <= 'Z';
        //2. 소문자 조건식: 'a' <= x && x <= 'z';
        String result = 'A' <= x && x <= 'Z' ? "대문자" : 'a' <= x && x <= 'z' ? "소문자" : "영문자 아님";
        
	}
}

대입 연산자 ( =, op= )

  • 변수에 값 또는 수식의 연산결과를 저장하는데 사용한다. => 저장되는 값이 바뀐다
  • 연산자 중 연산우선순위가 가장 낮다.
  • 연산되는 변수는 원래의 타입을 유지하므로 형변환 하지 않는다.
    • ex) char ch ='A'; ch += 2; // 'C'
int b4 = 10;

//1. b4의 값에 3을 곱한 결과를 b4에 저장해 주세요.
b4 = b4 * 3;  // 얘는 int니까 상관없는데 char면 아래와 같이 캐스팅 필수
b4 *= 3;
//int b4 *= 3; 선언과 동시에 못함


char c3 = 'A';
//2. c3의 값에 5을 더한 결과를 c3에 저장해 주세요.
c3 = (char)(c3 + 5);
c3 += 5; //위랑 같은 값
//c3 += 5+3; 이건 틀린 식
profile
갈 길이 멀다

0개의 댓글