728x90
반응형
1. 연산자(Operator)
1.1 연산자(operator)와 피연산자(operand)
- 연산자(operator): 연산을 수행하는 기호(+, -, *, / 등)
- 피연산자(operand): 연산자가 연산을 수행할 대상(변수, 상수, 리터럴, 수식)
연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.
1.2 식(式)과 대입연산자
- 식(式, expression): 연산자와 피연산자를 조합하여 계산하고자하는 바를 표현한 것
그리고 식을 계산하여 결과를 얻는 것을 식을 평가한다라고 함. 즉, 하나의 식을 평가(계산)하면 하나의 결과를 얻는다.
<하략>
1.3 연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | +, -, *, /, %, <<, >> | 사칙 연산(+, -, *, /)과 나머지 연산(%) |
비교 연산자 | >, <, >=, <=, ==, != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | &&, ||, !, &, |, ^, ~ | '그리고(and)'와 또는('or')으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ? : instanceof | 형변환 연산자, 삼항 연산자, instanceof연산자 |
- 피연산자의 개수에 의한 분류
- 단항 연산자: 피연산자의 개수가 하나
- 이항 연산자: 피연산자의 개수가 두개
- 삼항 연산자: 피연산자의 개수가 세개 ➡ ?: 하나뿐
1.4 연산자의 우선순위와 결합규칙
- 연산자의 우선순위: 연산자가 둘 이상인 경우 연산자의 우선순위에 의해서 연산 순서가 결정된다
우선순위의 크기를 부등호로 표현- 단항 연산자 > 이항 연산자
- 곱셈, 나눗셈 > 덧셈, 뺄셈
- 산술 연산자 > 비교 연산자
- 비교 연산자 > 논리 연산자
- 대입 연산자가 연산자 중에서 우선순위가 가장 낮다
- 덧셈 연산자 > 쉬프트 연산자
- 비교 연산자 > 비트 연산자
- AND(&, &&) > OR(|, ||)
연산자의 결합규칙
- 하나의 식에 같은 우선순위의 연산자들이 여러 개 있을 경우, 어떤 것을 먼저 처리할 것인가에 관한 규칙
- 연산자에 따라 다르지만 대부분 왼쪽에서 오른쪽의 순서로 수행한다
※ 단항 연산자, 대입 연산자: 오른쪽에서 왼쪽의 순서로 수행
- 연산자에 따라 다르지만 대부분 왼쪽에서 오른쪽의 순서로 수행한다
- 즉,
- 산술>비교>논리>대입. 대입은 제일 마지막에 수행된다
- 단항(1)>이항(2)>삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 좌 ➡ 우
1.5 산술 변환(usual arithmetic conversion)
- 이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전에 형변환 연산자로 타입을 일치시켜야한다.
- 대부분의 경우 두 피연산자의 타입 중에서 더 큰 타입으로 일치시키는데, 그 이유는 작은 타입으로 형변환하면 원래의 값이 손실될 가능성이 있기 때문이다.
- 이처럼 연산 전에 피연산자 타입의 일치를 위해 자동 형변화되는 것을 산술 변환 또는 일반 산술 변환이라고 하며, 모든 연산에서 일어난다. 쉬프트 연산자와 증감 연산자느 예외
- 산술 변환의 규칙
- 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
ex) long + int ➡ long + long ➡ long
float + int ➡ float + float ➡ float
double + float ➡ double + double ➡ double - 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
ex) byte + short ➡ int + int ➡ int
char + short ➡ int + int ➡ int
- 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
2. 단항 연산자
2.1 증감 연산자 ++ --
- 증감 연산자: 피연산자에 저장된 값을 1 증가 또는 감소시킨다. 증감연산자의 피연산자로 정수, 실수는 가능하고 상수는 불가능하다. 산술 변환이 발생하지 않고 연산결과의 타입은 피연산자와 같다.
- 증가 연산자(++): 피연산자의 값을 1 증가시킨다.
- 감소 연산자(--): 피연산자의 값을 1 감소시킨다.
- 일반적으로 단항 연산자는 피연산자의 왼쪽에 위치하지만 증감 연산자는 양쪽 모두 가능하다. 피연산자의 왼쪽에 위치하면 전위형(prefix), 오른쪽에 위치하면 후위형(postfix)라고 한다
타입 설명 사용예 전위형 값이 참조되기 전에 증가시킨다 j = ++i; 후위형 값이 참조된 후에 증가시킨다 j = i++; - 다른 수식에포함되거나 메서드의 매개변수로 사용된 경우
- 전위형: 변수(피연산자)의 값을 먼저 증가(감소)시킨 후에 변수의 값을 읽어온다.
- 후위형: 변수(피연산자)의 값을 먼저 참조한 후 값을 증가(감소)시킨다.
2.2 부호 연산자 + -
- 부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환한다. 피연산자가 음수면 양수, 양수면 음수가 연산의 결과가 된다.
부호 연산자는 boolean형과 char형을 제외한 기본형에만 사용할 수 있다.
3. 산술 연산자
3.1 사칙 연산자 + - / *
<중략>
- 나누기 연산자의 두 피연산자가 모두 int타입인 경우, 연산결과 역시 int타입이다.그래서 10 / 4의 실제 연산결과는 2.5일지라도 int타입의 값인 2를 결과로 얻는다. int 타입은 소수점을 저장하지 못하므로 정수만 남고 소수점 이하는 버려진다.(반올림X)
따라서, 올바른 연산 결과를 얻기 위해서는 두 피연산자 중 어느 한 쪽을 실수형으로 형번환해야 한다. - 10 / 4 = 2
- 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다. 만일 0으로 나누면 컴파일은 정상적으로 되지만 실행 시 오류(ArithmeticException)이 발생한다.
부동 소수점 값인 0.0f, 0.0d로 나누는 것은 가능하지만 그 결과는 무한대이다.
<중략>
- 피연산자로 숫자뿐만 아니라 문자(char)도 가능하다. 문자는 실제로 해당 문자의 유니코드로 바뀌어 저장되므로 문자간의 사칙연산은 정수간의 연산과 동일하다.위 코드의 c1+1을 계산할 때 c1이 char형이므로 int형으로 변환한 후 연산을 수행한다. c1에 저장되어 있는 코드값이 변환되어 int형 값이 되는 것이다. 따라서 c1+1은 97+1이 되고 결과적으로 int 형 변수 i에는 98이 저장된다.
char c1 = 'a';
char c2 = ' ';
c2 = (char) (c1 + 1);
- 왜 'a'+1은 컴파일 에러가 발생하지 않을까? 그것은 'a'+1이 리터럴 간의 연산이기 떄문이다. 상수 또는 리터럴 간의 연산은 실행과정동안 변하는 값이 아니기 때문에, 컴파일 시에 컴파일러가 계산해서 그결과로 대체함으로써 코드를 보다 효율적으로 만든다.
그러나 c1+1과 같이 수식에 변수가 들어간 경우 컴파일러가 미리 계산을 할 수 없기 때문에 형변환을 해주는 것이다. - <중략>
- Math.round(): 매개변수로 받은 값을 소수점 첫째자리에서 반올림을 하고 그 결과를 정수로 돌려주는 메서드
3.2 나머지 연산자 %
- 나머지 연산자: 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환한다. 나누는 수로 0을 사용할 수 없다. 나머지 연산자는 주로 짝수, 홀수 또는 배수 검사 등에 주로 사용된다.
- 나머지 연산자느 나누는 수로 음수도 허용한다. 그러나 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다. 그러니까 피연산자의 부호를 모두 무시하고, 나머지 연산을 한 결과에 왼쪽 피연산자(나눠지는 수)의 부호를 붙이면 된다.
4. 비교 연산자
- 비교 연산자: 두 피연산자를 비교하는 데 사용되는 연산자. 주로 조건문, 반복문의 조건식에 사용되며 연산 결과는 오직 true와 false 둘 중 하나이다.
4.1 대소비교 연산자 > < >= <=
- 두 피연산자의 값의 크기를 비교하는 연산자이다. 참이면 true를, 거짓이면 false를 결과로 반환한다. 기본형 중에서는 boolean을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형에는 사용할 수 없다. 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후에 비교한다
- =,나
4.2 등가비교 연산자 == !=
- 값이 같은지 또는 다른지를 비교하는 연산자. 기본형과 참조형 모든 자료형에 사용할 수 있다.
- 기본형의 경우, 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의 주소값을 저장하기 때무에 두 개의 피연산자가 같은 객체를 가리키고 있는지 알 수 있다.
- 기본형과 참조형은 서로 형변환이 불가능하기 때문에 등가비교연산자로 기본형과 참조형을 비교할 수 있다.
※ >=, <=, != 등과 같이 두 개의 기호로 이루어진 연산자는 기호의 순서를 바꾸거나 중간에 공백이 들어가면 안 된다
- float형과 double형을 비교할 때는 double형을 float형으로 형변환을 하고 비교를 진행해야 한다.
문자열의 비교
- 두 문자열을 비교할 때는 '==' 대신 equals() 메서드를 사용한다. 비교 연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐이고, 문자여르이 내용이 같은지 비교할 때는 equals()를 쓰는 것이다.
- equals(): 비교하는 두 문자열이 같으면 true, 다르면 false를 반환한다
- equalsIgnoreCase(): 대소문자를 구별하지 않고 비교할 때 사용
5. 논리연산자
5.1 논리 연산자 - &&, ||, !
- &&은 AND에 해당하며 두 피연산자가 모두 true일 때만 true 결과를 얻는다. 즉, false가 하나라도 있으면 모두 false이다.
- ||는 OR에 해당하며 두 피연산자 중 어느 한쪽만 true이어도 true를 결과로 얻는다. 즉, 둘 다 false인 경우만 false를 반환한다
- 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용한다
x | y | x||y | x&&y |
true | true | true | true |
true | false | false | true |
false | true | false | true |
false | false | false | false |
※ charAt(int index): Scanner.nextLine()으로 받은 String 문자열에서 index번호에 해당하는 문자 하나를 추출.
char ch = ' ';
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
ch = input.charAt(0);
// 스캐너로 받은 사용자 input 문자열에서 첫번째(index==0)에 해당하는 문자 하나를 추출해
// ch에 대입. 즉, 어떤 문자열을 입력해도 첫번째 문자만 반환함
효율적인 연산(short circuit evaluation)
- 논리 연산자의 또 다른 특징은 효율적인 연산을 한다는 것이다.
- OR: 두 피연산자 중 한 쪽만 참이어도 전체 결과가 참이므로 좌측 피연산자가 참인 경우 우측 피연산자는 평가하지 않는다. 따라서 연산 결과가 참인 확률이 높은 피연산자를 좌측에 두면 더 빠른 연산결과를 얻을 수 있다.
- AND: 어느 한쪽만 거짓이어도 전체 연산결과가 거짓이므로 좌측 피연산자가 거짓이면 우측 피연산자는 평가하지 않는다.
논리 부정 연산자 !
- 피연산자가 true면 false를, false면 true를 반환한다.
어떤 값에 논리 부정 연산자를 반복적으로 적용하면, 참과 거짓이 차례대로 반복된다. 이 연산자의 이러한 성질을 이용하면, 한 번 누르면 켜지고, 다시 한 번 누르면 꺼지는 토글 버튼을 논리적으로 구현할 수 있다.
주로 조건문과 반복문의 조건식에 주로 사용된다.
5.2 비트 연산자 & | ^ ~ << >>
- 비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수로 표현했을 대 각 자리를 아래에 규칙에 따라 연산을 수행하며, 피연산자로 실수는 허용하지 않는다. 정수(문자 포함)만 허용된다.xyx | yx & yx ^ y
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 - |(OR 연산자): 피연산자 중 한 쪽의 값이 1이면 1을 결과로 얻는다. 그 외에는 0을 얻는다.
&(AND 연산자): 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^(XOR 연산자): 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다. - 비트OR연산자 '|'는 주로 특정 비트의 값을 변경할 때 사용한다. ex) 0xAB | 0xF = 0xAF
- 비트AND연산자 '&'는 주로 특정 비트의 값을 뽑아낼 때 사용한다. ex) 0xAB & 0xF = 0xB
- 비트XOR연산자 '^'는 두 피연산자의 비트가 다를 때만 1이 된다. 간단한 암호화에 사용된다
ex) 0xAB ^ 0xF = 0xA4, 0xA4 ^ 0xF = 0xAB
비트 전환 연산자 ~
- 이 연산자는 피연산자를 2진수로 표현했을 때, 0은 1로 1은 0으로 바꾼다. !와 유사하다.
비트 전환 연산자'~'에 의해 비트 전환 되고 나면, 부호 있는 타입의 피연산자는 부호가 반대로 변경된다. 즉 1의 보수를 얻을 수 있다. 그래서 비트 전환 연산자를 1의 보수 연산자라고도 한다 - 양의 정수 p가 있을 때, p에 대한 음의 정수를 얻으려면 '~p+1'을 계산하면 된다.
반대로 음의 정수 n이 있을 때, n에 대한 양의 정수를 얻으려면 '~(n-1)'을 계산하면 된다.
쉬프트 연산자 << >>
- 피연산자의 각 자리(2진수로 표현했을 때) 오른쪽(>>) 또는 왼쪽(<<)으로 이동(shift)한다고 해서 쉬프트 연산자로 이름이 붙었다.
- <<연산자의 경우 피연산자의 부호에 상관없이 각 자리를 왼ㅉ꼬으로 이동시키며 빈칸을 0으로만 채우면 되지만
- >>연산자는 오른쪽으로 이동시키기 때문에 부호있는 정수는 부호를 유지하기 위해 왼쪽 피연산자가 음수인 경우 빈자리를 1로 채운다. 물론 양수일 때는 0으로 채운다.
- 쉬프트 연산자는 다른 이항 연산자들과 달리 피연산자의 타입을 일치시킬 필요가 없기 때문에 산술변환이 적용되지 않는다.
- x << n은 x * 2^n의 결과와 같다.
x >> n은 x / 2^n의 결과와 같다. - x << n 또는 x >> n에서 n의 값이 자료형의 bit수보다 크면, 자료형의 bit수로 나눈 나머지만큼만 이동한다. 예를 들어 int형이 4byte(32bit)인 경우, 자리수를 32번 바꾸면 결국 제자리로 돌아이고 때문에 8>>32는 아무 일도 하지 않는다. 8>>34는 34를 32로 나눈 나머지인 2만큼만 이동하는 8>>2를 수행한다. 당연히 n은 정수만 가능하며 음수인 경우, 부호없는 정수로 자동 변환된다.
6. 그 외의 연산자
6.1 조건 연산자 ? :
- 조건 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항연산자이며, 삼항 연산자는 조건 연산자 하나 뿐이다.조건 연산자는 평가결과가 true이면 식1이, false이면 식2가 연산결과가 된다.
- 조건식 ? 식1(참) : 식2(거짓)
- 조건 연산자는 조건문인 if문으로 바꿔 쓸 수 있으며, if문 대신 조건 연ㅅ나자를 사용하면 보다 간단히 할 수있다.
- result = (x > y) ? x : y; // 위, 아래 코드는 같다. if (x > y) return = x; else return = y;
- 조건 산자의 식1과 식2 이 두 피연산자의 타입이 다른 경우 산술 변환이 발생한다.
6.2 대입연산자 = op=
- 대입 연산자는 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용된다.
오른쪽 피연산자의 값(식이라면 평가값)을 왼쪽 피연산자에 저장한다. 그리고 저장된 값을 연산결과로 반환한다. - 대입 연산자는 연산자들 중에서 가장 낮은 우선순위를 가지고 있기 때문에 식에서 제일 나중에 수행된다. 그리고 연산 진행 방향이 오른 쪽에서 왼쪽이기 때문에 x=y=3이라면 y=3이 먼저, 그리고 x=y가 수행된다
lvalue와 rvalue
- 대입 연산자의 왼쪽 피연산자를 lvalue(left value), 오른쪽 피연산자를 rvalue(right value)라고 한다. 대입 연산자의 rvalue는 변수뿐만 아니라 식이나 상수 등이 모두 가능한 반면, lvalue는 반드시 변수처럼 밗을 변경할 수 있는 것이어야 한다. 그래서 리터럴이나 상수같이 값을 저장할 수 없는 것들은 lvalue가 될 수 없다.
복합 대입 연산자
- 대입 연산자는 다른 연산자(op)와 결합하여 op=의 방식으로 사용될 수 있다.
op= == i += 3; i = i + 3; i -= 3; i = i - 3; i *= 3; i = i * 3; i /= 3; i = i / 3; i %= 3; i = i % 3; i <<= 3; i = i << 3; i >>= 3; i = i >> 3; i &= 3; i = i & 3; i ^= 3; i = i ^ 3; i = 3; i += 10 + j; i = i * (10 + j);
728x90
반응형