본문 바로가기
진행중인 학습/자바의 정석_학습

자바의 정석_기초편 CHAPTER 3 中 [1 ~ 8] (230728)

by 트레비봄 2023. 7. 28.
728x90
자바의 정석_기초편 Chapter 3 中 [1 ~ 8] (230728, 금)

3-1. 연산자와 피연산자.

연산자 : 연산을 수행하는 기호.

(EX. +  : 덧셈 연산 수행, 덧셈  연산자 라고 부름)

 

x + 3 에서 'x' 와 '3' 은 피연산자, '+' 는 연산자 이다.

y = 4 * x + 3; // x의 값이 5라면, y의 값은 23이 된다.
System.out.prinln(y) // y의 값이 23이 화면에 출력된다.

System.out.println(4 * x + 3); // x의 값이 5라고 가정하면
System.out.println(23);

3-2. 연산자의 종류.

종류 연산자 설명
산술 연산자 + - * / % << >> 사칙 연산과 나머지 연산 (%)
비교 연산자 > < >= <= == != 크고 작음과 같고 다름을 비교
논리 연산자 && || ! & | ^ ~ '그리고(AND)'와 '또는(OR)' 으로 조건을 연결
대입 연산자 = 우변의 값을 좌변에 저장
기타 (type) ?: instance of 형변환 연산자, 삼항 연산자, instanceof연산자

&& : 그리고 (and) 

|| : 또는 (or).

! : 반대의 의미.부정의 의미.

(type) : 형변환.

?: : 삼항 연산자.

3-3. 연산자의 우선순위

" 하나의 식(expression) 에 연산자가 둘 이상 있을 때, 어떤 연산을 먼저 수행할지를 자동 결정하는 것 "

 

설명
-x+3 단항 연산자가 이항 연산자보다 우선순위가 높음. x의 부호를 바꾼 다음 덧셈이 수행.
여기서 ' - ' 는 뺄셈 연산자가 아니라 부호 연산자이다.
x + 3 * y 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다.
그래서 '3 * y'가 먼저 계산된다.
x + 3 > y - 2 비교 연산자(>) 보다 산술 연산자 ' + '와 ' - '가 먼저 수행.
그래서 'x + 3' 과 'y - 2' 가 먼저 계산된 다음 '>' 가 수행된다.
x > 3 && x < 5 논리 연산자 '&&' 보다 비교 연산자가 먼저 수행.
그래서 'x > 3'와 'x < 5' 가 먼저 계산된 다음 '&&' 가 수행된다.
식의 의미는 'x가 3보다 크고 5보다 작다' 이다.
result = x + y * 3; 대입 연산자는 연산자 중에서 제일 우선순위가 낮다.
그래서 우변의 최종 연산결과가 변수 result에 저장된다.

3-4. 연산자의 결합 규칙

" 대입과 단항 연산자를 제외하면, 모두 왼쪽 -> 오른쪽 방향이다. "

연산자의 우선순위와 결합법칙은 아래의 3가지만 기억!!

1. 산술 > 비교 > 논리 > 대입 순.

- 대입은 제일 마지막에 수행된다.

2. 단항(1) > 이항(2) > 삼항(3) 순.

- 단항 연산자의 우선순위가 이항 연산자보다 높다.

3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽이다.

3-5 : 증감연산자.

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

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

타입 설명 사용 예
전위형 값이 참조되기 전에 증가시킨다. j = ++i;
후위형 값이 참조된 후에 증가시킨다. j = i++;

피연산자의 왼쪽에 위치하면 ' 전위형 (prefix) '

피연산자의 오른쪽에 위치하면 ' 후위형 (postfix) '.

 

단, 증감연산자가 수식이나 메소드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이는 없다.

++i; // 전위형. i의 값을 1 증가시킨다.

i++; // 후위형. 위의 문장과 차이가 없다.

3-6. 부호연산자

부호 연산자 ' - ' 는 피연산자의 부호를 반대로 변경한 결과를 반환한다.

즉, 음수면 양수, 양수면 음수가 연산의 결과가 됨.

부호 연산자 ' + ' 는 하는 일이 없고, 쓰이는 경우도 드뭄.

부호 연산자는 boolean형, char형을 제외한 기본형에서만 사용 가능하다.

3-7 : 형변환 연산자 

형변환이란??

변수 또는 상수의 타입을 다른 타입으로 변환하는 것.

 

(타입) 피연산자

(괄호) 는 '캐스트 연산자' 또는 '형변환 연산자' 라고 하며, 형변환을 '캐스팅(casting)' 이라고도 한다.

 

double d = 85.4;

int score = (int)d;

int score = (int)d; -> int score = (int)85.4; -> int score = 85;

이 과정에서 알 수 있듯이, 형변환 연산자는 타입을 변환한 그 결과값 반환이 끝이다.

 

변환 수식 결과
int -> char (char)65 'A'
char -> int (int)'A' 65
float -> int (int)1.6f 1
int -> float (float)10 10.0f

3-8. 자동 형변환.

float f = 1234; // float f = (float)1234; 에서 (float) 가 생략.

우변은 int 타입의 상수, 이 값을 저장하려는 변수의 타입은 float 이다.

서로 타입이 달라 형변환이 필요하지만 편의상 생략.

float 타입의 변수는 1234 라는 값을 저장하기에 문제가 없어서 가능.

 

그러나 변수가 저장할 수  있는 값의 범위보다 더 큰 값을 저장하려는 경우에 형변환을 생략하면 에러가 발생.

byte b = 1000; // 에러 발생. byte타입의 범위 (-128 ~ 127)를 벗어난 값의 대입.

' incompatible types:possible lossy conversion from int to byte ' 라는 에러메세지가 뜬다.

큰 타입에서 작은 타입으로의 형변환은 값 손실이 발생할 수 있다는 뜻.

byte b = (byte)1000; // ok. 그러나 값 손실이 발생해서 변수 b에는 -24 가 저장됨.

형변환을 하는 이유는 주로 서론 다른 두 타입을 일치시키기 위해서인데, 형변환을 생략하면 컴파일러가 알아서 자동적으로 형변환을 한다.

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

byte -> int 는 형변환 생략가능.

int -> byte 는 형변환 생략이 불가하다. 직접 형변환 해야함 : (byte)~~;

표현범위가 좁은 타입에서 넓은 타입으로 형변환 하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환된다.

위 그림은 7개의 기본형*형변환가능 을 왼쪽부터 오른쪽으로 표현할 수 있는 값의 범위가 작은 것부터 큰 것의 순서로 나열한 것이다.

화살표 방향으로의 변환, 즉 좌측에서 우측으로의 변환은 자동 형변환이 가능, 그 반대방향은 반드시 형변환 연산자 사용.

 

230728 학습.

 

 

 

 

 

 

 

728x90