1. 연산자
설명보기
- 기본 자료형을 계산하기 위해 사용
- 타입별 사용가능한 연산자가 있다.
구분 연산자 비고 결과가 boolean 숫자 비교 연산자 <, <=, >, >= 숫자 동등 연산자 ==, != 결과가 int 혹은 long 기본 사칙 연산자 +, -, *, /, % 증감 연산자 ++, -- 비트 연산자 &, |, ^, ~, <<, >>, >>> 많이 사용하지 않음 기타 연산자 삼항 연산자 ? : 형 변환 연산자 (타입) 문자열 더하기 연산자 +
- 전위 연산자 : 다른 연산을 수행하기 전에 피연산자의 값을 1 증가 / 감소
- 후위 연산자 : 값을 먼저 읽어온 후에 피연산자의 값을 1 증가 / 감소
- 다음번에 피연산자를 호출하면 1 증가 / 감소
- 이항 연산자 :
- 피연산자들의 타입 규칙
- 피연산자들이 모두 int보다 크기가 작을 경우, int로 변환 후 연산
- byte + byte → int + int
- 피연산자 중에 long 타입이 있을 경우 모두 long으로 변환 후 연산
- int + long → long + long
- 피연산자 중에 float 혹은 double 타입이 있을 경우 크기가 큰 실수 타입으로 변환 후 연산
- int + float → float + float
- 피연산자들이 모두 int보다 크기가 작을 경우, int로 변환 후 연산
- 피연산자들의 타입 규칙
연산의 방향
- 우선순위가 더 높은 연산자부터 실행
- 우선순위가 같다면 왼쪽에 있는 연산부터 실행
- 단, [대입 / 단항 / 부호] 연산자는 오른쪽에서 왼쪽으로 진행
- int result2 = x = y = 5
연산의 우선순위
1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다. 2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다. 3. 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽(->)이다. 4. 복잡한 연산식에는 괄호()를 사용해서 우선순위를 정해준다.
연산자 연산 방향 우선 순위 증감(++, --), 부호(+, -), 비트(~), 논리(!) ← 높음 산술(*, /, %) → 산술(+, -) → 쉬프트(<<, >>, >>>) → 비교(<, >, <=, >=) → 비교(==, !=) → 논리(&) → 논리(^) → 논리(|) → 논리(&&) → 논리(||) → 조건(?:) → 대입(=, +=, -=, *=, /=, %=, &=, ^=, …) ← 낮음 - 오버플로우 : 자료형의 저장 범위를 초과했을 때 발생하는 현상
int a = 1000000; int b = 1000000; int c = a * b; System.out.println(c); // -727379968
- 비교 연산
- 둘중에 크기가 더 큰 타입으로 일치시킨다.
- char 비교연산 : 유니코드 값
- double 과 float 타입 비교
0.1 == 0.1f // false /* 오른쪽의 0.1f가 double로 변환되어 0.1 == 0.1 의 결과로 true가 되어야할 것 같지만 그렇지 않습니다. 그 이유는 모든 부동소수점 타입은 0.1을 정확히 표기할 수 없어서 0.1f는 0.1의 근사 값이(예를 들어 0.100000000149와 같은 값) 되기 때문 */
- String 비교 연산 :
- 대소비교 : 불가능
- 동등비교 : str1.equals(str2) {그냥 변수명은 주솟값을 저장하기 때문}
- NaN, Infinity : 정의 | infinity / NaN 비교연산
- 문자열 연결 연산자 (+) : 왼쪽부터 오른쪽으로 연산이 진행
// 문자열 "Hello"와 123이 먼저 연산되어 "Hello123"이 되고, // 이것을 다시 456과 연산하여 "Hello123456"이 됩니다. System.out.println("Hello" + 123 + 456); // Hello123456 // 숫자 123과 456이 먼저 연산되어 579가 되고, // 이것을 문자열 "Hello"와 연산하여 "579Hello"가 됩니다. System.out.println(123 + 456 + "Hello"); // 579Hello
- 비트 연산자
- 비트 이동 연산자 (shift 연산자)
연산식 결과 a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동 (빈자리는 0으로 채워짐) a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 최상위 부호 비트(MSB)와 같은 값으로 채워짐) a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동시키며, 새로운 비트는 전부 0으로 채워짐 - 비트 논리 연산자 (&, |, ^, ~)
x y x & y (AND) x | y (OR) x ^ y (XOR) 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 - ~ (not) : 피연산자의 비트를 기준으로 not을 실행
- 단항 연산자
연산식 설명 ++피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴 --피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴 피연산자++ 값을 먼저 읽어온 후에 피연산자의 값을 1 증가시킴 피연산자-- 값을 먼저 읽어온 후에 피연산자의 값을 1 감소시킴
- 삼항 연산자
- 간단한 연산식이라면 if문 보다는 삼항연산자 한줄로 간단하게 사용하는 것이 더 효율적
- 가독성을 해치지 않는 선에서 실무에서도 많이 사용
2. 조건문
설명보기
- if문
- 조건식이 true일 때 블록 내부를 실행
- Switch/case문
- 입력변수가 어떤 값을 갖느냐에 따라 실행문을 선택
- 입력변수 : byte, short, char, int, enum, String만 가능
- 입력값이 정형화 되어있는경우에 사용
- break를 붙이지 않으면 case값과 상관없이 뒤에 있는 case가 연달아 실행된다.
- if문
3. 반복문
설명보기
- for : 정해진 횟수만큼 반복
for (초기화식; 조건문; 증감식) { ... }
- for each문
for (자료형 변수명: iterate) { body-of-loop } int[] intArr = {89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99}; for (int number:intArr) { System.out.println(number); }
- while문 : 조건식이 true일 경우에 계속해서 반복
while (조건문) { <수행할 문장1>; <수행할 문장2>; <수행할 문장3>; ... }
- do-while문
do { 실행문; -> 조건식의 결과가 true일 때 실행될 문장 ... } while (조건식);
- for : 정해진 횟수만큼 반복
4. 배열
설명보기
- 자료형 바로 뒤, 혹은 변수명 뒤에 [](대괄호)기호를 붙인다.
- 선언 및 초기화
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; String[] weeks = new String[7]; // 배열의 크기를 7로 먼저 설정하여 배열 변수 생성 weeks[0] = "월"; // 각 인덱스에 해당하는 값 대입 weeks[1] = "화"; weeks[2] = "수"; weeks[3] = "목"; weeks[4] = "금"; weeks[5] = "토"; weeks[6] = "일";
- 배열의 길이 : .length
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; for (int i = 0; i < weeks.length; i++) { System.out.println(weeks[i]); }
5. 기타
설명보기
- 디버깅 : 코드 라인숫자부분을 클릭하면 breakpoint를 만들 수 있다.
- 해당 줄의 코드 실행전에 전체 실행이 일시정지 상태가 된다.
- 비트 연산자는 실제 비트 마스킹에 사용된다.
- 비트 연산자(&) 와 논리 연산자 (&&)의 차이점
- 논리 연산자 (단축평가) : 앞의 식이 거짓이면 뒷 식은 실행하지 않는다
- 비트 연산자 : 앞의 식이 거짓이어도 뒷 식이 실행된다.
- 실행할 때, EditConfiguration을 통해 main 메소드의 입력값 args를 지정할 수 있다.
NaN
과Infinity
NaN
: Not a Number- 수학적으로 정의되지 않은 / 무의미한 연산의 결과
Infinity
: 무한대의 개념. 숫자인 값인데 매우 큰 숫자라고.- 다른 값과 모든 연산이 불가하다.
- 이 둘은 수학적 정의 상의 차이가 있음
- 이 두 값에 어떤 연산을 해도 NaN 또는 Infinity가 되기 때문에 다음 연산을 수행해서는 안된다.
- 자바에서 0이 아닌 실수(float, double)를 0으로 나누는 것은 양의 Infinity 또는 음의 Infinity 결과를 낳는다.
double result = 5.0 / 0.0; System.out.println(result); // Infinity double negativeResult = -10.0 / 0.0; System.out.println(negativeResult); /// -Infinity
- 정수형을 0으로 나누면
ArithmeticExcpetion
이 발생하는 것과는 구분됨!
- 정수형을 0으로 나누면
6. Daily Quiz
설명보기
'Dev > ESTsoft 오르미' 카테고리의 다른 글
클래스 (0) | 2024.02.23 |
---|---|
참조자료형 (0) | 2024.02.22 |
변수 (0) | 2024.02.22 |
Java 기초 (0) | 2024.02.22 |
강사님 코드리뷰 (0) | 2024.02.22 |