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

"연산자"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
잔글
잔글
 
(사용자 3명의 중간 판 41개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''연산자'''(Operator)는 어떤 연산을 할지 지정하는 것을 연산자, 연산의 대상이 되는 것을 피연산자라고 한다. 예를 들어, x + y가 있을 때 x는 연산자에 x, y는 피연산자에 해당된다. 연산자는 두 가지로 나뉘는데 논리 부정처럼 피연산자가 한 개만 필요하면 단항 연산자, +처럼 피연산자가 두 개 있으면 이항 연산자라고 한다.
+
'''연산자'''(operator)는 대부분 기본 자료형의 사칙연산 등의 계산을 위해 사용하는 것으로 기본 자료형을 제외한 참조 자료형은 연산자를 사용할 수 없다.
 +
단, 예외로 String 클래스는 + 연산이 가능하다.<ref>〈[https://onsil-thegreenhouse.github.io/programming/java/2017/11/02/java_tutorial_1-4/ 연산자 개념]〉, 《Github-Onsil's blog》, 2017-11-02</ref> 주로 어떤 연산을 할지 지정하는 것을 연산자라하고, 연산의 대상이 되는 것을 피연산자라고 한다. 연산자는 작업의 종류에 따라서 [[대입연산자]], [[산술연산자]], [[비교연산자]], [[논리연산자]] 등으로 나뉜다.<ref name="연산자 개념 및 예시">〈[https://terms.naver.com/entry.nhn?docId=4383177&cid=59941&categoryId=59941 연산자 개념 및 예시]〉, 《네이버 지식백과》</ref>
  
 
== 개요 ==
 
== 개요 ==
어떤 연산을 할 지 지정하는 것을 연산자 연산의 대상이 되는 것을 피연산자라고 한다. 예를 들어, x + y가 있을 때, +는 연산자에 x,y는 피연산자에 해당된다. 논리부정 처럼 피연산자가 한 개만 필요하면 단항 연산자, + 처럼 피연산자가 두 개 있으면 이항연산자라 한다.
+
어떤 연산을 할지 지정하는 것을 연산자 연산의 대상이 되는 것을 피연산자라고 한다. 예를 들어, x + y가 있을 때, +는 연산자에 x, y는 피연산자에 해당된다.<ref name="연산자 개념 및 예시"></ref> 논리 부정처럼 피연산자가 한 개만 필요하면 단항연산자, +처럼 피연산자가 두 개 있으면 이항연산자, 세 개 있으면 삼항연산자라고 한다.<ref name="연산자">〈[https://book.naver.com/bookdb/book_detail.nhn?bid=15766742 연산자]〉, 《2020 시나공 정보처리기사 필기》, 2019-11-13</ref>
*'''결합방식'''
+
 
결합방식(처리순서)는 연산자에 따라 2가지로 나뉜다.  
+
하나의 연산식에 여러 개의 연산이 사용되었을 경우 어떤 것을 먼저 처리할지 정하기 위해 우선순위가 있다. 가장 처음으로는 최고 순위에 있는 (),[]가 처리되고, 단항연산자, 이항연산자, 삼항연산자, 대입연산자, 순서연산자 순으로 처리가 된다. 이항연산자의 경우 산술, 시프트, 관계, 비트, 논리연산자가 이에 해당하며 결합 규칙은 왼쪽에서 오른쪽이다. 삼항연산자의 경우 조건연산자가 해당되며 결합 규칙은 이항연산자와 동일하다.
 +
 
 +
== 특징 ==
 +
===우선순위===
 +
하나의 연산식에 여러 개의 연산이 사용되었을 경우 어떤 것을 먼저 처리할지 정하는 것이다. 순서는 단항연산자→산술연산자→시프트연산자→관계연산자→비트연산자→논리연산자→조건연산자→대입연산자→순서연산자 순으로 낮아진다. 단, ( ), [ ] 연산자는 최우선 연산자로, ( )는 우선순위 변경을 위해 사용되며, [ ]는 배열의 크기나 첨자를 나타낼 때 사용한다.<ref name="연산자"></ref>
 +
 
 +
:{|class=wikitable width=700 style="background-color:#ffffee"
 +
|+연산자 우선순위
 +
!align=center style="background-color:#ffeecc"|대분류
 +
!align=center style="background-color:#ffeecc"|중분류
 +
!align=center style="background-color:#ffeecc"|연산자
 +
!align=center style="background-color:#ffeecc"|결합규칙
 +
|-
 +
|align=center|단항연산자
 +
|align=center|단항연산자
 +
|align=center|!(논리 not), ~(비트 not), ++, --, sizeof(기타)
 +
|align=center|←
 +
|-
 +
|align=center rowspan="5"|이항연산자
 +
|align=center|산술연산자
 +
|align=center|*, /, %(나머지)
 +
|align=center rowspan="5"|→
 +
|-
 +
|align=center|시프트연산자
 +
|align=center|<<, >>, >>>
 +
|-
 +
|align=center|관계연산자
 +
|align=center|<, <=, >, >=, ==, !=
 +
|-
 +
|align=center|비트연산자
 +
|align=center|&(비트 and), ^(비트 xor), |(비트 or)
 +
|-
 +
|align=center|논리연산자
 +
|align=center|&&(논리 and), ∥(논리 or)
 +
|-
 +
|align=center|삼항연산자
 +
|align=center|조건연산자
 +
|align=center|?, :
 +
|align=center|→
 +
|-
 +
|align=center|대입연산자
 +
|align=center|대입연산자
 +
|align=center|=, +=, -=, *=, %=, /=, >>=, <<=
 +
|align=center|←
 +
|-
 +
|align=center|순서연산자
 +
|align=center|순서연산자
 +
|align=center|,
 +
|align=center|→
 +
|}
 +
 
 +
===결합방식===
 +
결합방식(처리순서)는 같은 순위의 연산자가 하나의 수식에 두 개 이상 존재하는 경우 우선적으로 연산하는 방향을 말하는 것으로<ref>〈[https://zapiro.tistory.com/entry/%EC%97%B0%EC%82%B0%EC%9E%90-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%EC%99%80-%EA%B2%B0%ED%95%A9%EB%B0%A9%ED%96%A5 연산자 결합방향]〉, 《Zapiro.Tistory blog》, 2013-04-27</ref> 연산자에 따라 2가지로 나뉜다. '(), [], 산술, 시프트, 관계, 비트, 논리, 조건, 순서' 연산자의 경우 왼쪽에서 오른쪽으로 결합하고, '단항, 대입' 연산자의 경우 오른쪽에서 왼쪽으로 결합한다. 같은 순위의 연산자가 하나의 수식에 두 개 이상 존재하는 경우 우선적으로 연산하는 방향을 말한다.<ref name="연산자"></ref>
  
 
# 예) 1+2+3 → 왼쪽에서 오른쪽으로 결합(1+2→+3)
 
# 예) 1+2+3 → 왼쪽에서 오른쪽으로 결합(1+2→+3)
 
# 예) a=b=c=1 → 오른쪽에서 왼쪽으로 결합(c=1→b=c→a=b)
 
# 예) a=b=c=1 → 오른쪽에서 왼쪽으로 결합(c=1→b=c→a=b)
  
== 특징 ==
+
== 분류 ==
*'''우선순위'''
+
=== 단항연산 ===
하나의 연산식에 여러개의 연산이 사용되었을 경우 어떤 것을 먼저 처리할 지 정하는 것으로 순서 연산자→대입 연산자→조건 연산자→논리 연산자→비트 연산자→관계 연산자→시프트 연산자→산술 연산자→단항 연산자 순으로 우선순위가 높아진다.
+
* '''SELECT''' : 릴레이션에서 주어진 조건을 만족하는 튜플을 선택하는 연산자
조금 더 자세하게 기술 하자면 증감→산술→(* / %)→산술(+ -)→시프트→관계(< <= >)→관계(== !=)→비트(& ^  |)→논리(&& ||)→조건→대입→순서로 우선순위가 높다.
+
:결과 릴레이션의 차수 = 입력 릴레이션의 차수
 +
:결과 릴레이션의 Cardinality <= 원래 릴레이션의 Cardinality<ref name='db_re'>jhkang-dev, 〈[https://jhkang-tech.tistory.com/51 DB 관계 대수]〉, 2018-10-16</ref>
 +
 
 +
* '''PROJECT''' : 릴레이션에서 Attribute 리스트에 제시된 Attribute만을 추출하는 연산자
 +
:한 릴레이션의 Attribute들의 부분집합
 +
:하나의 입력 릴레이션에 적용되므로 단항연산자
 +
:PROJECT 연산을 하면 중복이 제거된다 --> PROJECT 연산의 결과는 중복이 제거된 distinctive한 튜플이다.<ref name='db_re'></ref>
 +
 
 +
=== 집합연산 ===
 +
* '''합집합'''(union) : 이항 연산으로 관계성이 있는 두개의 릴레이션을 합집합하여 하나의 릴레이션을 만들어내는 연산이다. 즉, 테이블을 합해서 추출한다.<ref name='db_re'></ref>
 +
 
 +
* '''교집합'''(intersect) : 이항 연산으로 관계성이 있는 두개의 릴레이션에서 중복되어 있는 내용을 선택하여 새로운 릴레이션을 만들어 내는 연산이다. 즉, 겹치는 부분을 추출한다.<ref name='db_re'></ref>
 +
 
 +
* '''차집합'''(difference) : 이항 연산으로 관계성이 있는 두개의 릴레이션이 있을 때 그 중 하나의 릴레이션에서 또 다른 릴레이션의 내용과 겹치는 내용을 제거해서 새로운 릴레이션을 생성하는 연산이다. 즉, 중복된 값을 제거하고 결과값을 추출한다.<ref name='db_re'></ref>
 +
 
 +
* '''카디션 프로덕트'''(cartesian product) : 이항 연산으로 두 릴레이션의 현재 튜플로 구성 가능한 모든 조합을 만든다.
 +
:결과 릴레이션의 차수 = R의 차수 + S의 차수
 +
:결과 릴레이션의 카디널리티 = R의 카디널리티 * S의 카디널리티<ref name='db_re'></ref>
  
 
== 종류 ==
 
== 종류 ==
연산자의 종류는 산술 연산자, 관계 연산자, 비트 연산자, 논리 연산자, 할당 연산자, 기타 연산자로 나뉜다.
+
연산자의 종류는 [[산술연산자]], [[관계연산자]], [[비트연산자]], [[논리연산자]], [[대입연산자]], [[조건연산자]], 기타 연산자로 나뉜다.<ref name="연산자"></ref>
*'''산술 연산자'''
+
 
가, 감, 승, 제 등의 산술 계산에 사용되는 연산자로 '+, -, *, /, %, ++, --'가 있다.
+
===산술연산자===
 +
[[산술연산자]]는 가, 감, 승, 제 등의 산술 계산에 사용되는 연산자로 '+, -, *, /, %, ++, --'가 있다. 산술연산자는 안에서도 우선 순위가 나뉘는데 증감연산자→산술연산자(* / %)→산술연산자(+ -)순으로 높아진다. 산술연산자 중 '* / %'는 우선순위가 같아 왼쪽에서 오른쪽 방향으로 순서대로 계산한다. 또한, 피연산자의 크기가 4byte보다 작을 경우 4byte(int형)로 변환한 후 연산을 수행한다. 고려 사항으로는 연산하기 전에 데이터형을 둘 중 더 큰 자료형으로 일치시켜야 하고, 정수와 정수 나눗셈시 정수로 나와야 하므로 소수는 버려지고 정수만 출력된다.<ref>〈[https://raccoonjy.tistory.com/9 산술 연산자]〉, 《Tistory blog》, 2017-06-30</ref> 산술연산자 중 증감연산자(++,--)는 전치와 후치로 분류되는데 전치(++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이다.<ref name="논리 연산자"></ref>
 +
 
 +
:{|class=wikitable width=700 style="background-color:#ffffee"
 +
|+비트연산자
 +
!align=center style="background-color:#ffeecc"|x
 +
!align=center style="background-color:#ffeecc"|y
 +
!align=center style="background-color:#ffeecc"|x | y
 +
!align=center style="background-color:#ffeecc"|x & y
 +
!align=center style="background-color:#ffeecc"|x ^ y
 +
|-
 +
|align=center|1
 +
|align=center|1
 +
|align=center|1
 +
|align=center|1
 +
|align=center|0
 +
|-
 +
|align=center|1
 +
|align=center|0
 +
|align=center|1
 +
|align=center|0
 +
|align=center|1
 +
|-
 +
|align=center|0
 +
|align=center|1
 +
|align=center|1
 +
|align=center|0
 +
|align=center|1
 +
|-
 +
|align=center|0
 +
|align=center|0
 +
|align=center|0
 +
|align=center|0
 +
|align=center|0
 +
|}
 +
 
 +
===논리연산자===
 +
[[논리연산자]]는 두 개의 논리 값을 연산하여 참 또는 거짓을 결과로 얻는 연산자로 '!(not), &&(and), ∥(or)'이 있다. 피연산자로 boolean형 값을 결과로 하는 조건식만을 허용하며 '&&'가 '∥' 연산보다 우선순위가 높으므로 한 조건식에 '&&'와 '∥'가 함께 사용될 때는 괄호를 사용하여 우선순위를 명확하게 해주어야 한다. '&&'는 AND 연산자로 피연산자 양쪽 모두 참(True)이면 참이다. '∥'는 OR 연산자로 피연산자 중 어느 한 쪽이 참(True)이면 참이다. 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있으며, '&&'의 경우에는 연산결과가 거짓(False)일 확률이 높은 피연산자를 연산자의 좌측에 놓아야 더 빠른 연산결과를 얻을 수 있다.<ref name="논리 연산자">〈[https://programmer-seva.tistory.com/9 논리 연산자 및 비트 연산자]〉, 《세바의 코딩교실》, 2016-01-28</ref>
 +
 
 +
:{|class=wikitable width=700 style="background-color:#ffffee"
 +
|+논리연산자
 +
!align=center style="background-color:#ffeecc"|x
 +
!align=center style="background-color:#ffeecc"|y
 +
!align=center style="background-color:#ffeecc"|x∥y
 +
!align=center style="background-color:#ffeecc"|x && y
 +
|-
 +
|align=center|true
 +
|align=center|true
 +
|align=center|true
 +
|align=center|true
 +
|-
 +
|align=center|true
 +
|align=center|false
 +
|align=center|true
 +
|align=center|false
 +
|-
 +
|align=center|false
 +
|align=center|true
 +
|align=center|true
 +
|align=center|false
 +
|-
 +
|align=center|false
 +
|align=center|false
 +
|align=center|false
 +
|align=center|false
 +
|}
 +
 
 +
===대입연산자===
 +
[[대입연산자]]는 연산 후 결과를 대입하는 연산식을 간략하게 입력할 수 있도록 하는 연산자이다. 대입연산자에는 '+= -= *= /= %= <<= >>='가 있다. 자바에서는 대입연산자와 다른 연산자를 결합하여 만든 다양한 복합 대입연산자를 제공한다.<ref>〈[http://tcpschool.com/java/java_operator_assignment 대입 연산자]〉, 《TCPSCHOOL》</ref>
 +
 
 +
===조건연산자===
 +
[[조건연산자]]는 조건에 따라 서로 다른 수식을 수행하는 것이다. 삼항연산자에 속하며 if문으로 처리했을 때보다 라인수를 획기적으로 줄여준다. 따라서 가벼운 로직을 처리한다면 if문 보다는 조건연산자를 사용하여 처리하는 것이 훨씬 좋다.<ref>〈[https://coding-factory.tistory.com/266 조건 연산자]〉, 《코딩팩토리》, 2018-12-01</ref>
 +
 
 +
조건 ? 수식1 : 수식2; -> '조건'의 수식이 참이면 '수식1'을 거짓이면 '수식2'를 실행'''
 +
 
 +
===기타 연산자===
 +
sizeof, (콤마), (자료형) 등이 있다.
 +
 
 +
==활용==
 +
===산술연산자===
 +
산술연산자 예시<ref name="연산자 예시">〈[https://josephian.tistory.com/213 산술 연산자, 대입연산자 예시]〉, 《Tisroty - 요셉의 꿈》, 2015-05-05</ref>
  
산술 연산자는 안에서도 우선 순위가 나뉘는데 증감 연산자→산술 연산자(* / %)→산술 연산자(+ -)순으로 높아진다.
+
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
 +
    //우선순위를 보기 위함
 +
    //실제 사용시 소괄호()를 사용하는 것이 좋다.
 +
    //자바에서 +는 숫자일 경우 덧셈이되고 문자는 그 뒤에 붙이는 것이 된다.
 +
}
  
산술 연산자 중 '* / %'는 우선순위가 같아 왼쪽에서 오른쪽 방향으로 순서대로 계산한다.
+
===관계연산자===
 +
관계연산자 예시
  
'''ex) 3 - 7 % 8 + 5'''
+
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
 +
}
  
