본문 바로가기
IT 돌고래/JAVA

[JAVA]자바의 다섯걸음 : 연산자와 형변환

by IT돌고래 2020. 1. 20.
반응형

안녕하세요.

IT 돌고래입니다.

자바의 연산자와 형 변환에 대해서 이야기를 하겠습니다.

 

연산자란?

연산을 나타내는 기호입니다.

연산자를 통해 연산을 하면 데이터에 변화가 일어나게 됩니다.

예를 들어 5 + 3을 하면 연산자는 +가 되고 피연산자는 5와 3이 됩니다. 그래서 연산한 결과 값이 8이 나오게 됩니다.

이런 연산을 하기 위해서 컴퓨터가 만들었기 때문에 어떤 프로그램을 개발을 하더라도 연산은 필수적으로 들어갑니다.

 

1. 산술 연산자

산술 연산자는 초등학교에서 배우는 산수와 같은 +, -, *(곱하기), /가 있고 추가로 프로그래밍 언어에서만 사용하는 산술 연산자가 있는데 그것은 %, ++, -- 연산자입니다. 이 세 연산자는 이미 알고 있는 +, -, *, /와 같이 많이 쓰이게 됩니다.

사칙 연산자를 빼고 나머지 3개를 설명을 드리겠습니다.

% 나머지 연산자 (나누기 연산을 하고 남는 값을 주는 연산자입니다)
++ 원래 값에 1씩 더하는 연산자 입니다.  
-- 원래 값에 1씩 빼는 연산자 입니다.

++, -- 전위 후위 있습니다. 변수에 어디 위치를 하느냐에 따라 값은 전혀 다르게 됩니다.

int a = 5;
++a; // a의 값은 6(값이 바로 변경 +1)
a++; // a의 값은 6(다음 명령어가 오기전까지는 값을 그대로 유지 그이후에 변경)
//-> 이라인에서 a의 값은 7

int b = 4;
--b; // b의 값은 3(값이 바로 변경 -1)
b--; // b의 값은 3(다음 명령어가 오기전까지는 값을 그대로 유지 그이후에 변경)
//-> 이라인에서 b의 값은 2

2. 관계 연산자

관계 연사자는 산술 연산자와 같이 초등학교 산수에 나오는 <, >, <=, >=은 이해가 할 수 있습니다.

작다, 크다, 작거나 같다, 크거나 같다 같이 수를 비교할 수 있고 같다, 다르다의 연산자는 따로 프로그래밍 언어에서 만들었습니다. 

※ 같다는 수학 시간에 배운 =이 아닙니다.

int a = 10;

위에 소스처럼 a라는 변수에 10을 대입을 시킵니다.  =은 대입을 시켜주는 연산자로 사용을 하기 때문에 프로그래밍 언어에서는 ==는 같다로 사용을 하고!=은 같지 않다로 사용을 합니다.

! 는 부정에 의미를 담고 있다고 생각을 하시면 될 것 같습니다. 마지막으로 instance of는 객체를 비교하기 위한 관계 연산자로 사용하고 있습니다.

 

3. 논리 연산자

논리 연산자는 2개의 관계 연산자를 논리적으로 묶어서 사용할 때 사용합니다. 

예를 들어

int a = 10;
int b = 20;
int c = 30;
int d = 40;

//a<b || c>d (OR)   -> true
//a<b && c>d (AND)  -> false
//!(a<b || c>d)   -> false

 

예를 들어 위에 소스처럼 a, b, c, d 변수를 만들고 조건을 2개 이상 연결해서 사용하는 것을 맨 마지막 2줄에서 표시하고 있습니다. 조건을 2개 이상을 사용하게 되는데 조건 1 || 조건 2, 조건 1 && 조건 2처럼 사용을 했습니다.

조건과 조건에 ||, &&을 넣어서 조건을 연결해서 원하는 논리를 만들면 된다. 

||(OR), &&(AND)인데 OR은 한조건만 true이면 전체 조건이 true가 됩니다. AND 같은 경우에는 둘 다 true여야지 전체 조건이 true가 됩니다.

그리고 마지막으로 조건 앞에! 를 붙이면 10 <5 이런 조건에!(10 <5)으로! 가 붙으면 조건의 결과가 반대로 나오게 됩니다. 10 <5이면 논리가 false이지만! 가 붙어서 true로 나타나게 됩니다.

 

※OR, AND는 2개 이상 조건에 붙이기 때문에 붙이고 싶은데로 붙여서 사용하면 됩니다. 하지만 너무 많이 조건을 붙여서 사용하게 되면 논리 해석에 어려움을 겪을 수 있습니다.

 

4. 비트 논리 연산자

컴퓨터가 0과 1로 이루어져 있기 때문에 데이터와 데이터의 비트 값을 연산해주는 연산자입니다.

비트 논리 연산자는 &, |, ^, ~가 있습니다.

3 0 0 1 1
4 0 1 0 0
& 0 0 0 0

결과 값은 0이 됩니다.

3 0 0 1 1
4 0 1 0 0
| 0 1 1 1

결과 값은 7이 됩니다.

5 0 1 0 1
7 0 1 1 1
^ 0 0 1 0

결과 값은 2가 됩니다. (0과 1이 달라야 1이 되고 0과 1이 같으면 0이 됩니다.)

 

