Categories: Java 언어Korean

Java 총 정리[2. 연산자]

연산자

Java를 시작하고 변수와 자료형을 배웠습니다. 이 두 가지를 가지고 할 수 있는 것은 많지 않습니다. 그럼 그 다음에는 이 변수들이 있는 상황에서 변수를 원하는 값으로 만들려면 어떻게 해야 할지 의문이 생기시죠? 당연히 가공을 하는 변수만 있다면 사람들이 원하는 프로그램이 될 수가 없습니다. 그래서 사람들이 원하는 데이터를 만들 수 있는지 저 또한 공부를 시작하고 변수를 배운 뒤에 많이 궁금했습니다.

프로그램이 사용자가 원하는 동작을 하는 제일 기본적인 것이 무엇일까요? 이것을 안다면 프로그래밍에 제일 기본적인 동작을 구현을 할 수 있습니다. 이 글을 끝까지 읽는다면 프로그래밍에 제일 기본적인 동작을 할 수 있습니다.

프로그래밍에 제일 기초가 되는 연산자에 대한 내용을 상세히 담았습니다. 연산자는 산수나 수학에서 많이 들어 보셨을 겁니다. 그 수학에 나오는 연산자도 프로그래밍에 연산자도 있고 다른 연산자도 존재를 합니다. 이 글을 읽고 연산자를 공부를 하신다면 Java말고도 프로그래밍 언어에서 사용되는 일반적인 연산자를 알 수가 있습니다.

연산자란?

연산자는 연산을 하게하는 자를 나타내는데 이걸 이해가 쉽게 설명을 하면 연산을 할 수 있게 정의한 기호로 보시면 됩니다. 연산자를 통해 연산을 하게 되는데 그러면 값 또는 데이터가 변화가 됩니다. 

예를 들어 +라는 기호는 두 개의 피 연산자를 더하는 연산을 하는 연산자입니다. 여기서 피 연산자는 연산을 당하는 개체를 말을 합니다. 그럼 5 + 3을 하면 5와 3은 피 연산자 이고  +는 연산자가 됩니다. 그러면 더하는 동작을 하기 때문에 결과 값이 8이 나오게 됩니다. 이런 연산을 통해서 사용자가 원하는 기능을 구현을 해야 하기 때문에 연산자는 상당히 중요합니다.

1. 산술 연산자

산술 연산자는 기본적으로 사칙연산자인 +, -, *, /가 있습니다. 여기서 일반적으로 사용 되는 X나 ÷로 사용을 하지 않습니다.  그 이외에는 나머지 연산자, 증가 연산자, 감소 연산자가 있습니다.  나머지 연산자는 나누기를 하고 몫이 아니라 나머지 값을 반환해줍니다. 증가 연산자는 본래 값에서 1을 증가 시켜주고 감소 연산자는 본래 값에서 1을 감소 시켜줍니다. 둘을 증감 연산자라고 부릅니다.

++, –는 전위, 후위의 위치에 따라서 값이 달라집니다.

5+3 // 8
5-3 // 2
5*3 // 15
5/3 // 1
5%3 // 2

int a = 5;
++a; // a의 값은 6(값이 바로 변경 +1)
a++; // a의 값은 6(다음 명령어가 오기전까지는 값을 그대로 유지 그이후에 변경)
//-> 이라인에서 a의 값은 7

int b = 4;
--b; // b의 값은 3(값이 바로 변경 -1)
b--; // b의 값은 3(다음 명령어가 오기전까지는 값을 그대로 유지 그이후에 변경)
//-> 이라인에서 b의 값은 2

2. 관계 연산자

관계 연산자는 기본적으로 대소 비교를 하는 >(크다), <(작다), >=(크거나 같다), <=(작거나 같다)가 있습니다. 여기서 조심하셔야 할 부분은 산수나 수학 시간에 배운 형태가 있는데 =>, =<와 같은 형태로 사용을 하면 안됩니다. 위에 설명을 한대로 >=, <=로 부등호가 먼저 나와야 합니다.

