검수요청.png검수요청.png

연산자

해시넷
이동: 둘러보기, 검색

연산자(operator)는 대부분 기본 자료형의 사칙연산 등의 계산을 위해 사용하는 것으로 기본 자료형을 제외한 참조 자료형은 연산자를 사용할 수 없다. 단, 예외로 String 클래스는 + 연산이 가능하다.[1] 주로 어떤 연산을 할지 지정하는 것을 연산자라하고, 연산의 대상이 되는 것을 피연산자라고 한다. 연산자는 작업의 종류에 따라서 대입연산자, 산술연산자, 비교연산자, 논리연산자 등으로 나뉜다.[2]

개요

어떤 연산을 할지 지정하는 것을 연산자 연산의 대상이 되는 것을 피연산자라고 한다. 예를 들어, x + y가 있을 때, +는 연산자에 x, y는 피연산자에 해당된다.[2] 논리 부정처럼 피연산자가 한 개만 필요하면 단항연산자, +처럼 피연산자가 두 개 있으면 이항연산자, 세 개 있으면 삼항연산자라고 한다.[3]

하나의 연산식에 여러 개의 연산이 사용되었을 경우 어떤 것을 먼저 처리할지 정하기 위해 우선순위가 있다. 가장 처음으로는 최고 순위에 있는 (),[]가 처리되고, 단항연산자, 이항연산자, 삼항연산자, 대입연산자, 순서연산자 순으로 처리가 된다. 이항연산자의 경우 산술, 시프트, 관계, 비트, 논리연산자가 이에 해당하며 결합 규칙은 왼쪽에서 오른쪽이다. 삼항연산자의 경우 조건연산자가 해당되며 결합 규칙은 이항연산자와 동일하다.

특징

우선순위

하나의 연산식에 여러 개의 연산이 사용되었을 경우 어떤 것을 먼저 처리할지 정하는 것이다. 순서는 단항연산자→산술연산자→시프트연산자→관계연산자→비트연산자→논리연산자→조건연산자→대입연산자→순서연산자 순으로 낮아진다. 단, ( ), [ ] 연산자는 최우선 연산자로, ( )는 우선순위 변경을 위해 사용되며, [ ]는 배열의 크기나 첨자를 나타낼 때 사용한다.[3]

연산자 우선순위
대분류 중분류 연산자 결합규칙
단항연산자 단항연산자 !(논리 not), ~(비트 not), ++, --, sizeof(기타)
이항연산자 산술연산자 *, /, %(나머지)
시프트연산자 <<, >>, >>>
관계연산자 <, <=, >, >=, ==, !=
비트연산자 &(비트 and), ^(비트 xor), |(비트 or)
논리연산자 &&(논리 and), ∥(논리 or)
삼항연산자 조건연산자 ?, :
대입연산자 대입연산자 =, +=, -=, *=, %=, /=, >>=, <<=
순서연산자 순서연산자 ,

결합방식

결합방식(처리순서)는 같은 순위의 연산자가 하나의 수식에 두 개 이상 존재하는 경우 우선적으로 연산하는 방향을 말하는 것으로[4] 연산자에 따라 2가지로 나뉜다. '(), [], 산술, 시프트, 관계, 비트, 논리, 조건, 순서' 연산자의 경우 왼쪽에서 오른쪽으로 결합하고, '단항, 대입' 연산자의 경우 오른쪽에서 왼쪽으로 결합한다. 같은 순위의 연산자가 하나의 수식에 두 개 이상 존재하는 경우 우선적으로 연산하는 방향을 말한다.[3]

  1. 예) 1+2+3 → 왼쪽에서 오른쪽으로 결합(1+2→+3)
  2. 예) a=b=c=1 → 오른쪽에서 왼쪽으로 결합(c=1→b=c→a=b)

분류

단항연산

  • SELECT : 릴레이션에서 주어진 조건을 만족하는 튜플을 선택하는 연산자
결과 릴레이션의 차수 = 입력 릴레이션의 차수
결과 릴레이션의 Cardinality <= 원래 릴레이션의 Cardinality[5]
  • PROJECT : 릴레이션에서 Attribute 리스트에 제시된 Attribute만을 추출하는 연산자
한 릴레이션의 Attribute들의 부분집합
하나의 입력 릴레이션에 적용되므로 단항연산자
PROJECT 연산을 하면 중복이 제거된다 --> PROJECT 연산의 결과는 중복이 제거된 distinctive한 튜플이다.[5]

집합연산

  • 합집합(union) : 이항 연산으로 관계성이 있는 두개의 릴레이션을 합집합하여 하나의 릴레이션을 만들어내는 연산이다. 즉, 테이블을 합해서 추출한다.[5]
  • 교집합(intersect) : 이항 연산으로 관계성이 있는 두개의 릴레이션에서 중복되어 있는 내용을 선택하여 새로운 릴레이션을 만들어 내는 연산이다. 즉, 겹치는 부분을 추출한다.[5]
  • 차집합(difference) : 이항 연산으로 관계성이 있는 두개의 릴레이션이 있을 때 그 중 하나의 릴레이션에서 또 다른 릴레이션의 내용과 겹치는 내용을 제거해서 새로운 릴레이션을 생성하는 연산이다. 즉, 중복된 값을 제거하고 결과값을 추출한다.[5]
  • 카디션 프로덕트(cartesian product) : 이항 연산으로 두 릴레이션의 현재 튜플로 구성 가능한 모든 조합을 만든다.
