Java 기초 (2)

.·2023년 5월 3일

연산자

연산자와 피연산자 구별하기

9 * x + 3

연산자 : 연산을 수행하는 기호 -> * , +
피연산자 : 연산자의 연산 수행 대상 -> 9 , x , 3

"모든 연산자는 연산결과를 반환한다."

  • 즉, 연산결과를 반환하지 않으면 연산자가 아니다.
    • ex) () -> 괄호는 연산자가 아니다.

연산자 종류

연산자의 우선순위

하나의 식에 연산자가 둘 이상 있을 때, 어떤 연산을 먼저 수행 할지를 자동 결정하는 것.
= > 5 + 3 4
1. 3
4
2. 5 + 12
연산 순서를 수동으로 결정하고 싶다면 괄호() 를 사용하면 된다.
= > (5 + 3) 4
1. 5 + 3
2. 8
4

연산자의 결합규칙

우선순위가 같은 연산자가 있을 때, 어떤 것을 먼저하는가?
= > 3 + 4 - 5 -> (3 + 4) - 5
기본적인 계산 순서는 왼쪽에서 오른쪽
대입과 단항 연산자일 경우 오른쪽에서 왼쪽

증감 연산자와 부호 연산자

증감 연산자

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

  • 전위형 : 값이 참조되기 전에 증가/감소 시킨다. (ex. k = ++j;
    k = --j;)
  • 후위형 : 값이 참조된 후에 증가/감소 시킨다. (ex. k = j++;
    k = j--;)

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

  • ++k; k++; = > 값 동일

부호 연산자

'-' 는 피연산자의 부호를 반대로 변경합니다.
'+' 는 아무런 일도 하지 않습니다.(실제 사용X)

형변환 연산자와 자동 형변환

형변환 연산자

형변환이란?

  • 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 의미한다.
  • (타입)피연산자

자동 형변환

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

  • 상대적으로 int 타입이 float 타입 보다 크기가 작기 때문에 가능하다.
    float f = (float)1234; => 사실 변수와 리터럴의 타입을 일치 시켜줘야 한다.
  • 우리가 보는 코드에는 형변환이 생략되어 있었다. 즉, 컴파일러에 의해 자동으로 형변환된 것이다.

int i = 3.14f;

  • 이렇게 큰 타입을 작은 타입에 저장할 때 Error 가 발생한다.
  • 3.14f 가 int 타입으로 변환될 때 소수점이 사라지면서 원래 값이 달라진다.
  • 즉, 값 손실이 발생하는데 이런 경우, 컴파일러가 자동으로 형변환을 안 해준다.
    int i = (int)3.14f; => 이렇게 직접 수동으로 형변환을 시켜줘야 한다.

"기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."

  • 형변환을 하는 이유는 주로 서로 다른 두 타입을 일치시키기 위해서인데, 형변환을 생략 하려면 컴파일러가 알아서 자동으로 형변환을 해야한다.
  • 따라서 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없음으로 두 타입 중에서 표현 범위가 더 넓은 쪽으로 형변환된다.

사칙 연산자와 산술변환

사칙 연산자

덧셈(+) 뺄셈(-) 곱셈(*) 나눗셈(/)

산술변환

연산 전에 피연산자의 타입을 일치시키는 것을 의미한다.
1. 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)

  • long + int -> long + long => long
  • float + int -> float + float => float
  • double + float -> double + double => double
  1. 피연산자의 타입이 int 보다 작은 타입 이면 int 로 변환된다.
  • byte + short -> int + int => int
  • char + short -> int + int => int
  • 이는 int 보다 작은 타입이 계산을 통해 쉽게 범위가 넘어갈 수 있기 때문에 오버플로우가 발생해
    정확한 계산값을 가져오지 못할 수 있어서 미리 큰 범위인 int 타입으로 변환시킨 후 계산하는 것이다.

Math 클래스와 나머지 연산자

Math

  • Math는 수학과 관련된 메서드를 가지고 있는 클래스이다.
  • 메서드는 '특정한 기능을 수행하기 위해 코드로 작성된 단위' 라고 생각하면 된다.
  • round() : 실수를 소수점 첫 째자리에서 반올림정수를 반환한다.
  • ceil() : 올림값을 double 형으로 반환한다.
  • floor() : 내림값을 double 형으로 반환한다.
  • abs() : int, double 기본형 모두 사용 가능하며 절대값을 얻는다.

나머지 연산자 %

  • 오른쪽 피연산자로 나누고 남은 나머지를 반환한다.
  • 나누는 피연산자는 0이 아닌 정수만 허용한다.
  • 부호는 무시된다.

비교 연산자와 문자열의 비교

비교 연산자

  • 두 피연산자를 비교해서 true(참) 또는 false(거짓)를 반환한다.

문자열의 비교

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

  • equals : 비교하고자 하는 두 피연산자의 값 자체를 비교한다.
  • == : 비교하고자 하는 두 피연산자의 주소값을 비교한다.
  • 문자열 비교에는 == 대신 equals()를 사용해야 한다.

논리 연산자와 비트 연산자

논리 연산자

비트 연산자

  • 비트 연산자는 값을 비트 단위로 연산한다.
  • 따라서 0과 1로 표현이 가능한 정수형이나 형변환이 가능한 자료형만 연산이 가능하다.

<2진수의 음수표현>

진수의 음수를 표현하는 방식에는 부호 절대값, 1의 보수, 2의 보수가 있다.

  • 8비트 기준으로 설명

부호 절대값

  • 가장 왼쪽에 있는 비트를 부호비트라고 했을 때 이 부호비트가 '0인지 1인지' 에 따라 양수, 음수로 구분된다.

0일때는 양수 , 1일때는 음수

  • 2진수 00000011 = 10진수: 3
  • 2진수 10000011 = 10진수: -3

1의 보수

  • 1의 보수는 11111111 - x 를 하는 방식이다.
  • 11111111 - x 는 x 를 반전시킨 것과 같다.

11111111 - 00101001 = 11010110
즉, 1이면 0, 0이면 1이 된다.

-13을 1의 보수 방식으로 표현해 보겠다.
1. 13을 2진수로 표현 : 00001101
2. 11111111 - x 공식에 대입
3. 결과 : 11110010

2의 보수

  • 가장 많이 사용하는 방식이다.
  • 2의 보수는 100000000 - x 를 하는 방식이다.
  • 2의 보수 방식도 가장 왼쪽숫자0일 경우 양수, 1일 경우 음수를 표현한다.

-13을 2의 보수 방식으로 표현해 보겠다.
1. 13을 2진수로 표현 : 00001101
2. 100000000 - x 공식에 대입
3. 결과 : 11110011

  • 쉽게 계산하는 방법은 1의 보수를 구한뒤에 나온수에 +1을 하면 된다.

-9를 2의 보수 방식으로 표현해 보겠다.
1. -9를 1의 보수 방식으로 표현 : 00001001(9) -> 11110110
2. 11110110 + 1
3. 결과 : 11110111

조건 연산자와 대입 연산자

조건 연산자

삼항 연산자 : 조건식 ? 반환값1 : 반환값2

  • 조건식의 결과에 따라 연산결과를 달리할 수 있다.

대입 연산자

0개의 댓글