위에 내용 이외에 같다는 수학 시간에 배운 내용을 보면 5 + 3 = 8 이렇게 5+3한 값과 8은 같다를 뜻하지만 프로그래밍 언에서는 =는 대입 연산자로 사용이 됩니다. 대입 연산자는 밑에서 설명을 하겠습니다. 그럼 같다는 == 다르다는 !=으로 나타냅니다. 

이렇게 위와 같이 대소 비교나 같다 그리고 다르다는 무엇을 하려고 필요한 걸까요? 바로 지금 비교하는 것이 참인지 거짓을 판별을 해서 그것에 만든 동작을 구분을 해줄 수 있습니다.

예를 들어 자판기를 보시면 자판기 음료수가 1000원이라고 하면 제가 만약 500원만 넣었다면 음료수 값보다 지불하는 금액이 작으면 음료수를 주는 행위를 하는 것을 막습니다. 이러는 경우에 바로 관계 연산자를 사용하게 됩니다.

3. 논리 연산자

논리 연산자는 2개의 관계 연산자를 묶어서 원하는 조건을 만들 때 사용을 합니다. &&(And), ||(Or), !(Not)이 있습니다.

  1. 조건 1 && 조건 2 이때 조건 1과 조건 2가 참이 나와야 전체가 참이 되고 하나라도 거짓이 오면 거짓이 됩니다.
  2. 조건 1 || 조건 2 이때는 조건 1과 조건 2중에 하나라도 참이 있다면 전체를 참으로 판단을 합니다. 여기서 모든 조건이 거짓이어야 거짓이 됩니다.
  3. ! 조건과 같은 경우에는 Not이기 때문에 조건이 참이 나오면 거짓이 되고 거짓이 나오면 참으로 바꿔주게 됩니다.
int a = 10;
int b = 20;
int c = 30;
int d = 40;

//a<b(참) || c>d(거짓) (OR)   -> true
//a<b(참) && c>d(거짓) (AND)  -> false
//!(a<b(참) || c>d(거짓))   -> false

※ And, Or 같은 경우 무조건 한번만 논리 연산자를 사용을 할 수 있는 것이 아니라 횟수에 대한 제한은 없습니다. 하지만 너무 많은 조건과 연결을 해서 사용을 하면 논리적으로 어려움을 겪을 수 있으니 적당하게 사용을 해야 합니다.

4. 비트 논리 연산자

비트 논리 연산은 10진수의 값을 2진수로 변환을 하고 그렇게 나온 2진수 값을 각 자리 기준으로 연산을 하는 것을 비트 연산자라고 합니다.  

  1. & And비트 연산자로 모두 1이 나와야 1로 연산을 해줍니다.
  2. | Or비트 연산자로 하나라도 1이면 1로 연산을 해줍니다.
  3. ^ Xor비트 연산자로 두 개의 비트가 서로 달라야 1을 주고 같으면 0을 줍니다. 00, 11 => 0 / 01, 10 =>1 이렇게 비트 연산을 합니다.
  4. ! Not비트 연산자는 값을 비트를 반대 값으로 바꿉니다. 0 -> 1, 1->0으로 바뀌게 됩니다.
3 0 0 1 1
4 0 1 0 0
& 0 0 0 0

결과 값은 0이 됩니다.

3 0 0 1 1
4 0 1 0 0
| 0 1 1 1

결과 값은 7이 됩니다.

5 0 1 0 1
7 0 1 1 1
^ 0 0 1 0

결과 값은 2가 됩니다. (0과 1이 달라야 1이 되고 0과 1이 같으면 0이 됩니다.)

5 0 1 0 1
! 1 0 1 0

결과 값은 -5가 됩니다. (0은 1이 되고 1은 0이 됩니다.)

5. 비트 시프트 연산자

비트 시프트 연산자는 비트를 왼쪽이나 오른쪽 방향으로 시프트 시켜서 이동을 해주는 연산자 입니다. 

  1. >> 비트 값이 주어진 만큼 오른쪽으로 이동
  2. << 비트 값이 주어진 만큼 왼쪽으로 이동
  3. >>> 비트 값이 주어진 만큼 오른쪽으로 이동 비어지는 공간은 무조건 0으로 채운다.

