변수의 종류는 클래스 변수, 인스턴스 변수, 지역 변수가 있다.
값 (Data)는 문자와 숫자, 논리(boolean)로 나눌 수 있다.
이 8개의 타입을 기본형이라고 한다. 데이터의 가장 기본이 되는 애들이란 뜻.
boolean, char, byte, short, int, long, float, double
(참고로, C언어에서 char 타입의 크기는 1byte. 자바에서 2바이트 유니코드를 사용하기 때문에 2바이트)
실수형의 타입을 선택할 때는 표현범위만 고려해서는 안되고, 정밀도를 함께 생각해야 한다. 어차피 float이나 double이나 10의 제곱 개념을 활용하기 때문에 표현 범위는 굉장히 크다.
그보다는 정확한 계산을 하기 위해 정밀도를 고려해야 하며, 그러한 경우엔 double을 사용하는 것이 좋다. 그래서 double이 디폴트 타입이다.
기본형을 제외한 나머지 (String, System 등). 기본형은 Java가 설계될 당시부터 8개로 정해져있지만, 참조형은 우리가 마음껏 만들어낼 수 있다.
참조변수는 객체의 주소를 저장하기 위한 것이다. (6장에서 자세히 배운다.)
Date today;
today = new Date();
참조 변수 이해 (vs 기본형)
참조 변수는 객체의 메모리 주소를 저장하는 변수이다. 기본형처럼 그 자체로 값이 아니다.
다시 말해서 기본형은 실제 값 자체를 메모리에 저장하지만, 참조형은 메모리 주소를 저장한다. 총 4 byte (32bit OS) 혹은 8 byte (64bit OS)의 메모리가 참조변수를 위해 할당되어 있다.
헷갈리지 말 것은, 가리킬 주소를 저장하는데 4 byte라는 것이므로 실제로 운용할 수 있는 메모리는 훨씬 크다는 거다.
32bit JVM에서는 참조변수(객체의 주소를 저장하는 변수)로 4 byte (32 bit)의 메모리 공간을 사용한다. 그래서 이러한 참조변수로 표현할 수 있는 메모리의 범위는 2^32 byte, 즉 4GB 정도이다.
또한 64bit JVM에서는 참조변수(객체의 주소를 저장하는 변수)로 8 byte (64 bit)의 메모리 공간을 사용한다. 그래서 이러한 참조변수로 표현할 수 있는 메모리의 범위는 2^64 byte, 즉 약 1600만 TB 정도이다.
상수의 정의: 변수이긴 한데, 한 번만 값을 저장 가능한 변수.
상수 선언 방법은 변수와 동일하다. 다만 변수 타입 앞에 final 이라는 키워드를 붙여야 한다.
final int a = 1; // 상수 선언 + 초기화
final int b; // 상수 선언
b = 3; // 상수 초기화
a = 2; // 다른 값 할당 -> 에러
예전에는 상수를 선언과 동시에 초기화했어야 했는데, 이제는 선언 따로 초기화 따로 가능.
리터럴이 사실 우리가 평상시 알고있는 상수이다. 즉, 그 자체로 값을 의미한다.
모든 값에는 타입이 있다. 따라서 리터럴에도 타입이 있다. (값=리터럴이니까 당연히..)
리터럴의 타입을 구분하는 법은.. 그냥 딱 보면 안다.
그러나 정수형과 실수형은 한 눈에 구분이 안되는 경우도 있기 때문에 접미사를 따로 붙인다.
정수형 중에 long 타입의 경우는 뒤에 L를 붙이고, 없으면 int 타입이다.
실수형은 float의 경우 f, double의 경우 d를 붙인다.
따라서 정리하면, 정수형에 붙이는 L과 실수형에 붙이는 f만 신경쓰면 된다.
(참고로 문자형의 \\n 는 개행문자인데, 그 자체로 하나의 문자로 인식)
쉽게 말해서 long 쓰고 싶으면 long 변수에 값 초기화할 때 L 붙이고,
float 쓰고 싶으면 float 변수에 값 초기화할 때 f 붙이라는 소리.
// 변수 타입과 리터럴 타입은 일치해야 한다
boolean power = true;
char ch = 'A';
String str = "ABC";
byte b = 127;
byte b = 128; // 에러. byte의 범위를 넘어섬
long sales2021 = 10_000_000_000L; // 만약 접미사 L을 붙이지 않으면 int로 인식하는데, long으로 선언했기 때문에 에러 발생
double d = 3.14d;// d 생략해도 됨
float f = 3.14f; // 만약 접미사 f를 붙이지 않으면 double로 인식하는데, float으로 선언했기 때문에 에러 발생
정수형 리터럴의 경우, 접두사를 붙여서 10진수가 아닌 8진수, 16진수 등으로 표현 가능하다.
int a = 0b0101; // 2진수
System.out.println(a); // 5
int b = 0100; // 8진수
System.out.println(b); // 64
int c = 0x100; // 16진수
System.out.println(c); // 256
double e = 3e3;
System.out.println(e); // 3000.0
일반적으로는 변수와 리터럴의 타입이 일치해야 한다.
그러나 반드시는 아니다.
데이터 손실이 없는, 표현 범위가 더 큰 쪽에서 작은 쪽으로는 가능하다.
int charTest = 'A';
System.out.println(charTest); // 65
문자는 char 타입의 변수, 문자열은 String에 담아야 한다.
char a = ‘A’; // ok
char b = 'AB'; // 에러. 하나의 문자만 가능
char c = ''; // 에러. 빈 문자 불가능
String aa = "ABC"; // ok
String bb = ""; // ok. 빈 문자열 가능
String은 원래 자바에서 제공하는 클래스이다. 문자열을 다룰 때 사용.
원래 클래스는 String s2 = new String(”AB”); 이런식으로 new 연산자를 써서 객체를 생성해야 하는데, 문자열은 워낙 자주 쓰이므로 String만 이렇게 변수처럼 사용할 수 있게 되었다.
String AA = new String("AA 스트링");
System.out.println(AA); // AA 스트링
String BB = "BB 스트링";
System.out.println(BB); // BB 스트링
문자열끼리 합치면 두 문자열이 결합된다.
문자열에 어떤 타입을 더하면 결과는 반드시 문자열이 된다.
이를 이용해서, 필요한 경우 숫자 → 문자열 변환을 쉽게 할 수 있다.
int number = 7;
String str = ""+number;
System.out.println(str); // "7"
System.out.println(str.getClass().getSimpleName()); // String
퀴즈1: “” + 7 + 7은?
→ 문자열 “77”이 된다.
퀴즈2: 7 + 7 + “”은?
→ 문자열 “14”가 된다.
해당 내용은 빈번히 사용되므로 외우면 좋다.
문자와 숫자간의 변환은 ‘0’ 을 더하거나 빼면 된다.
System.out.println('3' - '0'); // 3
System.out.println(3 + '0'); // 51 (유니코드 숫자)
System.out.println((char)(3 + '0')); // '3'
숫자 → 문자열
문자 → 문자열
System.out.println(3+""); // "3"
System.out.println('3'+""); // "3"
[자바의 정석 스터디] Ch3. 연산자/ Ch4. 조건문과 반복문 (0) | 2024.03.25 |
---|---|
[자바의 정석] (Ch.6 객체지향개념) 클래스 변수, 인스턴스 변수 (0) | 2023.09.28 |
[자바의 정석] (Ch6. 객체지향개념) 선언 위치에 따른 변수의 종류 (0) | 2023.09.26 |
[자바의 정석] (Ch6. 객체지향개념) 클래스의 정의 (0) | 2023.09.26 |
[자바의 정석] (Ch6. 객체지향개념) 클래스와 객체 (0) | 2023.09.26 |