즐겁게!! 자신있게!! 살아보세!!

재밌는 인생을 위하여! 영촤!

Language_Study/JAVA

[JAVA, App] 2.연산자

Godwony 2020. 12. 21. 14:46
반응형

연산자(Operator)

  • 연산을 수행하기 위한 부호나 명령어
  • 산술연산은 숫자 데이터의 연산이고 논리연산은 결과가 true 나 false 형태로 리턴되는 연산

1.최우선 연산자

1) ( ) : 연산의 우선순위 변경을 위한 연산자

2) [ ] : 배열에서 배열의 크기나 인덱스를 설정할 때 사용하는 연산자

2.단항 연산자 : 하나의 데이터만을 가지고 연산하는 연산자 -

1) 증감 연산자: ++, --

  • 변수에만 사용할 수 있는 연산자
  • 변수의 앞 뒤 모두에 위치 할 수 있는 연산자
  • 변수의 앞에 놓이게 되면 변수의 값을 1증감시키고 명령에 사용
  • 변수의 뒤에 놓이게 되면 변수의 값을 명령에 사용하고 1증감시킵니다.
  • 연속해서 사용되는 경우 언어마다 다르게 적용
        int a = 10;
        //a의 값을 1증가
        a++;
        System.out.println("a:" + a); //11 출력

        //a가 11인 상태에서 명령에 먼저 사용하고 1증가
        //11이 출력되고 a는 12가 됩니다.
        System.out.println("a:" + (a++)); //11

        //a를 먼저 증가시켜서 13을 만들고 명령에 사용
        System.out.println("a:" + (++a));//13

2) 부호 관련 연산자
+ : 양수라는 것을 명시적으로 표현하기 위한 연산자
- : 2의 보수 연산자 - 음수 표현
~ : 1의 보수(0->1, 1->0) 연산자 - 양수와 음수사이의 절대값 1차이, 색상 반전에 이용

3) 강제 형 변환 연산자
(자료형)데이터 : 데이터의 자료형을 강제로 변경하는 연산자

3.산술 연산자

%, *, /, +, -

  • 자바는 동일한 자료형끼리 산술 연산을 하면 동일한 자료형으로 결과가 리턴
    정수 / 정수 = 정수

  • 서로 다른 자료형끼리 산술 연산을 하면 표현 범위가 더 큰 자료형으로 변환해서 연산하고 표현 범위가 더 큰 자료형으로 결과를 리턴
    정수 + 실수 => 실수 + 실수 = 실수

  • int 보다 작은 자료형은 int 로 변환해서 수행하고 결과도 최소 int
    short + short => int + int = int

  • 문자열은 문자열 또는 숫자, 그리고 boolean 데이터와 + 연산이 가능한데 + 연산을 하게되면 다른 데이터를 문자열로 변환해서 결합

"10+20=" + 10 + 20 => "10+20=1020"
"10+20=" + (10 + 20) => "10+20=30

  • %: 나머지 연산자
    • 숫자의 범위를 제한하거나 패턴을 갖는 문장을 실행할 때 사용

실습)패턴을 갖는 명령문을 실행