※ >> 경우 기본 값이 음수이면 1로 양수이면 0으로 비어진 공간을 채워 줍니다.

01010(10)>>2 결과: 00010(2)

01010(10)<<2 결과: 0101000(40)

110011(-13)>>2 결과: 111100(-4)

110011(-13)<<2 결과: 11001100(-52)

1110011(-13)>>>2 결과 : 0011100(28)  

6. 대입 연산자

대입 연산자는 프로그래밍에서 상당히 중요합니다. 변수에 값을 대입을 할 때 대입 연산자 =를 사용합니다. 

int a = 10; 

이런 명령어를 보면 a라고 하는 변수가 만들어지고 그 변수에 10이라는 값을 대입을 하게 됩니다. 그렇기 때문에 =를 대입 연산자입니다. 

7. 단축 연산자

아래 표를 참고 해주세요.

8. 삼항 연산자

삼항 연산자는 항이 세 개라서 세 개의 항이라서 불립니다. 삼항 연산자는 처음에 관계 연산자나 논리 연산자로 조건을 정리하고  그 조건이 참이면 참 항의 값을 변수에 담고 거짓이면 거 항이 변수에 담겨집니다.

형식 : 변수=조건 ? 참  :거짓

int a = 10;
a = a == 10 ? 1 : 0 ; // a가 10이면 값 1을 a에 대입하고 아니면 0을 a에 대입 
결과 : a에 1이 담깁니다.

9. 연산자 우선순위

연산자마다 우선 순위가 있습니다. 우선 순위가 높은 것을 우선적으로 실행이 됩니다. 사칙연산에서 +,-보다 *,/를 우선적으로 실행하는 것과 같습니다. 

※ 우선 순위를 외우면 좋지만 일반적인 기준을 세우고 하시면 연산자 우선순위로 인해서 문제가 발생하는 경우는 적습니다.

우선순위 연산자 이름
1 [], (), . 인덱스연산자, 괄호, 클래스 맴버 접근연산자
2 ++, --, +, -, !, ~ 증가연산자, 감소 연산자, 단항 +연산자, 단항 -연산자, NOT 연산자, 비트 보수 연산자
3 new, () new 연산자, 캐스트 연산자
4 *, /, % 곱셈 연산자, 나눗셈 연산자, 나머지 연산자
5 +, - + 연산자, - 연산자
6 >>, <<, >>> 시프트 연산자
7 <, >, <=, >=, instance of 관계연산자, instance of연산자
8 ==, != 등가 연산자
9 &, ^, | 비트 논리 연산자
10 &&, ||, 논리 연산자
11 ?:, =, +=, -=... 삼항 연산자, 배정 연산자, 단축 연산자
Dolphin

Recent Posts

Java 총정리[97. Java GUI]

Java GUI Java GUI에 대해서 이번 걸음에서 배움으로써 GUI에 전반적인 지식과 Java GUI를 구현하는 방법…

7개월 ago

Java 총정리[96. Java TCP 통신 프로그램 구현]

Java TCP 통신 프로그램 구현 Java TCP 통신 프로그램 구현을 위해서 이전 걸음에서 쓰레드에 대한…

7개월 ago

Java 총정리[95.쓰레드 통신]

쓰레드 통신 이전 걸음에서 쓰레드의 임계영역에 대해서 같이 공부를 했습니다. 동기화에 대한 개념을 계속적으로 하고…

7개월 ago

Java 총 정리[94. 쓰레드 임계영역]

쓰레드 임계영역 이전 걸음에서 쓰레드의 동기화에 대해서 같이 공부를 했습니다. 동기화에 대한 전반적인 내용을 공부하고…

8개월 ago

Java 총 정리[93. 쓰레드 동기화]

쓰레드 동기화 이전 걸음에서 계속 쓰레드에 대해서 공부를 하고 있습니다. 쓰레드는 상당히 중요한 개념이기 때문에…

8개월 ago

Java 총 정리[92. 쓰레드 join()]

쓰레드 join() 이전 걸음에서 쓰레드의 전반적인 실행 흐름에 대해서 공부를 했습니다. 이제 배운 실행 흐름…

8개월 ago

This website uses cookies.