1. 연산의 종류
2. 대입연산
2. 산술연산
3. 증감연산
1. 연산의 종류
연산이란 데이터를 처리하고 결과를 산출하는 작업을 의미합니다. 연산은 연산의 대상이 되는 피연산자와 연산기호를 뜻하는 연산자로 이루어지는데요. 피연산자는 데이터의 값(리터럴 값 또는 변수)이며, 연산자와 함께 나열된 식을 연산식이라고 합니다. 연산은 프로그래밍 작성에 가장 기초가 되는 부분이므로, 많은 연습을 통해 몸에 익힐 수 있도록 반복해서 연습하시면 됩니다.
또한 앞에서 배운 변수와 자료형에 대한 개념에 대해 반드시 숙지해야만 연산을 학습할 수 있습니다. 변수와 자료형에 대해 아직 부족한 부분이 있더라도, 자연스럽게 앞의 내용을 복습하는 시간이 될것입니다.
연산의 종류는 총 8가지로 분류할 수 있습니다.
연산 종류 | 연산자 | 설명 |
대입 연산 | =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= | 오른쪽항의 값을 왼쪽항에 대입 |
산술 연산 | +, -, *, /, % | 사칙연산 + 나머연산 |
증감 연산 | ++, -- | 1증가, 1감소 |
비교 연산 | ==, !=, >, >=, <, <= | 값 비교 (boolean 결과) |
논리 연산 | &&, ||, !, &, | | 값 비교 (boolean 결과) |
비트 연산 | &, |, ~, ^, <<, >>, >>> | 비트연산 |
삼항 연산 | 조건식 ? 참일때 : 거짓일때 | 조건식의 결과에 따라 참/거짓 |
문자열 연산 | + | 문자열 연결 |
표에서 보듯이 종류만 8가지에 각 연산마다 연산자도 많고 한꺼번에 이해하고 암기하기는 쉽지 않을 것입니다. 우선 사용빈도가 높은 빨간색 연산자만 먼저 외워두겠습니다.. 그리고 이 표를 먼저 정리한 이유는 전체 구조를 파악한 후 세세한 부분을 배워나가기 위함입니다. 각 연산에 대한 자세한 부분들은 예제와 함께 따라하면 자연스럽게 외워지니 너무 걱정말고 자신있게 시작하세요.
2. 대입연산
단어 그대로 대입하는 연산입니다. 우리는 앞에서 변수를 선언하고, 초기화하는 과정을 배웠습니다. 바로 초기화 하는 과정이 대입입니다.
int a = 10;
위 코드는 정수(int)타입의 a라는 변수에 10을 초기화 하는 코드입니다. 즉 변수 a에 10을 대입한 것이죠. 이 “대입한다”라는 말은 “담는다”라는 말과 같은 의미로 생각하면 됩니다. = 기호를 기준으로 왼쪽 항에는 변수가 오른쪽항에는 변수, 리터럴값, 수식이 올 수 있습다.
10 = a; // 에러 1
a + 1 = 10; // 에러 2
10 = 1; // 에러 3
a = a + 10; // 정상
위 예제에서 에러1부분은 왼쪽항이 리터럴값, 오른쪽항이 변수로 되어 있습니다. 에러2는 왼쪽항에 수식이 들어가 있으므로 에러가 나고, 에러3은 리터럴값에 리터럴값을 대입하려고 하므로 에러가 나는 것입니다. 가장 마지막 라인의 코드처럼 =을 기준으로 왼쪽항이 a라는 변수, 오른쪽항이 a+10 (a 변수에 초기값 10이 담겨있었으므로 결과값은 10+10, 20)이 정상적인 코드가 됩니다. 이제 a변수에는 20이라는 값이 대입이 되는 것입다.
이렇게 글로 쓰니까 처음 배우시는 분들은 어렵게 느껴지시는 분들도 있을텐데요. 그 이유는 말 그대로 처음이라서, 그리고 글로 써놓으니까 어렵게 느껴지시는 것입니다. 시간이 지나고 익숙해 지시면 그냥 당연한 것들입니다.
대입은 = 기준으로 오른쪽 값을 왼쪽의 변수에 대입한다
이제 = 외에 다양한 대입연산자를 알아보겠습니다.
public class OperationSample1 {
public static void main(String[] args) {
int number1 = 10;
System.out.println("number1 = 10 -> "+number1); // 10출력
number1 += 10; // 더하고 대입
System.out.println("number1 += 10 -> "+number1); // 20 출력
number1 -= 10; // 빼고 대입
System.out.println("number1 -= 10 -> "+number1); // 10 출력
number1 *= 2; // 곱하고 대입
System.out.println("number1 *= 2 -> "+number1); // 20 출력
number1 /= 2; // 나누고 대입
System.out.println("number1 /= 2 -> "+number1); // 10 출력
number1 %= 3 ; // 나머지 대입
System.out.println("number1 %= 3 -> "+number1); // 1 출력
}
}
실행결과
number1 = 10 -> 10
number1 += 10 -> 20
number1 -= 10 -> 10
number1 *= 2 -> 20
number1 /= 2 -> 10
number1 %= 3 -> 1
예제에서 number1변수에 10으로 초기화한 후 +=, -=, *=, /=, %= 연산자를 이용해 다양한 대입연산 처리 결과를 출력했습니다. 출력 결과를 확인해보면 알 수 있듯이 각 대입연산자들은 모두 산술연산 후 대입된 것을 알 수 있는데요, 즉 += 은 왼쪽 변수에 오른쪽 값을 더하고 나서 대입한 것이고, -=은 빼고 나서 대입한 것입니다.
정리하면 =은 대입한다라는 연산기호인데, (산술연산기호)= 에 따라 먼저 산술연산 처리 후 대입이 이루어지게 됩니다. 그리고 대입은 오른쪽 수식이나 변수, 또는 리터럴 값이 왼쪽 변수에 대입됩니다.
3. 산술연산
산술연산은 우리가 이미 알고 있는 사칙연산(더하기, 빼기, 곱하기, 나누기)에 나머지 연산이 추가된 연산입니다. 기본자료형 중 논리자료형(boolean)을 제외한 모든 기본 자료형의 연산이 가능하며, 주의할 점은 연산의 결과가 대입되는 변수에 자료형의 범위가 초과되는 경우 에러가 발생하니 주의해야 합니다. 산술 연산은 연산되는 데이터(값)의 자료형 중에서 더 큰 자료형으로 자동 형변환을 해서 수행하며 결과도 더 큰 자료형으로 리턴되고, int 보다 작은 자료형의 산술연산은 int로 자동형변환해서 수행하게 됩니다.
나머지 연산을 제외한 다른 연산들은 이미 익숙한 연산이니 예제를 통해 바로 확인해보겠습니다.
public class OperationSample2 {
public static void main(String[] args) {
int a = 5 + 5;
System.out.println("5 + 5 = "+a); // 10출력
int b = a - 5;
System.out.println("10 - 5 = "+b); // 5출력
int c = b * 2;
System.out.println("5 * 2 = "+c); // 10출력
int d = c / 5;
System.out.println("10 / 5 = "+d); // 2출력
// 나머지 연산
int e = 10 % 3; // 10 나누기 3의 결과값은 몫이 3, 나머지 1
System.out.println("10 % 3 = "+e);
}
}
실행결과
5 + 5 = 10
10 - 5 = 5
5 * 2 = 10
10 / 5 = 2
10 % 3 = 1
위 예제에서 사칙연산(+, -, *, /)은 연산자, 연산식 모두 여러분한테 익숙한 연산이니, 오른쪽 항은 변수나, 값이 오고, 왼쪽 항은 변수가 올 수 있고, 오른쪽 연산이 끝나고 마지막에 대입연산이 이루어 지는 것만 기억하세요.
마지막에 나머지 연산이 있습니다. 10에서 3으로 나눈 나머지를 정수 타입의 변수 e에 대입한 것입니다. 10에서 3을 나누면 몫은 3 나머지는 1이므로 변수 e에는 정수 1이 대입됩니다. 그럼 이 몫만 구할 수 있는 방법은 없을까? 위에서 봤던 사칙연산 중 나머지 연산이 바로 몫을 구하는 연산입니다. 즉, 나누기의 몫을 구하는 연산자는 /, 나머지를 구하는 연산자는 % 입니다.
그럼 다음 연산식의 결과값은 무엇일까?
10 / 4 = ?
10에서 4로 나눈 값은 소수점까지 계산해보면 2.5가 나옵니다. 그러나 자바에서는 결과값이 2가 나옵니다. 실제 자바 코드를 실행해보면
int f = 10;
int g = 4;
System.out.println("10 / 4 = "+f / g); // 결과값 2
위 예제의 소스를 보면 2.5가 나올것으로 예상할 수 있지만 실행 결과는 2로 출력됩니다.
“자바에서는 정수와 정수의 연산 결과는 항상 정수” 이것을 꼭 기억하세요.
그럼 반대로 2가 아니라 2.5가 출력되도록 하려면 어떻게 해야 할까요? f, g 이 두 변수 중 하나 이상이 실수 타입인 경우 결과값도 실수가 되게 됩니다.
double f = 10;
int g = 4;
System.out.println("10 / 4 = "+f / g); // 결과값 2.5
위 코드와의 차이점은 변수 f의 타입이 double인것만 다른데 결과값이 아예 다르게 나옵니다. 이 예제를 응용해 정수간의 연산시에도 실수형태의 값이 나오게 하려면 강제형변환을 적용할 수 있다는 것을 알 수 있습니다. 아래 예제로 강제형변환하는 경우를 살펴볼까요.
int f = 10;
int g = 4;
System.out.println("10 / 4 = "+(double)f / g);
위 예제는 변수 f와 g가 모두 정수인데, 나누기 연산을 하면 정수끼리의 연산으로 결과값이 2.5 실수가 나오게 하기 위해 변수 f를 double로 강제 형변환을 한 후 나누기 연산을 한 것입니다. 역시 실수와 정수의 연산이므로 실수 결과값이 나오게 됩니다.
추가로 부호연산이 있는데 부호연산은 항이 하나인 경우 이 항 앞에 +나 -의 부호를 지정하는 연산자입니다. 특별히 새롭거나 어려운 연산은 아니어서 연산자 종류에도 따로 빼지 않았습니다. 조심해야될 부분은 +연산자가 있더라도 무조건 양수로 바뀌는 것은 아니니 이것만 기억하시면 충분할것 같습니다.
public class OperationSample2_1 {
public static void main(String[] args) {
int a = 5;
System.out.println("+a = " + +a);
System.out.println("-a = " + -a);
a = -5;
System.out.println("+a = " + +a);
System.out.println("-a = " + -a);
}
}
실행결과
+a = 5
-a = -5
+a = -5
-a = 5
4. 증감연산
증감연산은 단어 그대로 증가, 감소시키는 연산입니다. 증감연산자의 종류는 ++와 --가 있는데, 변수의 값을 1증가 시키거나 1감소시키는 연산이죠. 그리고 증감연산은 변수에만 사용할 수 있습니다. 증감연산은 두가지 종류가 있는데, 연산자가 변수 앞에 있으면 전위연산, 뒤에 있으면 후위연산이 됩니다.
전위연산 : ++변수명, 먼저 변수에 1증가 시킨 후 다른 연산을 실행.
후위연산 : 변수명++, 다른 연산 실행 후 변수에 1증가
public class OperationSample3 {
public static void main(String[] args) {
int a = 10;
int b = 10;
++a; // 전위연산
b++; // 후위연산
System.out.println(a);
System.out.println(b);
}
}
이 예제의 실행 결과는 11로 같은 결과를 나타냅니다. 전위연산, 후위연산 모두 단독으로 사용됐을 경우는 차이가 없는 것을 알수 있죠. 하지만 다른 연산자와 함께 사용되는 경우 결과의 차이가 있습니다. 예제를 통해 확인해보겠습니다.
int a = 10;
int b = ++a;
System.out.println("전위연산 결과 : "+b);
int x = 10;
int y = x++;
System.out.println("후위연산 결과 : "+y);
System.out.println("x : "+x);
실행 결과
전위연산 결과 : 11
후위연산 결과 : 10
x : 11
변수 a는 전위연산을 변수 y는 후위연산한 결과를 대입한 변수입니다. 각각 출력한 결과를 확인해보면 변수 y의 결과가 10으로 출력된 것을 알 수 있는데요. 변수 x는 후위연산이 적용되었는데, 대입연산보다 나중에 실행되어, 변수 y에 10이 대입되고나서 x에 1이 증가된 것입니다. 그래서 y의 출력 결과는 10, x의 출력 결과는 11이 되는 것입니다.
증감연산은 연산자가 앞에 있는지 뒤에 있는지에 따라 연산 순서가 달라지는 것을 알 수 있는데요. 전위연산과 후위연산을 혼용해서 사용하게 되면 코드해석 시 어려움을 느끼게 되므로, 헷갈리면 후위연산만 써도 코드 작성에 아무런 문제는 없습니다. 실무에서도 사용빈도가 후위연산이 훨씬 높으니 후위연산은 반드시 기억하도록 하시고. 아래 예제를 보면서 증감연산 결과를 비교해보겠습니다.
int a = 10;
a++;
System.out.println("a++ : " + a);
int b = 10;
b += 1;
System.out.println("b += 1 : " + b);
int c = 10;
c = c + 1;
System.out.println("c = c + 1 : " + c);
실행결과
a++ : 11
b += 1 : 11
c = c + 1 : 11
a++ 은 a 변수에 1을 증가하는 연산이므로 11이 출력되고, b += 1도 b변수의 10에 1을 더하고 대입했기 때문에 11이 출력됐습니다. 변수 c 역시 c + 1은 10 + 1 이므로 11이 출력됩니다. 이 세가지 코드 방식은 다르지만 모두 11이 출력되는 같은 결과를 보이고 있는 것을 알수 있습니다.