혼자 공부하는 자바

[혼공자] Ch 3. 연산자

습관그뤠잇 2021. 2. 10. 19:35

혼자 공부하는 자바)

3-1. 연산자와 연산식

  • 연산식은 반드시 하나의 값을 산출하지만, 산출되는 값의 타입(자료형)은 연산자 별로 다름

연산자의 종류

[ key: 연산자, 연산 방향(오른쪽, 왼쪽), 우선순위 ]

 

  • 연산자는 피연산자의 수에 따라 구분됨
  • [ ] 단항 연산자: ++x ;
  • [ ] 이항 연산자: x + y ;
  • [ ] 삼항 연산자: (sum > 90) ? "A" : "B" ;

[ 단항연산자 ]

  • 부호연산자(+,-) : 양수 및 음수 표시. boolean과 char를 제외한 기본 타입 모두에 사용 가능
  • 주의: 부호연산자(양.음수)의 결과 = int 타입‼️ so, 부호 연산의 결과는 int 타입 변수에 저장해야 함

byte b = 100; int result = -b; // byte result = -b; ➡️➡️ compile 에러 발생함

  • 증감 연산자(++,—) = 증가연산자(++) & 감소연산자(—)

Untitled

  • ++i와 i=i+1의 연산속도 차이? ➡️ 없음!

  • 논리 부정 연산자(!): boolean 타입에서만 사용할 수 있음(true → false). !play와 같은 형태

[ 이항 연산자 ]

  • 산술연산자(+,-,*,/,%) : 피연산자들의 타입을 일치시킨 후 연산 수행
    • 피연산자들이 byte, short, char 타입 → 모두 int 타입으로 변환
    • 피연산자들이 모두 정수타입이고 long 타입이 포함 → 모두 long 타입으로 변환
    • 피연산자들 중 실수(float, double) 타입 포함 → 허용범위가 큰 실수 타입으로 변환

char c1 = 'A' + 1; -> 에이 유니코드 65+1 = 66이 되어 타입 변환없이 문제없음 char c2 = 'A'; //char c3 = c2 + 1; -> char 변수인 c2가 연산에 피연산자로 사용되면(맨위 세모 참고) int 타입으로 변환되므로 int 타입으로 설정해서 보아야함.(int c3 = c2 + 1; 그럼 66 값 출력) -> B로 출력하고 싶다면? char c3 = (char)(c2 + 1); 하면 됨. c2의 int 값 65+1에다가 char로 강제변환하면 문자로 출력되니까!

  • int 타입으로 된 정수들 간의 나누기를 소수점 값으로 얻고 싶을 때

int int1 = 10; int int2 = 4; //int result2 = int1 / int2; // 결과값 2 출력 //double result3 = int1 / int2; //결과값 2.0 출력 (int 타입으로 계산후 0.0 붙은것) [맞는 값을 얻으려면 둘 중 하나를 실수로 만들어야 함] double result4 = (double) int1 / int2 or int1 / (double) int2; // 결과값 2.5출력 double result4 = (int1 * 1.0) / int2; //결과값 2.5 출력

  • 문자열 결합: 순서에 따라 유의해야함

"JDK" + 3 + 3.0; //JDK33.0 출력 3 + 3.0 + "JDK"; //6.0JDK 출력

  • 비교연산자: boolean 제외 기본 타입에서 다 사용 가능. 동등 연산자는 모든 타입 가능

 

  • 비교연산자도 연산 수행 전 피연산자 타입을 일치시킴

    • 예: 'A' ==65 -> char 타입인 'A'가 int 타입으로 변환되어 65 ==65를 비교함
    • 예: 3 == 3.0 → 3이 double 타입으로 변환되어 3.0 == 3.0을 비교함
  • 예외 타입: 0.1 == 0.1f → false가 산출됨‼️

  • 문자열 String 변수의 같은지 여부 비교 : 비교 연산자(==) 사용하지 못함!

    • equal() 메소드 사용

String var1 = "신용권"; String var2 = "신용권"; System.out.println(var1.equals(var2)); System.out.println(!var.equals(var2)); //같지않다는 !씀

  • 논리연산자(&&, ||, &, |, ^, !): boolean 타입만 사용가능
    • &보단 &&가, |보단 ||가 더 효율적으로 동작함(앞의 피연산자가 원하는 답을 내면 뒷 연산자는 계산안함)

 

  • 대입연산자(=,+=,-=,*=,/=,%=): 가장 낮은 연산순위이며, 왼쪽 ← 오른쪽 계산됨을 유의!

 

  • 삼항연산자(?:)(=조건연산식): ?앞의 조건식에 따라 콜론 앞뒤의 연산식이 선택됨.
    • if문과 비슷한 역할을 하지만, 보다 효율적으로 한 줄 작성 가능

 

  • 로그인 관련 연산자 예시

package nosector; import java.util.Scanner; public class exam { public static void main(String[] args) { /*이름은 문자열. 패스워드는 정수(패스워드 int). 입력된 내용을 비교해서 아이디가 java, 패스워드 12345aus "로그인 성공" 출력, 아니면 "로그인 실패"를 출력 */ Scanner scanner = new Scanner(System.in); System.out.print("아이디: "); String name = scanner.nextLine(); System.out.print("패스워드: "); int pw = Integer.parseInt(scanner.nextLine()); if (name.equals("java")) { if(pw == 12345) { System.out.println("로그인 성공"); } else { System.out.println("로그인 실패: 비밀번호 오류"); } } else { System.out.println("로그인 실패: 아이디 존재하지 않음"); } } }