본문 바로가기

JAVA/Front-end 교육과정 정리

[2일차] 2020.12.08 예습

2.3 타입 변환

타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것이다. 

ex) byte -> int / int -> byte

이러한 타입 변환에는 2가지의 종류가 있다. 자동(묵시적) 타입변환, 강제(명시적) 타입 변환

 

2.3.1 자동 타입 변환 (Promotion)

자동 타입 변환은 프로그램 실행 도중 자동으로 타입 변환이 일어나는 것을 말한다. 이는 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 일어난다. 타입은 메모리의 크기에 따라서 상대적으로 비교가 가능하다. 즉 작은 크기의 타입은 큰 크기의 타입보다 메모리가 작은 경우를 일컫는다. 그렇다면, 자료형들의 크기는 어떤 순서일까? 

 

출처: 이것이 자바다

위의 이미지처럼 byte형 자료형을 대입한 값을 int형 자료형에 대입할 경우 일어나는 것이 자동 타입 변환이다. 

예시와 함꼐 자동 타입 변환에 대해 설명하겠다. 

 

byte byteValue = 10;
int intValue = byteValue; // 자동 타입 변환이 일어난다.

출처: 이것이 자바다

 

2.3.2 강제 타입 변환 (Casting)

그렇다면, 큰 크기의 타입이 작은 타입으로 변환하는 것은 무엇이라할까? 결론부터 말하면 그럴 수는 없다. 대신 큰 타입을 강제로 작은 데이터 타입으로 쪼개서 저장하는 것이 가능하다. 이를 강제 타입 변환이라 부른다. 하지만, 이 방식은 데이터의 손실이 발생할 위험이 있다. 

 

예를 들면, int형의 자료형을 byte형으로 바꿀 때, int형의 4바이트 메모리중 가장 마지막 1 바이트만 변환이 되는데 이떄 앞의 3 바이트의 메모리를 잃게 되는거다. 

 

2.3.3 연산식에서의 자동 타입 변환

연산은 기본적으로 같은 타입의 피연산자간에만 수행되기 때문에, 서로 다른 타입 간의 연산이 일어날 경우 큰 타입으로 자동 변환(Promotion)된 후 연산이 수행된다. 예를 들어 int형 자료와 double형 자료를 더하면, int형 자료가 double형 자료로 변환이 된 후 수행이 된다. 

 

03 연산자

3.1 연산자(Operator)와 연산식

프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(operation)이라 일컫는다. 연산에 사용되는 표기나 기호를 연산자 (Operator)라고 하며, 연산이 되는 데이터는 피연산자 (Operand)라고 부른다. 연산자와 피연산자를 이용하여 연산자의 과정을 기술하는 것을 연산식 (expressions)라고 한다. 

다음 예의 경의 +.-.*, == 은 연산자이고 x,y,z는 피연산자이다. 

x + y
x - y
x * y + z
x == y

 

연산자는 필요로 하는 피연산자의 수에 따라 단한, 이항, 삼항 연산자로 구분이 된다.

단항 연산자 : 부호 연산자, 

ex) ==x;

 

이항 연산자: 그 외 두 개의 피연산자 요구하는 경우

ex) x + y;

 

삼항 연산자: 조건 연산자 (조건식, A, B)

ex) (sum>90) ? "A" : "B"

 

3.2 연산의 방향과 우선순위

연산은 항상 왼쪽에서 오른쪽으로 진행이 되나, 우선순위에 따라 변화하는 경우가 존재한다. 다음은 연산자의 우선순위를 정리한 표이다. 

 

출처: 생활코딩

 

만약 이러한 우선순위가 헷갈린다면, 괄호를 적극 이용하자. 왜냐하면 괄호는 항상 먼저 연산하기 때문이다. 

 

3.3 단항 연산자

단항 연산자는 피연산자가 단 하나뿐인 연산자를 말한다. 여기에는 부호 연산자 (+.-) 증감연산자 (++. --), 논리 부정연산자 (!), 비트 반전연산자 (~)가 있다. 

 