결과 릴레이션의 차수 = R의 차수 + S의 차수
결과 릴레이션의 카디널리티 = R의 카디널리티 * S의 카디널리티[5]

종류

연산자의 종류는 산술연산자, 관계연산자, 비트연산자, 논리연산자, 대입연산자, 조건연산자, 기타 연산자로 나뉜다.[3]

산술연산자

산술연산자는 가, 감, 승, 제 등의 산술 계산에 사용되는 연산자로 '+, -, *, /, %, ++, --'가 있다. 산술연산자는 안에서도 우선 순위가 나뉘는데 증감연산자→산술연산자(* / %)→산술연산자(+ -)순으로 높아진다. 산술연산자 중 '* / %'는 우선순위가 같아 왼쪽에서 오른쪽 방향으로 순서대로 계산한다. 또한, 피연산자의 크기가 4byte보다 작을 경우 4byte(int형)로 변환한 후 연산을 수행한다. 고려 사항으로는 연산하기 전에 데이터형을 둘 중 더 큰 자료형으로 일치시켜야 하고, 정수와 정수 나눗셈시 정수로 나와야 하므로 소수는 버려지고 정수만 출력된다.[6] 산술연산자 중 증감연산자(++,--)는 전치와 후치로 분류되는데 전치(++a, --a)는 변수 앞에 증감연산자가 오는 형태로 먼저 변수의 값을 증감시킨 후 변수를 연산에 사용하는 것이고, 후치(a++, a--)는변수 뒤에 증감연산자가 오는 형태로 먼저 변소를 연산에 사용한 후 변수의 값을 증감시킨다.

예) 3 - 7 % 8 + 5

연산자 우선 순위에 따라 '7 % 8'→'3 -'→'+ 5'를 하여 답은 1이 된다.

관계연산자

관계연산자는 두 수의 관계를 비교하여 참 또는 거짓을 결과로 얻는 연산자로 '== != > >= < <='가 있다. 왼쪽을 기준으로 크다 또는 크거나 같다로 해석한다.

비트연산자

비트연산자는 비트별(0, 1)로 연산하여 결과를 얻는 연산자로 '&(and) ^( xor) |(or) ~(not) <<(비트 왼쪽 이동) >>(비트 오른쪽 이동)'이 있다. 실수형인 float와 double을 제외한 모든 기본형에 사용이 가능하며 피연산자를 int타입으로 자동 타입 변환한 후 연산을 수행한다. 그렇기 때문에 byte,short,char타입을 비트 논리 연산하면 그 결과는 int 타입이 된다. '|'는 OR 연산자로 피연산자 중 어느 한 쪽이 1이면 1이다. '&'는 AND 연산자로 피연산자 양 쪽 모두 1이면 1이다. '^'는 XOR 연산자로 피연산자가 서로 다를 때 1이다.[7]

비트연산자
x y x | y x & y x ^ y
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1
0 0 0 0 0

논리연산자

논리연산자는 두 개의 논리 값을 연산하여 참 또는 거짓을 결과로 얻는 연산자로 '!(not), &&(and), ∥(or)'이 있다. 피연산자로 boolean형 값을 결과로 하는 조건식만을 허용하며 '&&'가 '∥' 연산보다 우선순위가 높으므로 한 조건식에 '&&'와 '∥'가 함께 사용될 때는 괄호를 사용하여 우선순위를 명확하게 해주어야 한다. '&&'는 AND 연산자로 피연산자 양쪽 모두 참(True)이면 참이다. '∥'는 OR 연산자로 피연산자 중 어느 한 쪽이 참(True)이면 참이다. 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있으며, '&&'의 경우에는 연산결과가 거짓(False)일 확률이 높은 피연산자를 연산자의 좌측에 놓아야 더 빠른 연산결과를 얻을 수 있다.[7]

논리연산자
x y x∥y x && y
true true true true
true false true false
false true true false
false false false false

대입연산자

대입연산자는 연산 후 결과를 대입하는 연산식을 간략하게 입력할 수 있도록 하는 연산자이다. 대입연산자에는 '+= -= *= /= %= <<= >>='가 있다. 자바에서는 대입연산자와 다른 연산자를 결합하여 만든 다양한 복합 대입연산자를 제공한다.[8]

조건연산자

조건연산자는 조건에 따라 서로 다른 수식을 수행하는 것이다. 삼항연산자에 속하며 if문으로 처리했을 때보다 라인수를 획기적으로 줄여준다. 따라서 가벼운 로직을 처리한다면 if문 보다는 조건연산자를 사용하여 처리하는 것이 훨씬 좋다.[9]