//빨강, 파랑, 노랑 을 순서대로 1초마다 출력

        int i = 0;
        for(;;) {
            try {
                i = i % 4;
                if(i==0) 
                    System.out.println("라투");
                else if(i==1)
                    System.out.println("오미크론");
                else if(i==2)
                    System.out.println("다크스펙터");
                else
                    System.out.println("오미크론");
                Thread.sleep(1000);
                i++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
  • cd key 나 숫자 코드의 유효성 검사에도 %가 사용됩니다.

4.shift 연산자

  • 정수 데이터를 가지고 왼쪽이나 오른쪽으로 비트 단위로 밀어내는 연산자

  • 2진수로 연산하고 결과는 10진수로 리턴
    => >> , <<, >>>

  • 정수1 >> 정수2 : 정수1을 정수2 비트만큼 오른쪽으로 shift

  • 정수1 << 정수2 : 정수1을 정수2 비트만큼 왼쪽으로 shift

  • 부호비트는 shift 하지 않습니다.

    • 첫번째 비트는 shift 하지 않습니다.

정수1 >>> 정수2 : 부호비트도 shift, 양수 일 때는 >> 와 차이가 없고 음수인 경우 결과가 달라짐

  • 32번 이상 shift 하라고 작성하면 32로 나눈 나머지 만큼만 shift 합니다.

  • 오른쪽으로 한 번 shift 하면 2로 나눈 효과

  • 왼쪽으로 한 번 shift 하면 2를 곱한 효과

4 : 0000 0100

4>>1 : 0000 0010 -> 2
4>>2 : 0000 0001 -> 1

5 / 2 : 0000 0010 -> 2

실습)

        int n = 10;
        //2번을 오른쪽으로 밀면 나누기 4한 효과 - 2가 출력
        System.out.println("n >> 2:" + (n >> 2)); 
        //32번 이상 밀면 모든 비트가 소멸되기 때문에 
        //32번 이상 shift 하면 32로 나눈 나머지 만큼만 shift - 2번만 함
        System.out.println("n >> 34:" + (n >> 34)); 

5.옵션 설정

  • 프로그래밍 언어에서는 사용할 수 있는 옵션을 정수로 만들어 놓는 경우가 종종 있는데 이 때 숫자의 배열을 확인

  • 숫자의 배열이 1, 2, 3, 4, 5 처럼 일련번호 형태로 되어 있으면 이 옵션은 하나 만 선택

  • 숫자의 배열이 1, 2, 4, 8, 16, 32 처럼 2의 지수 승 형태로 되어 있으면 이 옵션은 중복 선택이 가능한 옵션입니다.

    • 애플은 1, 2, 4, 8 이런 식으로 쓰지 않고 1<<0, 1<<1, 1<<2, 1<<3 형태로 만듭니다.
  • 키보드 눌렀을 때
    A:65, B:66, C:67...

  • 마우스 왼쪽:1, 마우스 오른쪽: 2, Shift:4, Control:8, Middle Button: 16, Alt: 32...

6.관계 연산자

  • 2개의 데이터를 비교해서 결과를 boolean 리턴하는 연산자
  • 숫자형에만 사용 가능한 연산자: >, >=, <, <=
  • 모든 자료형에서 사용 가능한 연산자(내용을 비교하는 것이 아니고 가리키고 있는 데이터가 같은지 비교): !=, ==
  • 문자열의 경우는 동일한 데이터이더라도 == 로 비교하면 false가 리턴될 수 있기 때문에 문자열은 ==로 비교하지 않습니다.

7.비트 논리 연산자

  • 정수 데이터에 사용 가능한 연산자로 비트 단위로 연산한 후 결과를 10진 정수로 리턴하는 연산자
  • &(and): 2개의 비트 모두 1일 때 만 1
  • |(or): 2개의 비트 모두 0일 때 만 0
  • ^(xor): 2개의 비트가 같으면 0 다르면 1
  • 이 연산자들은 시스템 프로그래밍이나 그래픽 프로그래밍을 할 때 자주 등장
        int a = 20;//00000000 00000000 00000000 00010100
        int b = 13;//00000000 00000000 00000000 00001101

        //2개 모두 1인 경우에만 1
        System.out.println("a&b:" + (a&b)); //결과는 100 -> 4
        //2개 모두 0인 경우에만 0 나머지 경우는 1
        System.out.println("a|b:" + (a|b)); //결과는 11101 -> 29
        //2개 같은 경우는 0 다른 경우는 1
        System.out.println("a^b:" + (a^b)); //결과는 11001 -> 25

8.조건 논리 연산자

  • boolean 데이터를 가지고 연산을 수행

  • !(NOT): 하나의 데이터를 가지고 연산하는데 결과를 반대로 리턴하는 연산자

  • &&(AND): 둘 다 true 인 경우만 true를 리턴하고 그 이외의 경우는 false 리턴

  • ||(OR): 둘 다 false 인 경우만 false를 리턴하고 그 이외의 경우는 true 리턴

  • and 와 or는 데이터의 순서를 바꿔도 실행 결과는 같지만 과정은 다를 수 있습니다.

    • and는 앞 쪽의 데이터가 false 이면 결과가 무조건 false 이므로 뒤의 데이터를 확인하지 않습니다.
  • or는 앞 쪽의 데이터가 true이면 결과가 무조건 true 이므로 뒤의 데이터를 확인하지 않습니다.

  • 순서에 따라 뒤의 데이터를 확인해야 하기도 하고 확인하지 않아도 되기 때문에 과정이 달라질 수 있습니다.

  • 반복문 안에서 사용할 때는 조금 생각해보고 사용하는 것이 좋습니다.

실습)

int a = 10;
        //a>5 true && a++ > 10
        boolean result = a > 5 && (a++ > 10);
        System.out.println("결과:" + result);
        System.out.println("a:" + a);

        //a<5 false
        //앞의 문장이 거짓이어서 뒤의 문장을 수행하지 않기 때문에 a의 값은 증가하지 않음
        result = a < 5 && (a++ > 10);
        System.out.println("결과:" + result);
        System.out.println("a:" + a);

