Difference between revisions of "컴퓨터프로그래밍및실습 (2022년)/0908"

From DISLab
Jump to navigation Jump to search
Line 144: Line 144:
==== 산술 연산자 ====
==== 산술 연산자 ====
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
byte byte1 = 1;
byte byte2 = 1;
byte byte3 = byte1 + byte2; // 오류. 정수 타입의 산술 연산은 32비트인 int로 형변환됨
int result1 = byte1 + byte2; // OK
int int1 = 10;
int int2 = 4;
int result2 = int1 / int2;  // 2
double result3 = int1 / int2; // 2.0
double result4 = (double) int1 / int2; // 2.5
char c1 = 'A' + 1; // OK 'B'
char c2 = 'A';
char c3 = c2 + 1; // 컴파일 에러. c2가 int로 형변환됨
</syntaxhighlight>
===== 오버플로우 =====
<syntaxhighlight lang="java">
int x = 1000000;
int y = 1000000;
int z = x * y; // z에는 오버플로우되어 -727379968와 같이 알 수 없는 값이 저장됨
//-------------
long x = 1000000;
long y = 1000000;
long z = x * y; // OK
</syntaxhighlight>
===== 정확한 계산은 정수 사용 =====
<syntaxhighlight lang="java">
int apple = 1;
double priceUnit = 0.1;
int number = 7;
double result = apple - number * priceUnit; // 0.3이 되어야 할 것 같지만
System.out.println(result); // 0.29999999999999993
</syntaxhighlight>
</syntaxhighlight>



Revision as of 20:52, 19 July 2022

연산자

연산자와 연산식

연산자 종류 연산자 피연산자 수 산출값 기능 설명
산술 +, -, *, /, % 이항 숫자 사칙연산 및 나머지 연산 2 + 3
부호 +, - 단항 숫자 음수와 양수의 부호 -2
문자열 + 이항 문자열 두 문자열을 연결 "abc" + "def"
대입 =, +=, -=, *=, /=, %=, &=
^=, !=, <<=, >>=, >>>=
이항 다양 우변의 값을 좌변의 변수에 대입 i += 3
증감 ++, -- 단항 숫자 1만큼 증가/감소 i++
비교 ==, !=, >, <, >=, <=
instanceof
이항 boolean 값의 비교 i > j
논리 !, &, |, &&, | | 단항
이항
boolean 논리적 NOT, AND, OR 연산 !(a < 3), (a < 3) && (a > 1)
조건 (조건식) ? A : B 삼항 다양 조건식에 따라 A 또는 B 중 하나를 선택 a = (x > y) ? x : y
비트 ~, &, |, ^ 단항
이항
숫자
boolean
비트 NOT, AND, OR, XOR 연산 ~a, a & b
쉬프트 >>, <<, >>> 이항 숫자 비트를 좌측/우측으로 밀어서 이동 a >> 3

연산의 방향과 우선순위

x > 0 && y < 0 // 어떤 순으로 연산될 것인가?

v1 = 100 * 2 / 3 % 5; // v1 = (((100 * 2) / 3) % 5)

a = b = c = 5; // (a = (b = (c = 5)));
  • 연산자 우선순위
연산자 연산 방향 우선 순위
++, --, +, -, ~, ! 높음
*, /, %
+, -
<<, >>, >>>
<, >, <=, >=, instanceof
==, !=
&
^
|
&&
| |
? :
=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= 낮음

int var1 = 1;
int var2 = 3;
int var3 = 2;
int result = var1 + var2 * var3;

int result = (var1 + var2) * var3;

단항 연산자

부호 연산자

int i1 = +100;  // 부호 + (양수)
int i2 = -100;  // 부호 - (음수)
double d1 = +3.14;

int x = -100;
int result1 = -x; // OK

short s1 = 100;
short s2 = -s1; // 오류. 정수 연산은 int로 바뀌기 때문
int i3 = -s1; // OK

증감 연산자(++, --)

++i;
i++;

--i;
i--;

//------------------
int x = 10;
int z;

z = ++x;

// 위 코드는 아래와 동일
x = x + 1;
z = x;

//-------------------
int x = 10;
int z;

z = x++;

// 위 코드는 아래와 동일
z = x;
x = x + 1;

//------------------
int x = 10;
int z;

z = --x;

// 위 코드는 아래와 동일
x = x - 1;
z = x;

//-------------------
int x = 10;
int z;

z = x--;

// 위 코드는 아래와 동일
z = x;
x = x - 1;

논리 부정 연산자 !

boolean play = true;

play = !play;

비트 반전 연산자 ~

byte v1 = 10; // 00001010
byte v2 = ~v1; // 오류. 정수 종류의 연산은 자동으로 int로 변환됨

int i2 = ~v1; // OK. 11111111 11111111 11111111 11110101

int i3 = ~v1 + 1; // -10 (2의 보수)

System.out.println( Integer.toBinaryString(i3) );

이항 연산잔

산술 연산자

byte byte1 = 1;
byte byte2 = 1;
byte byte3 = byte1 + byte2; // 오류. 정수 타입의 산술 연산은 32비트인 int로 형변환됨

int result1 = byte1 + byte2; // OK

int int1 = 10;
int int2 = 4;
int result2 = int1 / int2;  // 2
double result3 = int1 / int2; // 2.0

double result4 = (double) int1 / int2; // 2.5

char c1 = 'A' + 1; // OK 'B'
char c2 = 'A';
char c3 = c2 + 1; // 컴파일 에러. c2가 int로 형변환됨
오버플로우
int x = 1000000;
int y = 1000000;

int z = x * y; // z에는 오버플로우되어 -727379968와 같이 알 수 없는 값이 저장됨

//-------------

long x = 1000000;
long y = 1000000;

long z = x * y; // OK
정확한 계산은 정수 사용
int apple = 1;
double priceUnit = 0.1;
int number = 7;

double result = apple - number * priceUnit; // 0.3이 되어야 할 것 같지만

System.out.println(result); // 0.29999999999999993

문자열 연결 연산자 (+)

비교 연산자

논리 연산자

비트 연산자

대입 연산자


삼항 연산자

조건문

반복문