2021.08.13 - [Java] - [Java 기본 문법] 1. 변수와 타입
[Java 기본 문법] 1. 변수와 타입
변수 변수 : 프로그램이 작업을 처리하는 과정에서 필요에따라 데이터를 메모리에 저장하는데, 이 때 값을 저장할 수 있는 메모리 공간을 의미한다. 타입 : 변수에 어떤 종류의 데이터를 저장할
blog.robinjoon.space
프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산이라 한다. 연산에서 사용하는 기호를 연산자 라고 하고, 연산이 되는 데이터를 피연산자 라고 한다. 연산자와 피연산자를 이용해 연산을 표현한 것을 연산식이라 한다. 피연산자는 연산식이 될 수도 있다.
자바의 연산자는 C언어의 연산자와 거의 같다. 다만, C언어에서는 boolean 이라는 논리타입이 없기 때문에 비교연산자나 논리연산자의 결과가 정수였지만, 자바에는 이 결과가 boolean이라는 점이 다르다. 이 점만 주의하면, C언어 문법을 어느정도 숙지하고 있다면 굳이 자바에서 새로 연산자를 공부할 필요는 없다.
자바에 있는 연산자는 다음과 같다.
연산자 종류 | 연산자 | 피연산자 수 | 산출값 | 설명 |
산술 | +, -, *, /, % | 2 | 숫자 | 사칙연산과 나머지 연산 |
부호 | +, - | 1 | 숫자 | 음수와 양수의 부호 |
문자열 | + | 2 | 문자열 | 두 문자열 연결 |
대입 | =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= |
2 | 다양 | 우변의 값을 좌변에 대입 |
증감 | ++, -- | 1 | 숫자 | 1만큼 증가,감소 |
비교 | ==, >, <, <=, >=, !=, instanceof | 2 | boolean | 값의 비교 |
논리 | &&, ||, ! , ^ | 1, 2 | boolean | 논리적 NOT,AND,OR 연산 |
조건 | (조건식) ? A : B | 3 | 다양 | 조건에 따라 A, B중 선택 |
비트 | ~, &, |, ^, >>, <<, >>> | 1, 2 | 숫자 | 비트단위의 연산 |
이 중, 비트연산자와, 대입연산자중 비트연산과 관련된 설명은 생략한다. 앞의 포스팅에서 언급했지만, 이들은 거의 쓰지 않는다. 필요하면 필요할때 따로 찾아서 보자.
산술 연산자
흔히 하는 그 사칙연산과 나머지 연산을 수행한다. +는 합, -는 차, * 는 곱, / 는 몫, %는 나머지 를 구한다.
두 피연산자의 타입이 다를 경우 다음 규칙대로 타입을 일치시킨 후 연산을 수행한다.
- 피연산자가 모두 정수타입이고, int 보다 작은 타입일 경우 모두 int로 변환하여 수행한다. 따라서, 결과도 int다.
- 피연산자가 모두 정수 타입이고, long이 있을 경우 모두 long으로 변환하여 수행한다. 따라서, 결과도 long이다.
- 피연산자중 실수타입이 있을 경우, 모두 그 크기가 큰 실수타입으로 변환한 후 수행한다. 따라서 결과도 실수다.
즉, long을 제외한 모든 정수는 수행시 int로 변환되고 결과도 int며, 실수가 포함되어있다면 결과도 실수타입이다.
흔히 초보자들이 많이 하는 실수는 이런 형태다.
int a = 3, b = 2;
double c = a / b;
이런 코드의 경우 아마도, c 에 1.5가 저장되길 바랬을 것이다. 하지만, a, b 모두 int이므로 그 결과도 int라 a / b 는 1이다. 따라서, c = 1 이되고 자동 형변환에 의해 c 에는 1.0 이 저장된다. 만일, 1.5라는 결과를 바랬으면 코드를 이렇게 작성해야 한다.
int a = 3, b = 2;
double c = (double)a / b; // a / (double)b 도 가능
또한, 산술연산의 경우 특히, 연산의 결과가 실제 그 타입이 표현할 수 있는 범위를 넘지 않게 주의해야 한다. 말로하면 어려우니 코드를 보자.
int a = 1000000;
int b = 1000000;
int c = a * b;
이 코드는 제대로 동작하지 않는다. a, b모두 int이므로 연산의 결과도 int인데, 이 연산의 값은 int의 표현범위를 아득히 넘어버린다. 따라서, c 에는 이상한 값이 들어가있을 것이다. 이를 막고 제대로된 값을 c에 저장하려면 코드를 이렇게 고쳐야 한다.
int a = 1000000;
int b = 1000000;
long c = (long)a * b;
이렇게 하면 연산의 결과가 long이 되어 정상적으로 데이터를 저장할 수 있다.
또한, 정확한 값을 요구할 때에는, 실수타입을 사용하지 않는 것이 좋다. 저번 포스팅에서 생략한 실수타입의 내부 데이터 표현방식에 의해 정확한 수는 저장할 수 없기 때문이다. 가능하다면 정수형을 사용해야하고, 불가능할 경우 방법이 있지만, 지금 설명할 수 있는 내용이 아니니 링크만 남기겠다.
마지막으로 /, % 연산자를 사용할때 주의사항이 있다. 바로 0으로 나누는 경우다. 수학에서 0으로 나눈다는 것은 정의되지 않으므로, 예외가 발생하거나, 좌측 피연산자가 0.0 일 경우 NaN, Infinity 라는 결과를 반환한다. 이들은 다른 데이터와 연산할 시 무조건 NaN, Infinity 가 발생하므로 반드시 추가 로직을 통해 나누기 전에 나누는 수가 0인지 검증해야 한다.
부호연산자
부호연산자에는 +, - 가 있다. 이들은 이항연산자로 사용될 경우 산술연산자이지만, 단항 연산자로 사용되면 부호연산자가 된다. 당연히, 부호라는 것은 숫자에만 있는것이므로, 정수, 실수형에만 사용할 수 있다. + 연산자는 수의 부호를 그대로 하는 연산자고, - 는 부호를 반대로 하는 연산자이다. 단, 피연산자가 int보다 작은 경우 결과값은 int로 반환된다.
int x = -100;
int y = +x; // y에는 -100이 저장된다
int z = -x ; //z에는 100이 저장된다.
short a = 1;
short b = -a; // 컴파일에러가 난다. 강제 타입 변환을 해야한다.
double c = 1.123;
double d = -c; // -1.123이 저장된다.
문자열 연결 연산자
문자열 연결 연산자인 +는 좌측 문자열에 우측문자열을 이어붙인 문자열을 결과로 낸다. 만일 둘 중 하나만 문자열일경우, 다른 한쪽을 문자열로 변환해 이어붙인다. 문자열과 숫자를 이 연산자로 연산할 때는 연산 순서에 주의해야한다.
String str = "abc" + 1; // "abc1"
String str2 = 1 + "abc" ; // "1abc"
String str3 = "abc" + "abc"; // "abcabc"
대입연산자
우측 피연산자를 죄측피연산자에 대입한다. 단순 대입연산자인 '=' 는 우측 피연산자를 죄측 피연산자에 대입만 하며, 복합대입연산자인 -=, += 등은 = 앞의 연산을 좌 우 피연산자를 이용해 수행하고 그 결과를 좣ㄱ 피연산자에 대입한다.
int a = 1;
int b = 3;
b += a; // b = b + a 와 같다.
증감연산자
++, -- 가 있다. 각각 피연산자를 1씩 증가시키고, 감소시킨다. 이 때, 연산자를 피연산자의 앞에다 쓰느냐, 뒤에다 쓰느냐가 다르다.
int a = 1;
System.out.println(a++); // 1 출력
System.out.println(a); // 2 출력
System.out.println(++a); // 3 출력
System.out.println(a); // 3 출력
연산자가 앞에 붙으면 연산의 결과도 1식 변해있고, 연산 후 변수의 값도 변해있다. 그러나, 연산자가 뒤에 붙으면 연산의 결과는 변하지 않고, 연산 후에 변수의 값이 변해있다.
비교연산자
==, !=, >, <, >=, <= 가 있다. 순서대로 "같다", "다르다," "왼쪽이 더 크다", "오른쪽이 더 크다", "왼쪽이 오른쪽보다 크거나 같다", "오른쪽이 왼쪽보다 크거나 같다" 를 의미한다. 이게 맞으면 true를, 틀리면 false를 결과로 낸다.
int a = 2, b =3;
boolean ans;
ans = a == b; // false
ans = a != b; // true
ans = a > b; // false
ans = a < b; // true
ans = a <= b; // true
ans = a >= b; // false
논리 연산자
논리 연산자는 &&, ||, !, ^ 이 있다. 피연산자의 AND, OR, NOT, XOR 연산을 수행한다. 피연산자는 boolean만 가능하다. 물론, 연산의 결과가 boolean인 연산식도 피연산자가 될 수 있다. 연산 결과는 이렇다.
- && : 두 피연산자 모두 true면 결과도 true, 아니면 false
- || : 두 피연산자중 하나만 true면 결과도 true, 아니면 false
- ! : 피연산자가 true면 결과는 false, 아니면 true
- ^ : 두 피연산자가 서로 다르면 true, 아니면 false
조건 연산자
유일한 삼항 연산자 이다. (조건식) ? A : B 와 같이 쓴다. 조건식이 true냐 false냐에 따라 A, B중 하나를 결과로 한다.
int a = 1;
int b = 2;
int max = a >b ? a : b;
연산의 순서와 방향
수학에서, 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높은 것 처럼, 자바의 연산자들에게도 각자 우선순서가 있고, 연산의 방향도 정해져있다. 하지만, 다행이도 이를 외울 필요는 전혀 없다. 수학에서도 먼저 계산하고싶은 것들을 '( )' 로 묶는 것처럼, 자바에서도 먼저 수행하고 싶은 연산을 '( )'로 묶으면 된다.
int a = 1;
int b = 4;
int c = 10;
int result = a + b * c; // 41
int result2 = (a + b) * c; // 50
다음글
'Java > 기초문법' 카테고리의 다른 글
[Java 기본 문법] 4. 참조타입 (0) | 2021.08.14 |
---|---|
[Java 기본 문법] 3. 제어문 (0) | 2021.08.13 |
[Java 기본 문법] 1. 변수와 타입 (0) | 2021.08.13 |
제네릭(Generic) (0) | 2021.04.27 |
중첩클래스 2 (0) | 2021.03.09 |