연산자, 조건문과 반복문 (2/8)
2022. 11. 25. 01:27ㆍJava/[도서] 자바의 정석
참고한 repository : https://github.com/vividswan/The_Essence_of_Java_Book_Study
연산자
연산자 : 연산을 수행하는 기호(+, -, *, / 등)
피연산자 : 연산자의 작업 대상
연산자는 피연산자로 연산을 수행한 후 결괏값을 반환합니다.
연산자의 종류
- 산술 연산자
- +, -, *, /, %
- 비교 연산자
- <, >, >=, <=, ==, !=
- 논리 연산자
- &&, ||, !, &, |, ^, ~
- AND, OR으로 조건을 연결
- 대입 연산자
- =
- 우변의 값을 좌변에 저장
- 기타
- (type), ?:, instanceof
- 형변환 연산자, 삼항 연산자, instanceof 연산자
- 피연산자의 개수에 의한 분류도 가능
- 단항 연산자, 이항 연산자, 삼항 연산자
- 삼항 연산자는 오직 ? : 하나뿐
- 부호와 증감 연산자는 단항 연산자
연산자의 우선순위와 결합 규칙
- 단항 연산자가 이항 연산자보다 우선순위가 높음
- 곱셈과 나눗셈이 뺄셈과 덧셈보다 우선순위가 높음
- 비교 연산자보다 산술 연산자가 먼저 수행
- 논리 연산자보다 비교 연산자가 먼저 수행
- 대입 연산자는 연산자 중에서 우선순위가 낮음
- 비교 연산자 &는 비교 연산자 ==보다 우선순위가 낮음
- data & 0xFF == 0 은 data & (0xFF == 0)
- 논리 연산자 중에서는 AND를 의미하는 &, &&가 OR를 의미하는 |, || 보다 우선순위가 낮음
- 연산자의 결합 규칙
- 산술 > 비교 > 논리 > 대입 우선순위
- 단항(1) > 이항(2) > 삼항(3) 우선순위
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽
산술 변환
연산 전에 피연산자 타입의 일치를 위해 자동 형변환되는 것을 '산술 변환' 또는 '일반 산술 변환'이라 부름
- 두 피연산자의 타입을 같게 일치 시킴
- 보다 큰 타입으로 일치
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환
단항 연산자
증감 연산자 ++, --
- 증감 연산자(++) : 피연산자의 값을 1 증가시킨다.
- 감소 연산자(--) : 피연산자의 값을 1 감소시킨다.
- 타입
- 전위형 : 값이 참조되기 전에 증가시킨다. (ex: j = ++i;)
- 후위형 : 값이 참조된 후에 증가시킨다. (ex: j = i++;)
- (수식이나 메서드 호출에 포함되지 않고) 독립적인 하나의 문장으로 쓰인 경우에는 둘의 차이가 없음
- 식에 두 번 이상 포함된 변수에 증감 연산자를 사용하는 것은 피할 것
산술 연산자
사칙 연산자 +, -, *, /
- 곱셈, 나눗셈, 나머지 연산자가 덧셈, 뺄셈 연산자보다 우선순위가 높음
- 피연산자가 정수형인 경우 나누는 수가 0인 경우 에러가 발생
- 나누기 연산자의 두 피연산자가 모두 int 타입인 경우, 연산 결과 역시 int 타입
- 올바른 연산 결과를 얻기 위해서는 두 피연산자 중 한쪽을 실수형으로 형변환 (한 쪽도 자동 형변환)
- 부동 소수점 값인 0.0f, 0.0d로 나누는 것은 가능하지만 결과는 Infinity(무한대)
[연산자 +는 두 개의 피연산자들의 자료형을 int로 변환한 다음 덧셈을 수행]
byte a = 10;
byte b = 20;
// byte c = a+b; 컴파일 에러 Type mismatch: cannot convert from int to byte
byte c = (byte) (a+b);
int a = 1_000_000;
int b = 2_000_000;
long c = a * b; // int범위를 넘어가므로 잘못된 값이 출력
long d = (long)a * b; // 형변환을 해야 올바른 값이 출력
System.out.print(d); // 2000000000000
- 사칙연산의 피연산자는 문자도 가능
- 해당 문자의 유니코드로 바뀌어 저장
- char형과 int형 간의 연산 결과는 int형이므로 char형에 저장하기 위해선 형변환 필요
[int보다 작은 타입의 피연산자는 int로 자동 형변환]
char c1 = 'a';
//char c3 = c1 + 1; 컴파일 에러 Type mismatch: cannot convert from int to char
char c3 = (char) (c1 + 1); //b
char c2 = 'a' + 1; //b
나머지 연산자 %
- 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환
- 오른쪽 피연산자로 0을 사용할 수 없음
- 주로 짝수, 홀수 검사 또는 배수 검사 등에 사용
비교 연산자
- 연산 결과는 boolean
- 피연산자의 타입이 서로 다를 시 자료형의 범위가 큰 쪽으로 자동 형변환
대소 비교 연산자 <, >, <=, >=
등가 비교 연산자 ==, !=
- 두 피연산자의 값이 같은지 다른지를 비교
- =는 자바에서는 대입 연산자이지 등가 비교 연산자가 아님
- 연산을 수행하기 전 형변환을 통해 두 피연산자의 타입을 맞추고 비교
- 두 문자열을 비교할 때는 equals() 메서드 사용
- 대소문자를 구별하지 않고 싶을 땐 equalsIgnoreCase() 사용
- 문자열을 ==로 검사 시 객체의 주소 값을 검사하는 것이지 내용을 비교하는 것이 아님
논리 연산자
- || (OR) : 피연산자 중 어느 한쪽만 true 이면 true를 결과로 얻음
- && (AND) : 피연산자 양쪽 모두 true 이여야 true를 결과로 얻음
논리 부정 연산자 !
- true면 false를 false면 true를 반환
비트 연산자
비트 연산자 &, |, ^, ~, <<, >>
- 비트 연산자는 피연산자를 비트 단위로 논리 연산
- 피연산자로 실수를 허용 X
- 종류
- | (OR연산자) - 피연산자 중 한쪽의 값이 1이면 결과로 1, 그 외는 0
- & (AND연산자) - 피연산자 양쪽이 모두 1이어야만 결과로 1, 그 외는 0
- ^ (XOR연산자) - 피연산자의 값이 서로 다를 때만 결과로 1, 같을 때는 0
- 비트 연산에서도 피연산자의 타입을 일치시키는 산술 변환이 일어날 수 있음
그 외의 연산자
조건 연산자 ?:
- 조건 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자
- 삼항 연산자는 조건 연산자 하나뿐
- 조건식 ? 식1 : 식2
- 조건식이 true면 식1이, false면 식2
- if문 대신 조건 연산자로 코드를 간단히 할 수 있음
- 식1, 식2 피연산자의 타입이 다른 경우 산술 변환 발생
조건문과 반복문
- 조건문
- if
- switch
- 반복문
- for
- while
조건문
if문
- 조건식이 참일 시 괄호 안의 문장을 수행
- 조건식은 일반적으로 비교 연산자와 논리 연산자로 구성
- 한 문장일 시 괄호 생략 가능
if-else문
- if문의 문장이 거짓일 시 else문 수행
- else문도 한 문장일 시 괄호 생략 가능
중첩 if문
- if문의 블록 내에 또 다른 if문을 포함시키는 것이 가능
- 중첩의 횟수는 제한이 없음
switch문
- switch문은 if문과 달리 단 하나의 조건식으로 많은 경우의 수 처리 가능
- 조건식을 계산 후 결과와 일치하는 case문으로 이동 후 이후의 문장들을 수행
- break문이나 switch문의 끝을 만날 때까지 진행
- 조건과 일치하는 case문이 하나도 없을 시 default문으로 이동
switch문의 제약조건
- switch문의 조건식 결과는 정수 또는 문자열
- case문의 값은 정수, 상수만 가능하고 중복 불가능
switch 중첩
- if문처럼 switch문도 중첩 가능
- 중첩 switch문에서 break문 빼먹지 않도록 주의
반복문
for문
for(초기화;조건식;증감식){
// 조건식이 참일 때 수행될 문장
}
for문은 반복 횟수를 알고 있을 때 적합합니다.
- 순서: 초기화 → 조건식 → 수행될 문장 → 증감식 ....
초기화
- 반복문에 사용될 변수를 초기화
- 처음에 한 번만 수행
- 콤마를 구분자로 변수로 두고 여러 변수를 선언 가능
조건식
- 조건식의 값이 true이면 반복, 거짓이면 반복 중단 후 for문을 벗어남
증감식
- 반복문을 제어하는 변수의 값을 증가 또는 감소
- 매 반복마다 변수의 값이 증감식에 의해 변함
- 다양한 연산자로 증감식 작성 가능
- 콤마를 이용해서 두 문장 이상을 하나로 연결 가능
중첩 for문
- for문 안에 또 다른 for문 포함 가능
while문
- 블록만으로 이루어져 있으며 조건식이 참일 동안 블록 내의 문장을 반복
- 초기화나 증감식이 필요하지 않을 땐 for문보다 while문이 더 적합
while문의 조건식은 생략 불가
- for문과 달리 생략할 수 없음
- 항상 참이 되도록 하기 위해선 반드시 true를 넣어야 함
- 무한 반복문을 벗어날 수 있도록 조건식 반드시 넣기
break문
- break문은 자신이 포함된 가장 가까운 반복문을 벗어남
- if문과 함께 사용하여 특정 조건을 만족하면 반복문을 벗어나도록 함
continue문
- 반복문 내에서만 사용 가능
- continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어감
- 반복문 전체를 벗어나지 않고 다음 반복을 수행한다는 점이 break와 다름
'Java > [도서] 자바의 정석' 카테고리의 다른 글
자바, 변수, 기본형과 참조형, 상수와 리터럴, 진법, 형변환 (1/8) (0) | 2022.11.24 |
---|---|
생성자(constructor) (0) | 2022.05.10 |
오버라이딩(overriding) (0) | 2022.05.07 |
오버로딩(overloading) (0) | 2022.05.05 |
Scanner보다 빠른 입력 BufferedReader, StringTokenizer (0) | 2022.05.03 |