Java/[도서] 자바의 정석

연산자, 조건문과 반복문 (2/8)

Lea Hwang 2022. 11. 25. 01:27
참고한 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와 다름