'연산자'는 연산을 수행하는 기호를 말합니다. 우리가 아는 사칙연산 부호를 비롯해서 다양한 연산자들이 존재합니다. 연산자가 연산을 수행하려면 반드시 연산의 대상인 '피연산자'가 있어야 합니다. 상수, 변수 또는 식(Expression)을 '피연산자'로 사용할 수 있습니다. '연산자'와 '피연산자'를 조합하여 계산하고자 하는 바를 표한 것을 식(Expression)이라고 합니다.
'피연산자'의 개수로 연산자를 분류하기도 하는데, '피연산자'의 개수가 하나면 '단항 연산자', 두개면 '이항 연산자', 세개면 '삼항 연산자'라고 불립니다. 대부분은 '이항 연산자'이고 삼항은 ' ? : ' 하나뿐입니다.
- 3 - 5
위 처럼 식이 존재하는 경우 두개의 연산자가 포함되어 있는데, 둘 다 같은 기호로 나타내지만 엄연히 다른 연산자입니다. 왼쪽은 '부호 연산자'이고 오른쪽은 '뺄셈 연산자'입니다. 이처럼 서로 다른 연산자의 기호가 같은 경우도 있는데 이럴 때는 '피연산자'의 개수로 구분이 가능합니다.
연산자의 종류와 우선순위
1. 단항 연산자
단항 연산자는 부호[ +, - ]와 증감[ ++, -- ], 비트전환[ ~ ], 논리부정[ ! ], 형변환[ (type) ]연산을 합니다.
static void 부호연산() { int i = 1; System.out.println(+i); // 1 System.out.println(-i); // -1 } static void 증감연산_전위() { int i = 0; System.out.println(++i); // 1 System.out.println(--i); // 0 } static void 증감연산_후위() { int i = 0; System.out.println(i++); // 0 System.out.println(i); // 1 System.out.println(i--); // 1 System.out.println(i); // 0 } static void 비트전환연산() { //2진수로 변환한 다음 1을 0으로 0을 1로 변환하는 연산자입니다. //한마디로 해당 숫자의 1의 보수를 구하는 연산이라고 볼 수 있습니다. int i = 9; System.out.println(~i); // -10 } static void 논리부정연산() { int i = 9; boolean logic = i > 0; System.out.println(!i); // true, false가 아니기 때문에 error System.out.println(logic); // true System.out.println(!logic); // false } static void 형변환연산() { // 큰 타입을 작은 타입 묵시적 형변환이 불가능합니다. // 만약 진행하려면 명시적으로 형변환을 해줘야 합니다. int result = 10; long a = 10; long b = 20; result = a + b; result = (int) a + (int) b; }
2. 산술 연산자
산술 연산자는 보통 사칙[ +, -, *, / ]과 나머지[ % ] 연산을 합니다.
static void 산술연산() { //우선순위 [ *, /, % ] -> [ +, - ] -> [ <<, >> ] 순서로 우선순위를 가집니다. int a = 10; int b = 30; System.out.println(a + b); // 40 System.out.println(-a + b); // 20 System.out.println(a - b); // -20 System.out.println(-a - b); // -40 System.out.println(a * b); // 300 System.out.println(-a * b); // -300 System.out.println(a / b); // 0 System.out.println(-a / b); // 0 System.out.println(a % b); // 10 System.out.println(-a / b); // 0 // << 연산의 경우, 피연산자의 부호와 상관없이 각 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채우지만, // x << n은 x * 2^n의 결과와 같습니다. System.out.println(a << 2); System.out.println(-a << 2); System.out.println(a << 2 == a * Math.pow(2.0, 2.0)); // >> 연산의 경우, 오른쪽으로 이동시키기 때문에 부호가 있는 정수 부호를 유지하기 위해 왼쪽 피연산자가 음수인 경우 빈자리를 1로, 양수이면 0으로 채웁니다. // x >> n은 x / 2^n의 결과와 같습니다. System.out.println(a >> 2); System.out.println(-a >> 2); System.out.println(a >> 2 == a / Math.pow(2.0, 2.0)); }
3. 비교 연산자
크고 작고 같고 다름 [ >, >= , < , <=, ==, !=, instanceof ]을 비교하는 연산을 합니다.
static void 비교연산() { //우선순위 [ <, <=, >, >=, instanceof ] -> [ ==, != ] 순서로 우선순위를 가집니다. int a = 10; int b = 20; System.out.println(a > b); // false System.out.println(a >= b); // false System.out.println(a < b); // true System.out.println(a <= b); // true System.out.println(a == b); // false System.out.println(a != b); // true System.out.println(new Stack() instanceof Vector); // true System.out.println(new Vector() instanceof Stack); // false }
4. 논리 연산자
AND와 OR를 조건으로 연결하여 비교하는 연산입니다.
static void a() { //우선순위 [ & ] -> [ ^ ] -> [ | ] -> [ && ] -> [||] 순서로 우선순위를 가집니다. int a = 3; int b = 1; //비트 단위에서 대한 AND[&], OR[|], XOR[^] 연산 System.out.println(a & b); // 1 System.out.println(a | b); // 3 System.out.println(a ^ b); // 2 boolean logicA = a > b; boolean logicB = b > a; System.out.println(logicA && logicB); System.out.println(logicA || logicB); }
5. 삼항 연산자
조건식 ? 식1 : 식2의 구조를 가지고 세 개의 '피연산자'를 필요로 하는 연산자로 조건식과 일치하면 식1를 그렇지 않으면 식2를 실행하는 구조입니다.
static void 삼항연산() { int a = 10; int b = 20; System.out.println(a > b ? "dev-donghwan" : "donghwan kim"); // donghwan kim }
6. 대입 연산자
우변의 값을 좌변에 대입하는 연산을 합니다.
static void 대입연산() { int a = 8; System.out.println(a += 2); // 10 System.out.println(a -= 2); // 8 System.out.println(a *= 2); // 16 System.out.println(a /= 2); // 8 System.out.println(a %= 2); // 0 System.out.println(a <<= a); // 0 System.out.println(a >>= a); // 0 System.out.println(a &= a); // 0 System.out.println(a ^= a); // 0 System.out.println(a |= a); // 0 }
728x90
반응형
'Language > Java' 카테고리의 다른 글
[Java] orElse vs orElseGet (0) | 2021.10.29 |
---|---|
[Java] Optional (0) | 2021.10.29 |
[Java] 변수 (Variable) (0) | 2021.10.16 |
[Java] SOLID (0) | 2021.09.29 |
[Java] 객체 지향 언어 (0) | 2021.09.29 |
댓글