Java - 기본기

4. 증감 연산자, 부호 연산자, 형변환 , 자동 형변환 + 아스키코드

TerianP 2021. 9. 13.
728x90

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; // 자동 형변환 불가, 생략 불가능

 

  1. 사칙 연산자
  • 기본 사칙 연산자는 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 로 바뀌는 것이다.
신기하고 오묘한 코딩의 세계!!!

 

댓글