연습)

        int x = 10;
        //x가 4의 배수인지 판별 - 4로 나누어 떨어지면 4의 배수
        boolean result = x % 4 == 0;
        System.out.println("result:" + result);

        int year = 2020;
        //윤년인지 판별
        //윤년은 4의배수이고 100의 배수가 아닌 경우 또는 400의 배수인 경우
        result = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
        System.out.println("result:" + result);

9.삼항 연산자

  • 변수 = boolean이 나오는 표현식 ? true일 때 수행할 내용 : false 일 때 수행할 내용;

  • 2개의 정수가 있다고 할 때 2개 중에 큰 정수 찾기

int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println("max:" + max);
  • 간단한 분기문을 만들 때는 if 대신에 삼항 연산자를 사용합니다.
    • 삼항 연산자로 작성하는 모든 식은 if로 대신할 수 있습니다.

10.대입연산자

  • = : 오른쪽의 데이터를 왼쪽의 변수에 대입하기 위한 연산자
  • 연산자= : 왼쪽의 변수가 가리키는 데이터에 오른쪽의 데이터를 연산자를 이용해서 연산하고 다시 왼쪽의 변수에 결과를 대입하는 연산
int a = 10;

a += 20;  //a의 값인 10 + 20을 하고 그 결과를 다시 a에 저장
//a의 값은 30
//+ 대신에 다른 연산자들도 사용이 가능

11. 변수의 값을 1증가

a = a + 1;
a += 1;
a++;
  • 예전에는 a++이 가장 빠르다고 했는데 실제로 비교를 해보면 몇 억번 정도 수행해도 별차이가 없음

a = a + 1 방식은 모든 프로그래밍언어에서 사용이 가능
+=, ++ 는 되는 언어가 있고 안되는 언어도 있습니다.

12.연습문제

int second = 309209;
//second에 초가 저장
//하루는 86400 초, 1시간은 3600초, 1분은 60초
//second 가 몇일 몇시간 몇분 몇초인지 출력

int day = second / 86400;
int hour = (second - (day * 86400))/3600;
int minute = (second - (day * 86400) - (hour * 3600))/60;
//초는 분까지 가져간 것을 모두 빼면 되는데 일, 시간, 분은 전부 60의 배수이기 때문에
//60으로 나눈 나머지가 모두 뺀 값이 됩니다.
int sec = second % 60;

System.out.println(day + "일 " + hour +"시간 " + minute + "분 " + sec +"초");

13.자바에서 콘솔에서 입력받기

Scanner sc = new Scanner();
//Scanner는 java.util.Scanner 라서 그냥 Scanner라고 쓰면 에러가 나는데 
//Scanner 글자에 마우스 커서를 갖다 대면 import를 대신 해준다고 메시지가 출력됩니다.
//클릭하면 import를 해줍니다.

//문자열을 입력받고자 하면
문자열변수 = sc.nextLine();

//정수 입력받고자 하면 
정수변수 = sc.nextInt();

실습)
이름과 나이를 입력받아서 출력
이름은 문자열 나이는 정수

        //이름과 나이를 입력받아서 출력하기
        Scanner sc = new Scanner(System.in);
        //이름을 입력받기
        System.out.print("이름입력:");
        String name = sc.nextLine();
        //나이를 입력받기
        System.out.print("나이입력:");
        int age = sc.nextInt();

        //출력
        System.out.println("이름은 " + name + " 나이는 " + age);

        sc.close();

14.제어문자

  • 역슬래시 다음에 하나의 영문 문자를 기재해서 특별한 기능을 수행하도록 한 문자
    • \n: 줄 바꿈
    • \t: 탭
    • \\: 역슬래시
    • \': '
    • \": "
    • \a: 비프음 - C 언어에서는 메인보드 내의 스피커를 이용해서 beep 음 출력

*윈도우 프로그래밍을 하다가 버튼의 제목 같은 곳에서 줄바꿈을 할려고 했는데 \n 으로 안되면 \r \n 을 이용

반응형

'Language_Study > JAVA' 카테고리의 다른 글

[JAVA, App] 5.데이터정렬  (0) 2020.12.23
[JAVA, App] 4.Array  (0) 2020.12.23
[JAVA, App] 3.제어문  (0) 2020.12.21
[JAVA, App] 1.자료형  (0) 2020.12.21
[JAVA, App] 0.Intro  (0) 2020.12.19