~5를 하면 101에 보수가 취해져서 보수만 됐기 때문에 -6이 됩니다. 왜 -5가 아니냐면 컴퓨터는 2의 보수를 취하지만 1을 더하지 않은 1의 보수로 값을 주기 때문에 값이 -6이 됩니다. +1을 해줘야 정확히 -5가 됩니다.

 

5. 비트 시프트 연산자

비트 시프트 연산자는 비트의 값을 왼쪽이나 오른쪽으로 원하는 숫자만큼 이동을 하게 됩니다.

그래서 기호는 >>, <<, >>>가 있습니다. 

 

예를 들어 5>>2를 하면 0101 오른쪽으로 2개를 밀어내면 0010이 되어 값이 2가 됩니다. 반대로 5<<2를 하면 0101 왼쪽으로 0이 2개가 들어와서 010100이 되어 값이 20이 됩니다. 

 

※ >>, <<은 음수이면 1로 양수이면 0으로 쉬프트 값을 채워줍니다. 하지만 >>>은 무조건 0으로 값을 채워줍니다.

 

6. 단축 연산자

 

단축 연산자는 연산자를 단축해서 사용하게 됩니다.

예를 들면 a+=b라고 하면 a = a+ b가 됩니다. 이렇게 a와 b를 더한 후에 다시 a에 값을 저장하게 됩니다.

단축 연산자는 +=, -=, *=, /=, %=(산술 연산자인 단축 연산자)와 &=, |=, ^=, <<=, >>=,  >>>=(비트 논리, 비트 시프트 연산자인 단축 연산자)로 단축 연산자를 표현을 할 수 있습니다.

 

7. 삼항 연산자

 

삼항 연산자는 조건문처럼 사용하게 됩니다. 조건문에 대해서는 차후에 다시 자세히 설명을 드리도록 하겠습니다. 

자, 삼항 연산자를 보면 조건? 참 : 거짓과 같은 형태로 표현이 됩니다. 

예를 들어

int a = 10;
a = a == 10 ? 1 : 0 ; // a가 10이면 값 1을 a에 대입하고 아니면 0을 a에 대입

위에 소스처럼 조건식이 이면 :의 에 값을 반환하고 거짓이면 :의 에 값을 반환을 하게 됩니다.

 

※ 연산자 우선순위

우선순위 연산자 이름
1 [], (), . 인덱스연산자, 괄호, 클래스 맴버 접근연산자
2 ++, --, +, -, !, ~ 증가연산자, 감소 연산자, 단항 +연산자, 단항 -연산자, NOT 연산자, 비트 보수 연산자
3 new, () new 연산자, 캐스트 연산자
4 *, /, % 곱셈 연산자, 나눗셈 연산자, 나머지 연산자
5 +, -  + 연산자, - 연산자
6 >>, <<, >>> 시프트 연산자
7 <, >, <=, >=, instance of 관계연산자, instance of연산자
8 ==, != 등가 연산자
9 &, ^, | 비트 논리 연산자
10 &&, ||,  논리 연산자
11 ?:, =, +=, -=... 삼항 연산자, 배정 연산자, 단축 연산자

 

형 변환이란?

 

연산을 수행할 때 두 피연산자가 다른 형일 경우 자동형 변환이 되고 또는 개발자가 강제로 자료형을 변경해서 사용을 할 경우 강제형 변환을 하게 됩니다.

 

1. 자동형 변환

자바에서는 기본형으로 정수는 int형으로 실수는 double형으로 취급이 됩니다.

 

자동형 변환 순서

byte >> short/char >> int >> long >> float >> double

위에 변환 순서를 보면 자료형 크기로 자동 형 변환이 되고 정수에서 실수로 형 변환을 하는 것을 알 수가 있습니다.

 

int a = 7/2; // int로 값을 저장하기 때문에 3.5가 아니라 3으로 a에 저장된다.
double avg 9/2.0; // int형과 double로 나누면 int형이 자동으로 double로 형이 변환되어 9.0/2.0이 되어 avg에 4.5가 저장된다.

 

위에 소스처럼 자동형 변환이 되어서 연산되어 값이 변수에 저장되는 것을 알 수가 있습니다.

 

2. 강제형 변환

강제형 변환은 프로그래머가 직접 형 변환을 하는 것입니다.

강제형 변환에는 확대형 변환축소형 변환이 있는데 확대형 변환은 더 큰 자료형으로 저장되어 손실이 발생하지 않지만 축소형 변환은 작은 자료형으로 저장되어 손실이 발생을 하게 됩니다.

byte b = 120;
int i = 0;
b = (byte)259; // byte 범위를 넘는 값을 byte 변수에 대입을 하면 값 손실이 발생 하여 b에는 3이 저장된다.
i = (int) 259.428;// 실수인 259.428을 정수인 int에 대입을 하면 소숫점에 손실이 발생하여 i에는 259가 저장된다.

 

위에 소스는 축소형 변환이라서 값의 손실이 발생합니다.

 

※ 위에 자동형 변환이나 강제형 변환은 안 되도록 개발하는 것이 좋습니다. 부득이한 경우가 아니면 형 변환을 사용을 하지 말아야 합니다. 알게 모르게 프로그램에 문제가 발생하는 경우가 많기 때문입니다.

 

※ 긴 글을 읽어 주셔서 감사합니다. Java를 계속 진행해 나가겠습니다.

 

★ 이글 이후에는 Java 입출력 함수에 대한 내용을 정리해서 처음부터 정리를 할 예정입니다. 많은 관심 부탁드립니다.

반응형

댓글