1. 증감 연산자
- 증가 연산자 ++ : 피연산자의 값을 1 증가시킨다.
- 감소 연산자 - - : 피 연산자의 값을 1 감소시킨다.
- 증감 연산자가 독립적으로 사용된 경우 전위 연산자와 후위 연산자의 차이는 없다.
타입 | 설명 | 사용 예 |
전위형 | 값이 참조되기 전에 증가한다. | j = ++i; |
후위형 | 값이 참조된 후에 증가한다. | j = i++; |
매우 중요!!!!! 증감 연산자가 독립적으로 사용된 경우, 전위형과 후위형의 차이가 없다.
- 만약 증감 연산자가 포함된 식을 이해하기 어려울 때는(나처럼) 다음과 같이 증감 연산자를 따로 떼어내면 이해하기 쉬워진다.
// 전위형
j = ++i; // 이처럼 전위형인 경우 ++를 위로 떼어내서
============>
++i;
j =i; // 로 바꿔준다.
-----------------------------------------------------------
// 후위형
j = i++; // 후위형인 경우 ++를 아래로 떼어내서
============>
j = i;
i++ // 로 바꿔준다.
아래처럼 생각해보자
static void front() {
int i=5;
int j=0;
// 전위형 j = ++i; 전위형은 아래와 같이 바꿔서 생각하자
i++;
j = i;
System.out.println("j=++i 실행 후, i=" + i + ", j=" + j);
}
static void back() {
int i=5, j=0;
// j = i++; 후위형은 아래와 같이 바꿔서 생각하자
j = i;
i++;
System.out.println("j=i++ 실행 후 , i=" + i +", j="+j);
}
- 결국 증감 연산자에서 포인트는++ — 기호들이 앞에 붙었는가 뒤에 붙었는가 확인하는 것.
- 그리고 그 후에 증감하고 대입을 하는지, 대입하고 증감을 계산하는지 고려해야함
2. 부호 연산자
'-' 는 피연산자의 부호를 반대로 변경
'+'는 아무런 일도 하지 않는다(실제 사용X)
- 형변환 연산자 : 위 4가지가 기본, 아래 3가지는 추가로 알아두어야 할 것.
변환 | 수식 | 결과 |
int -> char | (char)65 | 'A' (아스키코드 문자표에 의해 변환) |
char -> int | (int)'A' | 65(아스키코드 문자표에 의해 변환) |
float -> int | (int)1.6f | 1 |
int -> float | (float)10 | 10.0f |
Integer.pareInt(문자열) | 이때 문자열에 오는 값은 반드시 숫자형의 문자열이여야 함 | 문자열 -> 숫자 |
문자 -> 숫자, 숫자->문자 | + '0', -'0' => 각각 문자 0을 더하거나 뺌 | 문자->숫자, 숫자->문자 변환 |
문자열.CharAt(0) | "string".CharAt(int) | 제시된 문자열에서 n번째 문자를 출력 |
3. 형변환 연산자
- 형 변환이란 변수 또는 산수의 타입을 다른 타입으로 변환 하는 것.
- 전에 설명했던 '문자열'→ '문자' 로 변환, '문자'→ '숫자'로 변환하는 것이 이에 포함됨?
- 형 변환 방법
- (type)피연산자
double d = 9.09;
int score = (int)d; // 여기서 (int)d 를 적어 넣은게 형변환, 아래 순서에 따라 변환 됨
-> int score = (int)9.09;
-> int score = 9;
4. 자동 형변환
- float f = 1234; // int 타입의 값을 float 타입의 변수에 저장
- 1234는 int 형인데 float 타입에 저장이 가능한가? ⇒ O, 가능함.
- 사실 원래는 float f = (float)1234 라고 작성하여 직접 형변환을 해주어야하나, 지금과 같은 경우 Java 컴파일러에서 자동 형변환을 시켜줌
- int i = 3.14f; // float 타입의 값을 int 타입의 변수에 저장
- 3.14f 는 float 형인데 int 타입에 저장이 가능한가? ⇒ X, 불가능함
- 정확히는 형 변환 없이는 불가능함 == 자동 형변환이 안됨. 이러한 경우 int i =(int)3.14f 로 직접 형 변환을 시켜주어야 함
즉, 자동 형변환이 되고 안되고의 차이는 타입의 크기가 큰지 작은지에 따라 구분된다.
⇒ 정확히는 작은 타입의 값에서 큰 타입으로 넘어가는 경우에는 값 손실이 없음으로 자동으로 형 변환되지만, 큰 쪽에서 작은 쪽으로 넘어가는 경우는 값 손실이 발생할 가능성이 높기 때문에 자동 형변환 되지 않는다.
- float 의 경우 int 보다 큰 타입이기 때문에 float에 int 타입의 값을 넣었을 때 자동으로 형 변환됨.
- 마찬가지로 String 타입은 char 타입보다 크기 때문에 String 에 char 타입의 값을 넣었을때도 자동으로 형 변환됨 ⇒ String str = "a" 라고 넣었을 때 오류가 없음.
float f = 1234; // 자동 형변환
int i = (int)1234.1234 // 자동 형 변환 불가, 수동으로 넣어야함.
String s = "s"; // Char 타입의 문자를 String 이라는 문자열에 넣어도 무방 -> 자동형변환
// byte -> int
byte b = 10;
int i = b; // byte보다 int가 더 큰 타입, 생략가능 => 자동형변환
// int -> byte
int i2 - 300;
byte b2 = (byte)i2; // 자동 형변환 불가, 생략 불가능
- 사칙 연산자
- 기본 사칙 연산자는 4가지 : + - * /
- int + int = int, int * int = int // float + float = float
- 이때 사칙 연산은 연산 전에 피연산자의 타입을 일치시키는 산술 변환 규칙을 따른다. 산술 변환에는 아래 2가지 규칙이 있다.
- 큰 타입과 작은 타입을 연산하는 경우 자동으로 작은 형이 큰 타입으로 변환되어 연산 된다.
- 피 연산자의 타입이 int 보다 작은 타입이면 int로 변환된다.
- byte + short → int + int → int ⇒ byte 와 short 는 int 보다 작은 타입임으로 int 로 변환
- char + short → int + int → int ⇒ char 과 short 는 int 보다 작은 타입임으로 int 로 변환기본적으로 사칙연산은 같은 타입끼리만 연산 가능함.
int a = 15;
float b = 3.3f;
System.out.println(a/b); // 따로 형변환 하지 않아도 int 가 float 로 변환됨
System.out.println((float)a/b); // 이런 식으로 해도 상관 없음
char o = '0';
char e = '2';
System.out.println(e-o); // 결과 : 2 => char는 int 보다 작은 타입임으로 int 타입으로 변환 후 계산됨
5. 아스키 코드
아스키 코드는 컴퓨터 내부에서 문자를 표현하는 표준적인 코드 체계로 7비트로 구성되어 있으며 자료 처리나 통신 장치에서 표준적인 코드로 널리 쓰인다고 한다.
사실 배경...이나 이런 것은 크게 알 필요 없고, 쉽게 이야기하자면 어떤 문자에 대하여 2진수, 10진수, 16진수 등으로 표현하여 컴퓨터가 인식 할 수 있게 하는 '기준 표'라고 생각하면 편할 듯하다.
이전 글이나 본 글에서도 보였던 문자 '0이 10진수 숫자 48로 변환되거나, 문자 'A'가 10진수 65로 표현되는 부분에서 잠깐씩 사용되었던 것이 바로 이 아스키 코드이다.
아스키 코드를 전부 다 기억할 필요는 없어보인다. 물론, 머리가 좋아서 외운다면 Java , C 등등 어떤 언어에서도 좋겠지만, 굳이...라는 생각이 든다.
그래서 대부분의 사람들이 추천하기를 문자 '0', 문자 'A', 문자 'a' 이 3가지만 기억하라고 한다. 이는 문자 0부터 9까지 순서대로 1씩 증가하며, 문자 A ~ Z , a ~ z 도 마찬가지로 1씩 증가하기 때문이다.
따라서 '0' = 48, 'A' = 65 , 'a' = 97 3가지만 기억하자!!
추가로 이전 글에서 문자→숫자로 변환 할 때 문자 '0'을 빼는 이유도 이 아스키 코드에 따른 것이다.
아스키 코드에 따르면 문자 '1'= 49 이다.
이때 문자 '0'=48 을 빼게되면,
char 형태의 문자 '1'과 0은 은 더 큰 타입인 int 로 변환되고 아스키 코드에 따라 각각 49 와 48로 변환된다.
결과적으로 '1' -'0' = 49 - 48 = 1 요런 식으로 바뀌어 결과값으로 숫자 1이 출력된다.
즉, 문자 '0'를 빼는 것으로 인해서 결과값으로 문자 '1' 이 숫자 int 1 로 바뀌는 것이다.
신기하고 오묘한 코딩의 세계!!!
'Java - 기본기' 카테고리의 다른 글
Java 입출력(I/O), 스트림(Stream), 버퍼(Buffer) 개념 및 사용법 (2) | 2021.09.26 |
---|---|
5. 반올림-Math.round(), 비교, 조건, 논리, 대입, 복합 대입 연산자 (0) | 2021.09.16 |
3. Scanner 사용, 정수형 오버플로우, 타입 간 변환, 연산자와 종류 (0) | 2021.09.09 |
2. 변수 다루기 - 기본형 심화, printf 를 이용한 출력, 입력 받기 (1) | 2021.09.02 |
1. 변수와 변수 타입 (3) | 2021.08.28 |
댓글