본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석1-4 타입 변환과 연산자(operator)

by 이쟝 2021. 12. 28.

타입 간의 변환 방법

1) 문자와 숫자 간의 변환

숫자 3 ->  문자 ‘3’ :  3 + ‘0’ -> ‘3’

문자 ‘3’ -> 숫자 3 :  ‘3’ – ‘0’ -> 3

 

2) 문자열로의 변환

숫자 3 -> 문자열”3” : 3 + “” -> “3”

문자 ‘3’ -> 문자열”3” : ‘3’ + “” -> “3”

 

3) 문자열을 숫자로 변환

문자열을 정수로 Integer.parseInt(“3”)

문자열을 실수로 Double.parseDouble(“3.4”)

문자열을 문자로 “3”. CharAt(0) -> ‘3’

 

String str = "3";
System.out.println(str.charAt(0) - '0'); //문자열 -> 문자 -> 숫자3
System.out.println('3' - '0' +1); //숫자4
System.out.println(Integer.parseInt("3") + 1); //숫자4
System.out.println("3" + 1); //문자열31
System.out.println(3 + '0'); // 숫자51 문자를 숫자로 바꿔서 더함! '0'은 숫자로 48
System.out.println((char)(3 + '0')); // 문자 3

연산자와 피연산자

연산자: 연산을 수행하는 기호(+, -, * /)

피연산자: 연산자의 연산 수행 대상

모든 연산자는 연산 결과를 반환한다!” -> 연산결과를 반환하지 않으면 연산자가 아니다!

y = 4 * x + 3; // x의 값이 5라면, y의 값은 23이 된다.

System.out.println(y); // y의 값인 23이 화면에 출력된다.

 

종류 연산자 설명
산술연산자 + - * / % 사칙연산과 나머지 연산(%)
비교연산자 > < >= <= == != 크고 작음과 같고 다름을 비교
논리연산자 && | | ! 그리고(AND)와 또는(OR)으로 조건을 연결 !->not
대입연산자 = 우변의 값을 좌변에 저장
기타 (type) ?: instanceof 형변환연산자, 삼항연산자 instanceof연산자

 


연산자의 우선순위

하나의 식(expression)에 연산자가 둘 이상 있을 때, 어떤 연산을 먼저 수행할지를 자동 결정하는 것 (괄호는 -> 수동결정)

 

 

설명
-x + 3 단항 연산자(-)가 이항 연산자(-x + 3)보다 우선순위가 높다. 그래서 x의 부호를 바꾼 다음 덧셈이 수행된다. 여기서 ‘-‘는 뺄셈 연산자가 아니라 부호 연산자
x + 3 * y 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다. 3 * y가 먼저 계산
x + 3 > y – 2 비교 연산자 (>) 보다 산술연산자 ‘+’‘-‘가 먼저 수행된다.
x > 3 && x < 5 논리연산자 ‘&&’보다 비교 연산자가 먼저 수행된다. x >3 x >5k 먼저 계산된 다음에 &&가 수행된다.
result = x + y * 3; 대입연산자는 연산자 중에서 제일 우선순위가 낮다. 그래서 우변의 최종 연산결과가 변수 result에 저장된다.

 

연산자의 결합 규칙

우선순위가 같은 연산자가 있을 때, 대입과 단항 연산자를 제외하면, 모두 왼쪽 -> 오른쪽

대입, 단항 연산자만 오른쪽 -> 왼쪽으로

 

증감 연산자

증가 연산자(++) 피연산자의 값을 1 증가시킨다.

감소 연산자(--) 피연산자의 값을 1 감소시킨다.

타입 설명 사용예
전위형 값이 참조되기 전에 증가 j = ++i ;
후위형 값이 참조된 후에 증가 j = i++;

 

증감 연산자가 독립적으로 사용된 경우, 전위형과 후위형의 차이가 없다.”

ex) ++i; == i++;

 

int i=5, j=0; 
j = i++; // 후위형 j = i; i++;  -> 증가 후에, 참조하여 대입
System.out.println("j=i++; 실행후, i=" + i +", j=" + j); //i는 6 j는 5
		
i=5; 
j=0;
j = ++i; // 전위형 ++i; j = i;  -> 참조하여 대입 후에 증가
System.out.println("j=++i; 실행후, i=" + i +", j=" + j); //i는 6 j는 6

 

부호 연산자

‘-‘는 피연산자의 부호를 반대로 변경

‘+’는 아무런 일도 하지 않는다.(실제 사용 x)

i = -10;

i = -i;

System.out.println(i); -> 10


형 변환 연산자

형 변환:변수 또는 상수의 타입을 다른 타입으로 변환하는 것  -> (타입)피연산자

double d = 85.4;

int score = (int) d;-> int score (int) 85,4; -> int score = 85; // d는 그대로 85

변환 수식 결과
int -> char (char)65 ‘A’
char -> int (int)’A’ 65
float -> int (int)1.6f 1(소수점 버려지고 반올림x)
int -> float (float)10 10.0f

유니코드&amp;amp;amp;amp;nbsp;

-> 문자가 A로 저장되는 게 아니라 65로 저장됨!


자동형 변환

float f = 1234; //int타입의 값을 타입의 변수에 저장

-> 가능한 이유: int타입보다 float타입의 범위가 훨씬 크기 때문에!(작은 값을 큰 타입의 범위에 넣어서 문제 xx)

float f = (float)1234;으로 자동 형변환(컴파일러가 자동으로 형변환을 해 줌)

 

