본문 바로가기
공부기록/Java

4월 7일 (2) Java - 연산자

by project100 2023. 4. 7.

프로그래밍 언어 학습  순서

1. 변수(자료형)

2. 연산자

3. 제어문

4. 객체지향관련


연산자 (Operator)

프로그램의 명령어는 변수와 연산자로 구성된다.

 

1) 산술연산자  : +, -, *, /, %

자바스크립트 : 5 / 2 = 2.5 (실수, 자동 형변환)

자바 : 5 / 2 = 2(정수)

 

정수 연산의 결과는 무조건 정수

나눗셈의 경우 몫만 취한다.

실수 연산 시 % 연산자는 사용하지 않는다.

한 가지 자료형으로 연산이 수행될 경우 자료형이 변하는 경우는 없다.(형변환X)

 

import java.util.Scanner; //라이브러리 사용

public class SimpleCalculator {
    public static void main(String[] args) {

        // 2수 입력 받아서 덧셈 후 결과 출력
        int num1, num2, result;

        // 입력장치(Scanner) 인스턴스 생성
        Scanner scanner = new Scanner(System.in);
        // new: heap 영역에 인스턴스를 생성하는 명령어

        // 프로그램 이름(title) 출력이 필요
        System.out.println("간단한 덧셈 계산기");
        System.out.println("================");

        // 입력처리
        System.out.print("Number1 : "); // 안내문구
        num1 = scanner.nextInt();
        System.out.print("Number2 : "); // 안내문구
        num2 = scanner.nextInt();

        // 연산 처리 : 덧셈
        result = num1 + num2;

        // 결과 출력
        System.out.println("덧셈 결과 : " + result);

        // 종료문구
        System.out.println("프로그램을 종료합니다.");
    }
}

 

p58

연산식에서 자동 형변환

btye + byte = int result 연산 후 형변환

byte + short = int result 형변환 후 연산

 

byte와 short 는 연산시 자동으로 int로 형변환되어 결과값이 byte와 short로 저장되지 못하여 에러가 발생한다.

결과값을 byte와 short로 다시 형변환을 해주어서 넣어주거나, int로 결과값을 저장해야 한다.

int * int의 경우 결과값이 커지기 때문에 long으로 결과값을 받아주어야 한다.

        byte x = 10;
        byte y = 20;
        // byte res = x + y; 컴파일 에러
        byte res = (byte) (x + y);
        int e = x + y;

        short x2 = 10;
        short y2 = 30;
        short res2 = (short)(x2 + y2);
        
        int n1 = 5;
        float f1 = 2.0f;

        float resf = n1 / f1;
        System.out.println(resf);
 
p 64-65

 

숫자 - > 문자열
 
2) 대입연산자 : =, +=, -=, *=, /=, %=
x += 2;
-> x = x + 2;

 

오버플로어(Overflow)와 언더플로어(Underflow) p 83

오버플로어란 타입이 허용하는 최대값을 벗어나는 것을 말한다. 99 + 1 = 00

언더플로어란 타입이 허용하는 최소값을 벗어나는 것을 말한다. -99 + (-1) = 00

 

3) 증감 연산자 : ++, -- (자바스크립트와 동일) 1씩만 가능

x ++;

x = x + 1;

 

4) 비교연산자 : ==, !=, >, >=, <, <= 자바스트립트와 동일(===, !== 없음, 자료형이 없기 때문에 자바스크립트에만 존재)

문자열 비교는 equals 메소드를 사용.

문자열1.equals(문자열2); -> true/false

String s1 = "abcd";

String s2 = "abcd";

s1.equals("abcd");

"abcd".equals(s1);

s1.equals(s2);

s2.equals(s1);

 

5) 논리연산자 : &&, ||, !(Not), ^(XOR, 베타적 논리합) 자바스크립트와 동일

베타적논리합 : 서로 다른 경우에만 true, 서로 같은 경우에는 false, 별로 사용하지 않는다.

 

비교 연산자로 작성된 연산식을 결합할 때 사용

논리곱 :  AND && 두 연산식이 모두 true일 때만 전체가 true

논리합 : OR ||  두 연산식이 모두 false일 때만 전체가 false

 

6) 조건연산자 : (condition) ?  A : B; 자바스크립트와 동일

true면 A, false면 B 실행

 

기계제어할 때 사용 또는 서브넷마스크 Masking 때 사용

7) 비트 연산자 : 비트(bit) 단위로 연산을 수행 

비트단위 논리연산자 - &, |, ^, ! 

비트 이동 연산자(shift) -  <<, >>,  >>> 

<< : * 2와 같은 효과가 나오는 연산자

>> : / 2와 같은 효과가 나오는 연산자

>>> : 첫번째 비트의 값이 0이면 이동 후 0을 채우고, 1이면 이동 후 0을 채움.

 

public class BitOpClass {
    public static void main(String[] args) {
        int a = 5; // 2진수 0101
        int b = 3; // 2진수 0011

        System.out.println("a & b : " + (a & b)); // 0001 비트 곱, 논리곱과 같음
        System.out.println("a | b : " + (a | b)); // 0111 4+2+1
        System.out.println("a ^ b : " + (a ^ b)); // 0110 4+2

        // bit shift 연산
        int c = 1;
        int d = 1;
        int e = c << d;

        System.out.println("d << " + d + " => e : " + e);
        d = 2;
        e = c << d;
        System.out.println("d << " + d + " => e : " + e);

        c = 32;
        d = 1;
        e = c << d;
        System.out.println("d << " + d + " => e : " + e);
        c = -8;
        d = 1;
        e = c >> d;
        System.out.println(c + " >> " + d + " => e : " + e);

        // >>>연산
        c = -8;
        d = 1;
        e = c >>> d;
        System.out.println(c + " >>> " + d + " => e : " + e);
    }
}

연습문제

윤년 계산 프로그램 자바로 작성해보기!

import java.util.Scanner;

public class LeapYear {
    public static void main(String[] args) {
        int year; // 연도 저장변수
        boolean res; // 윤년 판단 정보 저장 변수
        String outString; // 결과 문자열 저장 변수

        // 입력 처리용 객체
        Scanner scanner = new Scanner(System.in);

        // 타이틀 출력
        System.out.println("☆윤년 계산기☆");
        System.out.println("==============");

        // 연도 입력
        System.out.print("연도 : ");
        year = scanner.nextInt();

        res = ((year % 4 == 0) && (year % 100 != 0))
              || (year % 400 == 0);

        outString = (res) ? "윤년입니다." : "윤년이 아닙니다.";

        // 결과 출력
        System.out.println(outString);
        System.out.println("프로그램 종료");
    }
}