학습한 내용을 정리한 포스팅입니다. 직역된 부분이 있어 어색할 수 있습니다. 틀린 부분이 있다면 언제든 지적 해주시면 감사하겠습니다. 🙇🏻♀️
간단요약: The basic difference is that primitive variables store the actual values, whereas reference variables store the addresses of the objects they refer to.
프리미티브 타입에는 앞에서 본 것 처럼 boolean, byte, char, short, int, long, float, double이 있다. 이 외 타입은 모두 레퍼런스 타입이다.
프리미티브 타입 변수는 선언될 때 하나의 밸류만 저장되고 디폴트 값으로 초기화 된다.
레퍼런스 타입은 컴퓨터 메모리 안의 객체의 위치를 저장한다.
Type | Size(byte) | Size(bits) | Minimum | Maximum | etc | default value |
---|---|---|---|---|---|---|
byte | 1 | 8 | -128 | 127 | - | 0 |
short | 2 | 16 | -32768 | 32767 | - | 0 |
int | 4 | 32 | -2147483648 | 2147483647 | - | 0 |
long | 8 | 64 | -2⁶³ | 2⁶³-1 | - | 0 |
float | 4 | 32 | -2⁻¹⁴⁹ | (2-2⁻²³)*2¹⁰²³ | - | 0.0f |
double | 8 | 64 | -2⁻¹⁰⁷⁴ | (2-2⁻⁵²)*2¹⁰²³ | - | 0.0d |
char | 4 | 16 | 0 | 2¹⁶-1 | - | '\u0000' |
boolean | Not precisely defined | 1 | - | - | true/false | false |
변수에 할당 될 수 있는 변하지 않는 값을 리터럴이라고 부른다.
예시)
int x = 100;
여기에서 100이 리터럴이다.
byte, short, int, long 같은 데이터 타입을 4가지로 나눠 볼 수 있다.
//Decimal literals
int x = 101;
//Octal literals: 0으로 시작해야 한다(prefix)
int x = 0146;
//Hexa-decimal literals: hexa-decimal number가 prefix로 있어야 한다.
int x = 0X123Face;
//Binary literals
int x = 0b1111;
Floating-point 데이터 타입을 위해 10진법의 형태로 특정할 수 있지만 8진법이나 16진법의 형태로는 특정할 수 없다.
- Decimal literals
double d = 123.456;
char 타입은 아래 예시와 같이 4가지 방법으로 리터럴을 특정 할 수 있다.
char ch1 = 'a';
char ch2 = 062;
char ch3 = '\u0061'; //여기서 \u0061는 'a'를 나타낸다.
char ch4 = '\n';
쌍따옴표("")로 묶임 문자들을 String 리터럴로 본다.
String s = "Hello World!";
true, false만 boolean 리터럴이 있다.
(출처 - geeks for geeks)
위의 그림처럼 변수를 선언하기 위해서는 데이터 타입(예시: int)과 데이터 이름(예시: count)이 필요하다.
이렇게 변수를 선언했을 때는 메모리의 위치만 주어지게 된다. 할당을 하기 위해서는 두 가지 방법이 있는데 1. Variable Initialization(변수 초기화)
2. Assigning value by taking input(인풋을 통한 값 할당)
이 그 두가지 방법이다.
이어서 변수를 초기화 하기 위해서는 3가지 요소가 필요하다.
변수가 선언됨에 지정되는 기본 값은 위의 Primitive Type 종류와 값의 범위 그리고 기본 값 - default Value
부분을 확인하자
클래스 안에서 선언되는 변수(하지만 메소드 밖이어야 한다)이며 클래스 안에서 어디서든 접근할 수 있다.
아래의 예에서 클래스 안에서 선언된 모든 변수들은 멤버 변수이다.(count와 name)
public class Test {
int count;
private String name;
void method1(){
...
}
}
클래스 내에서 멤버 변수에 접근하는 건 스코프의 영향을 받지 않는다.
클래스 밖에서 멤버 변수에 대한 접근은 아래의 규칙에 따른다.
Modifier | Package | Subclass | world |
---|---|---|---|
public | Yes | Yes | Yes |
protected | Yes | Yes | No |
Default(no modifier) | Yes | No | No |
private | No | No | No |
지역변수는 메소드 안에서 선언되며 메소드 밖에서는 접근할 수 없다(메소드 레벨 스코프를 갖는다).
아래의 예에서 x,y는 지역변수이다.
public class Test {
void method1(){
int x;
int y;
}
}
지역변수는 메소드 실행이 끝나면 더이상 존재하지 않는다.
데이터 타입에 대한 비트 크기는 아래와 같다.
두 데이터 타입을 자동으로 변환하는 것으로
자바에서는 숫자 타입들은 서로 Compatible하지만 숫자 타입에서 char나 boolean 타입으로 자동 변환되지는 않는다. char, boolean은 서로 compatible하지 않다.
큰 데이터 타입의 값을 작은 데이터 값을 할당할 때 축소변환이나 캐스팅.
Evaluating expressions 할 때, 결과는 큰 데이터 타입으로 자동으로 업데이트된다. 하지만 그 결과를 작은 데이터 타입에 저장하려고 하면 컴파일 에러가 발생한다.(타입 캐스팅이 필요하기 때문에)
같은 타입의 여러 변수들을 하나의 묶음으로 다루는 것.
배열의 인덱스는 0부터 시작하기 때문에 마지막 인덱스는 '배열의 길이 - 1' 이다.
배열은 아래와 같이 선언한다.
type var-name[];
or
type[] var-name;
ex)
int[] count;
or
int count[];
다차원 배열은 배열의 배열
이라고 정의할 수 있다. 다차원 배열 중 2차원 배열은 다차원 배열 중에 가장 간단한 배열이라고 할 수 있다.
선언하는 방법
int[][] arr = new int[10][10];
초기화 하는 방법
arr[0][0] = 1;
타입 추론은 일반적으로 컴파일 될 때 자동으로 변수의 데이터 타입을 추론 하는 것을 말한다.
지역변수의 타입 추론은 자바 10의 기능으로 개발자가 지역변수와 관계된 타입 선언을 스킵하는 것을 가능하게 하고 컴파일러는 변수의 데이터 타입을 알아 낸다.
var는 자바 10에서 등장했다. var 키워드에서 타입 추론이 사용되어 콘텍스트에 따라 변수의 데이터 타입을 자동으로 알아낸다.
class VarExample {
public static void main (String[] args) {
var x = 100; //int
var y = 1.98; //double
var z = 'a'; //char
var a = "abc"; //string
var b = false; //boolean
}
}
var
키워드로 선언할 수 있다.var
가 쓰일 수 있다.var
가 쓰일 수는 없다.https://www.baeldung.com/java-primitives
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
https://stackoverflow.com/questions/8790809/whats-the-difference-between-primitive-and-reference-types
https://www.oreilly.com/library/view/javatm-how-to/9780133813036/ch03lev2sec25.html
https://www.geeksforgeeks.org/literals-in-java/
https://www.geeksforgeeks.org/variables-in-java/
https://www.geeksforgeeks.org/type-conversion-java-examples/
https://www.geeksforgeeks.org/var-keyword-in-java/?ref=gcse