3.3.1 부호 연산자 (+,-)

boolean과 char 타입을 제외한 나머지 기본 타입에 사용할 수 있다. 

 

연산식 설명
+ 피연산자 피연산자와의 부호 유지
- 피연산자 피연산자와의 부호 유지

출처: 이것이 자바다

+,-는 산술 연산자이자 부호 연산자이기도 하다. 이를 사용할 때 주의점은 산출 타입이 int 타입으로 된다는 것이다. short 형 타입 값을 부호 연산하면 int 타입으로 변환이 된다. 

 

short s = 100;

short result = -s ; // 컴파일 에러

 

이는 다음과 같이 변경하면 된다. 

 

short s = 100;

int result3 = -s;

 

3.3.2 증감 연산자(++,--)

증감 연산자는 변수의 값을 1 증가 (++) 시키거나 1 감소 (--) 시키는 연산자를 의미한다. boolean 타입을 제외한 모든 기본 타입의 연산자가 사용 할 수 있다. 

연산식 설명
++ 피연산자 다른 연산을 수행하기 전에 피연산자의 값 1 증가
-- 피연산자 다른 연산을 수행하기 전에 피연산자의 값 1 감소
피연산자 ++ 다른 연산을 수행한 후에  피연산자의 값 1 증가
피연산자 -- 다른 연산을 수행한 후에  피연산자의 값 1 감소

 

3.3.3 논리 부정 연산자 (!) 

논리 부정 연산자는 true를 false로,  false를 true로 변경하기 때문에 boolean 타입에만 사용할 수 있다. 

연산식 설명
! 피연산자 피연산자가 true면 false 값 산출
피연산자가 false면 true 값 산출

 

3.3.4 비트 반전 연산자 (~)

비트 반전 연산자는 정수타입 (byte, short, int, long)의 피연산자에만 사용되며, 피연산자를 2진수로 표현했을 떄 비트값인 0을 1로, 1은 0으로 반전한다. 연산 후 부호 비트인 최상위 비트를 포함해서 모든 비트가 반전되기 떄문에 부호가 반대인 새로운 값이 산출된다. 

비트 반전 연산자는 산출 타입이 int형이 되기 때문에 연산이 수행되기 전 int형으로 타입 변환 후 비트 반전이 된다. 

 

3.4 이항 연산자

이항 연산자는 피연산자가 두 개인 연산자를 말하며 여기는 산술 연산자 (+, -, *, /, %), 문자열 연결 연산자 (+), 대입 연산자 (=,+=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=), 비교 연산자 (<, <=, >=, ==, !=), 논리 연산자 (&&, ||, &, |, ^, !), 비트 논리 연산자 (&, |, ^), 비트 이동 연산자 (<<, >>, >>>) 등이 존재한다. 

 

3.4.1 산술연산자 (+, -, *, /, %)

산술연산자는 사칙연산을 일컫으며, boolean타입을 제외한 모든 기본 타입에서 사용이 가능하다. 

 

연산식 설명
피연산자 + 피연산자 덧셈 연산
피연산자 - 피연산자 뺼셈 연산
피연산자 * 피연산자 곱셈 연산
피연산자 / 피연산자 좌측 피연산자를 우측 피연산자로 나눗셈 연산
피연산자 % 피연산자 좌측 피연산자를 우측 피연산자로 나눈 나머지를 구하는 연산

산술 연산은 무조건 int 타입으로 변환한 후 연산을 수행한다. 이는 자바 가상 기계 (JVM)이 기본적으로 32비트단위로 계산을 하기 때문이다. 

 

3.4.2 문자열 연결 연산자 (+)

문자열 연결 연산자인 +는 문자열을 서로 결합하는 연산자이다. 이는 연산의 순서에 따라 출력 값이 달라질 수 있으니 유의해야 한다. 

"JDK" + 3 + 3.0; // "JDK33.0" 출력 - JDK +3 이 되어 문자열이 된다. 
3+ 3.0 + "JDK"; // "6.0JDK" 출력 - 3+3.0이 먼저 연산되었다. 

 

