Java 변수 타입

sycho·2023년 9월 13일
0

Java

목록 보기
3/18

변수 타입

  • 기본형과 참조형으로 나뉘어진다.

  • 기본형은 총 8개다 : byte, short, int, long, float, double, char, boolean

  • 나머지는 전부 참조형이며, class의 이름을 활용해 선언된다.

  • 기본형의 타입은 선언시 사용한 이름이다.

  • 참조형의 타입은 선언시 사용된 class의 이름이다.

  • 기본형은 값 자체가 저장되어 있다.

  • 참조형은 주소값이나 null이 저장되어 있다.

  • 주소값은 JVM이 32bit 기반이면 4byte, 64bit 기반이면 8byte다.

  • 각 기본형의 bit크기 및 나타내는 범위

constant

  • final을 사용해서 선언.
  • 한번 값이 정해지면 다른 값으로 변동이 불가.
  • 무조건 선언과 동시에 초기화 해야 한다.
final int MAX_BUDGET = 5000;
  • 용도는 C의 매크로 활용법과 유사하다. (코드의 가독성을 증진)
final int BASE_WIDTH = 20;
final int BASE_HEIGHT = 10;

int newFieldArea = BASE_WIDTH * BASE_HEIGHT;

literal

  • 본인 자체가 값인 statement.
  • 타 언어는 보통 이걸 constant라고 부르지만 Java에선 앞에 소개한 의미로 이미 쓰여서 이 이름을 가지게 됨.

숫자 literal

  • 정수 literal의 경우 long인 literal을 만들거면 L/l을 숫자 뒤에 붙인다.
long i = 1L;
  • 실수 literal의 경우 floatdouble이냐에 따라 접미사 fd를 숫자 뒤에 붙인다.
float i = 1.0f;
double j = 1.0d;
  • 정수 literal의 경우 2진수, 8진수, 16진수를 사용하는게 가능하다. 각각 0b, 0, 0x/0X을 숫자 앞에 붙이면 된다.
int octNum = 010; // 8
int hexNum = 0x10; //16
int binNum = 0b10; //2
  • JDK 1.7 이후에선 literal 중간에 _을 넣어 숫자 구별을 할 수 있도록 해준다.
long a = 100_000_000; //100000000
  • 접미사가 없는 정수는 int literal, 접미사가 없는 실수는 double literal로 취급한다.

  • byte, short literal을 위한 접미사는 없어서, int literal을 사용한다.

short a = 1; //OK
byte b = 2; //OK
byte c = 384; //Overflow(Gives Error)
  • 실수 literal의 경우 10의 제곱 형태 표현이 가능하다. e를 활용
double a = 3.0e8;
  • 실수 literal의 경우, 16진수 기반으로 실수를 쓰고 싶으면 p를 쓰면 된다. 이때 p2의 제곱을 나타낸다는 점 참고.
double 0x0.2p-1; //0.0625

타입 불일치 오류 기준

  • 기본적으로 변수 타입이랑 같은 타입의 literal을 저장해야 한다.

  • 단, 숫자의 경우 변수의 타입보다 작은 범위를 나타내는 타입의 literal이 들어가는 것은 상관이 없다.

double d = 3.14f; //OK
  • 숫자의 경우 변수의 타입보다 큰 범위를 나타내는 타입의 literal이 들어가면 오류를 일으킨다.
float f = 3.14d; //Error

문자, 문자열 literal

  • 문자는 '로, 문자열은 "로 감싼다.
char a = 'J';
String b = "Jet";
  • 문자는 안이 비어있으면 안된다. 문자열은 안이 비어있어도 된다.
char a = ''; //error
String b = ""; //OK
  • 문자 literal은 여러개의 문자로 구성되어서는 안된다.
char a = 'ab'; //error
  • 문자열은 사실 클래스다. 이 때문에 실제로 위의 String b의 경우 사실 참조형 변수다. 참조형은 주소값으로 초기화가 되어야 하지만 String은 특별히 위와 같이 할당하는 것도 허용해준다는 점 참고.

  • 문자열끼리 덧셈시 둘을 concatenate한다.

String anme = "My" + "Love"; //MyLove
  • 덧셈의 피연산자 중 하나만 String인 경우, 다른 하나를 String으로 변환 후 더한다. 나오는 결과도 String이다.

  • 숫자와 문자열을 더할 경우 숫자의 십진법상 표기가 그대로 String으로 변환되고 더해진다. e나 8, 16진법 등은 다 10진법에 맞게 변환되고 String으로 변환된다.

String a = 10e1 + "hi"; //10hi
  • boolean과 문자열을 더할 경우 true였으면 "true"와 같은 형태로 변환. 참조형의 경우 주소값 자체가 String이 되며 null"null"이 된다.
String a = true + "hi"; //truehi
  • Java의 char은 C와 다르게 16bit이며, 기본적으로 숫자 취급이 아니라는 점에 유의하자. 참고로 Java의 byte는 C의 char처럼 8bit이면서 숫자로 표현이 되지만, C랑 다르게 문자로 취급이 안된다.

  • Java의 char이 16bit인 이유는 유니코드 전체를 저장할 수 있도록 하기 위해서다.

  • Java의 char은 숫자로 변환이 가능하지만, C의 unsigned short랑 같은 범위를 가진다. C의 short랑 같은 범위를 가지는 Java의 숫자 type은 short이다.

  • char 간의 덧셈은 정수간의 덧셈으로 취급된다.

System.out.println('A'+'B'); //131
  • char과 정수간의 덧셈은 정수간의 덧셈으로 취급된다.
System.out.println('1' + 2); //51
  • charString간의 덧셈은 String간의 덧셈으로 취급된다. char이 문자가 하나인 String으로 취급된다.
System.out.println('I' + " love C?"); //I love C
profile
안 흔하고 싶은 개발자. 관심 분야 : 임베디드/컴퓨터 시스템 및 아키텍처/웹/AI

0개의 댓글