조건 ? 수식1 : 수식2; -> '조건'의 수식이 참이면 '수식1'을 거짓이면 '수식2'를 실행

기타 연산자

sizeof, (콤마), (자료형) 등이 있다.

활용

산술연산자

산술연산자 예시[10]

public static void main(String[] args){
   //임의의 변수 선언 후 값 부여
   int i = 5;
   int j = 2;
   int result = i + j;
   System.out.println("덧셈결과 : " + result); → 7
   result = i - j;
   System.out.println("뺄셈결과 : " + result); → 3
   System.out.println("곱셈결과 : " + i*j); → 10
   System.out.println("나눗셈결과 : " + i/j); →2
   System.out.println("나머지결과 : " + i%j); →1
   //우선순위를 보기 위함
   //실제 사용시 소괄호()를 사용하는 것이 좋다.
   //자바에서 +는 숫자일 경우 덧셈이되고 문자는 그 뒤에 붙이는 것이 된다.
}

관계연산자

관계연산자 예시

public static void main(String[] args){
  int a = 2;
  int b = 3;
  System.out.println(a == b); → false
  System.out.println(a != b); → true
  System.out.println(a > b); → false
  System.out.println(a < b); → true
  System.out.println(a >= b); → false
  System.out.println(a <= b); → true 
}

비트연산자

비트연산자 예시[11]

~(not) 연산자

   int num1 = 9;
   int num2 = ~num1
   // num1 = 1001
   // num2 = 0110
   // 비트를 0이면 1로 1이면 0으로 반전시킨다.

&(and) 연산자

   int num1 = 9;
   int num2 = 15;
   int num3 = num1 & num2;
   // num1 = 1001
   // num2 = 1111
   // num3 = 1001
   // 두 비트 모두 1일때 1을 반환한다.

|(or)연산자

   int num1 = 9;
   int num2 = 15;
   int num3 = num1 | num2;
   // num1 = 1001
   // num2 = 1111
   // num3 = 1111
   // 두 비트 중 하나라도 1이면 1을 반환한다. 

^(xor)연산자

   int num1 = 9;
   int num2 = 15;
   int num3 = num1 ^ num2;
   // num1 = 1001
   // num2 = 1111
   // num3 = 0110
   // 두 비트가 다를 때 1을 반환한다. 

시프트연산자

   int num1 = 9;
   num1 = num1 << 2;
   // num1 = 1001 (왼쪽으로 2비트)→ 0010 0100 → 36
   int num2 = 9;
   num2 = num2 >> 2;
   // num2 = 1001 (오른쪽으로 2비트)→ 0010 → 2 

논리연산자

논리연산자 예시[7]

public static void main(String[] args){
  char x = 'j';
  if((x >= 'a' && x <= 'z') ∥ (x >= 'A' && x <= 'Z')){
   System.out.println("유효한 문자입니다.");
  } else {
   System.out.println("유효하지 않은 문자입니다.");
  }
 } // 결과: 유효한 문자입니다.

대입연산자

대입연산자 예시[10]

public static void main(String[] args){
  double e - 3.1;
  e += 2.1; //e=e+2.1; 자기 자신에게 다시 뎃셈
  e *= 2; //e=e*2; 자기 자신에게 다시 곱셈
  int n = 5;
  n *= 2.2; //n=n*2.2; 자기자신에게 곱셈해서 다시 자기자신에게 넣음
            //2.2는 실수(기본형 double)이므로 n도 실수 double형으로 변경
            //5는 5.0으로 변경, 결과값 11.0이 다시 n으로 정해질 때 int로 변경
  System.out.println(e); //10.4
  System.out.println(n); //11
} 

조건연산자

조건연산자 예시

  int b = (5 < 4) ? 50 : 40;
  System.out.println(b) → 40
  // (조건문) ? 참일 경우 : 거짓일 경우 

각주

  1. 연산자 개념〉, 《Github-Onsil's blog》, 2017-11-02
  2. 2.0 2.1 연산자 개념 및 예시〉, 《네이버 지식백과》
  3. 3.0 3.1 3.2 3.3 연산자〉, 《2020 시나공 정보처리기사 필기》, 2019-11-13
  4. 연산자 결합방향〉, 《Zapiro.Tistory blog》, 2013-04-27
  5. 5.0 5.1 5.2 5.3 5.4 5.5 jhkang-dev, 〈DB 관계 대수〉, 2018-10-16
  6. 산술 연산자〉, 《Tistory blog》, 2017-06-30
  7. 7.0 7.1 7.2 논리 연산자 및 비트 연산자〉, 《세바의 코딩교실》, 2016-01-28
  8. 대입 연산자〉, 《TCPSCHOOL》
  9. 조건 연산자〉, 《코딩팩토리》, 2018-12-01
  10. 10.0 10.1 산술 연산자, 대입연산자 예시〉, 《Tisroty - 요셉의 꿈》, 2015-05-05
  11. 비트 연산자 예시〉, 《구운밤》, 2016-07-10

참고자료

같이 보기


  검수요청.png검수요청.png 이 연산자 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.