3.4.3 비교 연산자(<, <=, >=, ==, !=)

비교 연산자는 대소 (<, <=, >, >=) 또는 동등 (==, !=)을 비교해서 boolean타입인 true / false를 산출한다. 대소 연산자는 boolean타입을 제외한 기본 타입에 사용할 수 있고, 동등 연산자는 모든 타입에 사용될 수 있다. 비교연산자는 흐름 제어문인 조건문 (if), 반복문 (for, while)에서 주로 이용되어 실행 흐름을 제어할 때 사용된다. 

 

구분 연산식 설명
동등
비교
피연산자1 == 피연산자2 두 피연산자의 값이 같은지 검사
피연산자1 != 피연산자2 두 피연산자의 값이 다른지 검사
크기 비교 피연산자1 > 피연산자2 피연산자1이 큰지를 검사
피연산자1 >= 피연산자2 피연산자1이 크거나 같은지 검사
피연산자1 < 피연산자2 피연산자1이 작은지 검사
피연산자1 <= 피연산자2 피연산자1이 작거나 같은지 검사

 

3.4.4. 논리연산자  (&&, ||, &, |, ^, !)

논리연산자는 논리곱 (&&), 논리합 (||), 배타적 논리합 (^), 논리부정 (!) 연산을 수행한다. 논리연산자는 boolean만 사용이 가능하다.

구분 연산식 결과 실행
AND
(논리곱)
 true && 또는 & true true 피연산자가 모두 true 일 경우에만 연산 결과 true
 true false false
false  true false
false false false
OR
(논리합)
true || 또는 | true true 피연산자 중 하나만 true이면 연산 결과는 true
true false true
false true true
false false false
XOR
(배타적 논리합)
true ^ true false 피연산자 하나는 true고 다른 하나가 false일 때 연산 결과는 true
true false true
false true true
false false false
NOT
(논리부정)
  ! true false 피연산자의 논리값을 바꿈
false true

&&와 &의 차이는 효율성 측면에 있다. &&연산은 앞의 피연산자가 false이면 뒤의 피연산자를 평가하지 않고 false로 한다. 하지만 &의 경우 두 연산자를 모두 비교한다. || 와 | 도 동일하다. 

 

3.4.5 비트 연산자 (&, |, ^,<<, >>, >>>)

 

비트 연산자는 데이터를 비트 (bit)단위로 연산한다. 즉 0과 1이 피연산자가 된다. 즉, 0과 1로 펴한이 가능한 정수 타입만 비트 연산을 할 수 있다. float와 double은 비트 연산이 불가하다. 비트 논리 연산자(&, |, ^)와 비트 이동 연산자(<<, >>, >>>)로 구분할 수 있다. 

 

비트논리 연산자(&, |, ^)

비트 논리 연산자는 피연산자가 boolean 타입의 경우에 일반 논리 연산자이고, 정수 타입일 경우에는 비트 논리 연산자로 사용된다. 

 

구분 연산식 결과 실행
AND
(논리곱)
1 && 또는 & 1 1 두 비트 모두 1일 경우에만 연산 결과가 1
1 0 0
0  1 0
0 0 0
OR
(논리합)
1 || 또는 | 1 1 두 비트 중 하나만 1일 경우에만 연산 결과는 1
  0 1
0 1 1
0 0 0
XOR
(배타적 논리합)
1 ^ 1 0 두 비트 중 하나는 1이고 다른 하나가 0일 경우 결과는 1
1 0 1
0 1 1
0 0 0
NOT
(논리부정)
  ~ 1 0 보수
0 1

비트연산자는 피연산자를 int타입으로 자동 타입 변환한 후 연산을 수해앟ㄴ다. 그래서 byte, short, char 타입을 비트 연산하면 결과는 int 타입이 된다. 

 

비트이동 연산자 (<<, >>, >>>)

