타입 간의 변환 방법
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 |
-> 문자가 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; // 생략 가능! int는 4byte byte는 1byte
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); // 10을 8로 나눈 나머지 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를 결과로 얻는다.
x는 10보다 크고 20보다 작다.
10 < x && x < 20
i는 2의 배수 또는 3의 배수이다.
i%2==0 || i%3==0
i는 2의 배수 또는 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’) //소문자 대문자 똑같이 연속적으로 배치
논리 부정 연산자 !
true를 false로, false는 true로
Boolean b = true;
!!b -> !!true -> !false -> true
문자 ch가 소문자가 아니다. -> !(‘a’ <= ch && ch <= ‘z’)
조건 연산자 ? : (삼항연산자)
조건식의 결과에 따라 연산결과를 달리한다.
result = (x > y) ? x : y ; // 괄호 생략 가능
대입 연산자
오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반환
복합 대입 연산자
'멀티캠퍼스 풀스택 과정 > Java의 정석' 카테고리의 다른 글
자바의 정석1-6 반복문 (0) | 2021.12.29 |
---|---|
자바의정석1-5 조건문 (0) | 2021.12.29 |
자바의 정석1-3 화면 입출력 (0) | 2021.12.28 |
자바의 정석1-2 변수, 기본형과 참조형 (0) | 2021.12.28 |
자바의 정석1-1 자바의 개념 (0) | 2021.12.28 |