int i = 3.14f; // 에러! float 범위가 int 범위보다 넓기 때문에 ex) 3.14f -> 3 : 값손실 발생!

int i = (int) 3.14f; // OK -> 수동형변환

 

1. byte -> int // 자동형변환

byte b = 10;

int i =    b;  // 생략 가능! int4byte byte1byte

2. int -> byte // 직접 형변환

int i2 = 300;

byte b2 = (byte)_i2; // 생략불가

 

1번

byte b = 100; // Ok. byte타입의 범위(-128 ~ 127)의 값에 들어가서 생략 가능!

byte b = (byte) 100; // Ok. byte타입으로 자동형변환하여 대입

2번

int i = 100;

byte b = i; //에러 int 타입을 byte 타입에 대입

byte b = (byte)i //Ok. byte타입으로 형변환하여 대입(형변환)

 

-> 1번의 100의 값은 컴퓨터가 확실하게 int타입이라는 것을 알지만 2번은 i의 변수안에 들어가 있기 때문에 변수안에 어떤 수가 있는지 컴파일러가 몰라서

 

byte b = 1000; //에러 byte타입의 범위(-128 ~ 127)를 벗어난 값의 대입

byte b = (byte)1000; //Ok. 그러나 값 손실이 발생해서 변수 b에서는 -24가 저장됨

-> 형 변환과정에서 값손실이 발생한다면 컴파일러가 자동으로 형변환 xx


사칙연산자(+ - * /)

10(int) / 4(int) -> 2(int) // 소수점 이하는 버려진다.

10(int) / 4.0f(float) || 10.0f(float) / 4.0f(float) -> 2.5(float)

 

산술변환

연산 전에 피연산자의 타입을 일치시키는 것

1) 두 피연산자의 타입을 같게 일치시킨다.(보타 큰 타입으로 일치)

long + int -> long + long -> long

float + int -> float + float -> float

double + float -> double + double -> double

2) 피연산자의 타입이 int보다 작은 타입(byte, char, short)이면 int로 변환된다.

byte + short -> int + int -> int

char + short -> int + int -> int

 

‘2’ – ‘0’ -> 50 – 48 -> 2 //char – char -> int – int -> int

문자 ‘2’ -> int로 형변환 하면 50!

 

int a = 1_000_000;  // 1백만 = 10의 6제곱
int b = 2_000_000;  // 2백만 = 10의 6제곱
		
//10의 12제곱. int의 범위는 10의 9제곱
long c = a * b; // 결과가 int
System.out.println(c);  //-1454759936(int타입) 오버플로우 발생

이때 형변환으로 long c = (long)a * b; 하면 올바른 값이 나옴!(어느 한쪽을 형 변환)

나머지 연산자 %

오른쪽 피연산자로 나누고 남은 나머지를 반환

int x = 10;

int y = 8;

System.out.println(10 % 8); // 108로 나눈 나머지 2가 출력된다.

System.out.println(10 %-8); // 위와 같은 결과를 얻는다. (부호는 무시됨)

 

비교 연산자 > < >= <= == !=

두 피연산자를 비교해서 true() 또는 false(거짓)을 반환

 

비교연산자 연산결과
좌변 값이 크면, true 아니면 false
좌변 값이 작으면, true 아니면 false
>= 좌변 값이 크거나 같으면, true 아니면 false
<= 좌변 값이 작거나 같으면, true 아니면 false
== 두 값이 같으면, true 아니면 false
!= 두 값이 다르면, true 아니면 false

 

문자열 비교에는 == 대신 equals()메소드를 사용해야 한다.

String str1 = “abc”;

String str2 = “abc”;

System.out.println(str1 == str2) //true

System.out.println(str1.equals(str2)) //true

 

String str1 = new String(“abc”);

String str2 = new String(“abc”);

System.out.println(str1 == str2) //false

System.out.println(str1.equals(strw)) //true

-> 위아래 코드 똑같음!


논리 연산자 && ||

조건식을 연결할 때 사용하는 연산자

|| (OR결합) 피연산자 중 어느 한쪽이 true이면 true를 결과로 얻는다.

&& (AND결합 피연산자 중 양쪽 모두 true이어야 true를 결과로 얻는다.

 

x10보다 크고 20보다 작다.

10 < x && x < 20

i2의 배수 또는 3의 배수이다.

i%2==0 || i%3==0

i2의 배수 또는 3의 배수지만 6의 배수는 아니다.

(i%2==0 || i%3==0) && i%6!=0 // && ||보다 우선순위가 높아서 괄호 사용!

문자 ch는 숫자(‘0’~’9’)이다.

‘0’ <= ch && ch <= ‘9’  // 유니코드에서 문자 ‘0’부터 ‘9’까지 연속적으로 배치되어 있기 때문

문자 ch는 대문자 또는 소문자이다.

(‘a’ <= ch && ch <= ‘z’) || (‘A’ <= ch && ch <= ‘Z’) //소문자 대문자 똑같이 연속적으로 배치


논리 부정 연산자 !

truefalse, falsetrue

Boolean b = true;

!!b -> !!true -> !false -> true

문자 ch가 소문자가 아니다. -> !(‘a’ <= ch && ch <= ‘z’)

 

조건 연산자 ? : (삼항연산자)

조건식의 결과에 따라 연산결과를 달리한다.

 

 

result = (x > y) ? x : y ; // 괄호 생략 가능

 

대입 연산자

오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반환

 

복합 대입 연산자