비트 이동 연산자는 정수 데이터의 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다. 다음 표를 참고해라. 

구분 연산식 설명
이동 (쉬프트)
shift
a <<  b  정수 a의 각 비트를 b 만큼 왼쪽으로 이동 (빈자리는 0으로 채워짐)
a >> b 정수 a의 각 비트를 b 만큼 오른쪽으로 이동 (빈자리는 정수 a의 최상위 부호비트로 채워짐)
a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동

3.4.6 대입연산자  (=,+=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=)

대입연산자는 오른쪽 피연산자의 값을 좌측 피연산자인 변수에 저장을 한다. 다음 표를 이해하면 대입 연산자에 대해 자세히 알 수 있다. 

 

구분 연산식 설명
단순 대입 연산자 변수 = 피연산자 우측의 피연산자의 값을 변수에 저장
복합 대입 연산자 변수 += 피연산자 우측의 피연산자의 값을 변수의 값과 더한 후에 다시 변수에 저장 (변수 = 변수 + 피연산자와 동일)
변수 -= 피연산자 우측의 피연산자의 값을 변수의 값에서 뺸 후에 다시 변수에 저장 (변수 = 변수 - 피연산자와 동일)
변수 *= 피연산자 우측의 피연산자의 값을 변수의 값과 곱한 후에 다시 변수에 저장 (변수 = 변수 * 피연산자와 동일)
변수 /= 피연산자 우측의 피연산자의 값을 변수의 값과 나눈 후에 다시 변수에 저장 (변수 = 변수 / 피연산자와 동일)
변수 %= 피연산자 우측의 피연산자의 값을 변수의 값과 나눈  후에 나머지를 다시 변수에 저장 (변수 = 변수 % 피연산자와 동일)
변수 &= 피연산자 우측의 피연산자의 값을 변수의 값을 & 연산 후에 다시 변수에 저장 (변수 = 변수 & 피연산자와 동일)
변수 |= 피연산자 우측의 피연산자의 값을 변수의 값을 | 연산 후에 다시 변수에 저장 (변수 = 변수 | 피연산자와 동일)
변수 ^= 피연산자 우측의 피연산자의 값을 변수의 값을 ^ 연산 후에 다시 변수에 저장 (변수 = 변수 ^ 피연산자와 동일)
변수 <<= 피연산자 우측의 피연산자의 값을 변수의 값을 << 연산 후에 다시 변수에 저장 (변수 << 변수 & 피연산자와 동일)
변수 >>= 피연산자 우측의 피연산자의 값을 변수의 값을 >> 연산 후에 다시 변수에 저장 (변수 >> 변수 & 피연산자와 동일)
변수 >>>= 피연산자 우측의 피연산자의 값을 변수의 값을 >>> 연산 후에 다시 변수에 저장 (변수 = 변수 >>> 피연산자와 동일)

대입 연산자는 연산자 중에서 가장 낮은 연산자 순위를 가지고 있다. 그러므로 제일 마지막에 수행이 된다. 또한, 연산의 진행방향은 오른쪽에서 왼쪽으로 진행하므로 a = b= c= 5; 는 다음 순서로 연산된다. 

 

출처: 이것이 자바다

3.5 삼항 연산자

삼항 연산자는 세개의 피연산자를 필요로 하는 연산자를 말한다. 삼항 연산자는 ? 앞의 조건식에 따른 콜론 (:) 앞뒤의 피연산자가 선택된다고 해서 조건 연산식이라고 부르기도 한다. 삼항 연산자를 사용하는 방법은 다음과 같다. 

 

조건식을 연산할 떄, true가 나오면 그림의 true라는 부분의 결과가 출력되고, 조건식 연산이 false일 경우에는 그림의 false 위치의 값이 출력된다. 

 

 

'JAVA > Front-end 교육과정 정리' 카테고리의 다른 글

[예습] 2020.12.09 UTF-8 과 UTF-16의 차이점  (0) 2020.12.09
[2020.12.07] 1일차 OT  (0) 2020.12.07