연산자 우선 순위에 따라 '7 % 8''3 -''+ 5'를 하여 답은 1이 된다.
+
===비트연산자===
 +
비트연산자 예시<ref>〈[https://donologue.tistory.com/55 비트 연산자 예시]〉, 《구운밤》, 2016-07-10</ref>
 +
 
 +
~(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
 +
 
 +
===논리연산자===
 +
논리연산자 예시<ref name="논리 연산자"></ref>
 +
 
 +
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("유효하지 않은 문자입니다.");
 +
  }
 +
  } // 결과: 유효한 문자입니다.
 +
 
 +
===대입연산자===
 +
대입연산자 예시<ref name="연산자 예시"></ref>
 +
 
 +
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
 +
  // (조건문) ? 참일 경우 : 거짓일 경우
 +
 
 +
{{각주}}
  
 
== 참고자료 ==
 
== 참고자료 ==
* [[상수]]
+
* [Java] 연산자(operator), 〈[https://onsil-thegreenhouse.github.io/programming/java/2017/11/02/java_tutorial_1-4 연산자 개념]〉, 《GitHub-Onsil'blog》
* [[변수]]
+
* 연산자 우선순위와 결합방향, 〈[https://zapiro.tistory.com/entry/%EC%97%B0%EC%82%B0%EC%9E%90-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%EC%99%80-%EA%B2%B0%ED%95%A9%EB%B0%A9%ED%96%A5 결합방향]〉, 《Zapiro.Tistory blog》
 +
* 소프트웨어 어휘다지기 - 중등, 〈[https://terms.naver.com/entry.nhn?docId=4383177&cid=59941&categoryId=59941 연산자 개념 및 예시]〉, 《네이버 지식백과》
 +
* 2020 정보처리기사 필기, 〈연산자 종류〉, 《길벗》
 +
* [JAVA][연산자1] 산술연산자, 대입연산자, 〈[https://josephian.tistory.com/213 산술연산자, 대입연산자 예시]〉, 《Tistory - 요셉의 꿈》, 2015-05-05
 +
* [스터비_자바기본] 9.논리연산자, 〈[https://programmer-seva.tistory.com/9 논리연산자,비트연산자 표]〉, 《Tistory - 세바의 코딩교실》
 +
* 6 자바 JAVA의 비트연산자!, 〈[https://donologue.tistory.com/55 비트연산자 예시]〉, 《Tistory - 구운밤》
 +
* [Java] 삼항 연산자 사용법&예제, 〈[https://coding-factory.tistory.com/266 조건 연산자]〉, 《코딩팩토리》
 +
* 자바(Java)의 기초 박살내기-연산자(Operator), 〈[https://raccoonjy.tistory.com/9 산술 연산자]〉, 《Tistory - 너굴너굴 조재연의 프로그래밍》
 +
* 대입 연산자, 〈[http://tcpschool.com/java/java_operator_assignment 대입 연산자]〉, 《TCPSCHOOL》
 +
 
 +
== 같이 보기 ==
 +
* [[논리연산자]]
 +
* [[대입연산자]]
 +
* [[시프트연산자]]
 +
* [[증감연산자]]
 +
* [[산술연산자]]
 +
* [[비트연산자]]
 +
* [[도움말:특수문자]]
  
{{프로그래밍|토막글}}
+
{{프로그래밍|검토 필요}}

2022년 6월 27일 (월) 23:56 기준 최신판

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