2장. 자바 데이터 타입, 변수 그리고 배열
목표
자바 데이터 타입, 변수 그리고 배열에 대해 학습하세요. issue
학습할 것
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- boolean은 true와 false 두 값만 표현하면 되기에 1바이트면 충분하다.
- 기본 값:
false
- 기본 값:
- char는 자바에서 유니코드(2 byte문자 체계)를 사용하기에 2byte
- 기본 값:
\u0000
- 기본 값:
- byte는 크기가 1byte이므로 byte.
- 기본 값:
0
- 기본 값:
- int(4 byte)를 기준으로 짧게는 (2 byte) 길게는 (8 byte)를 취사선택한다.
- 기본 값:
0
- 기본 값:
- float은 실수값을 부동소수점(floating-point)방식으로 저장하기 때문에 float
- 기본 값:
0.0F
- 기본 값:
- double은 float보다 두 배의 크기(8byte)를 갖기 때문에 double
- 기본 값:
0.0
- 기본 값:
실수형
컴퓨터가 실수를 표현하는 것에 있어서 가끔식 값이 달라지는 경우가 있다.
가장 큰 이유는 부동소수점이라는 것을 이용해서 실수를 표현하기 때문에 실제 값과 다른 경우가 존재한다.
해당 문제를 해결하기 위해서 java8부타 BigDecimal
이라는 타입을 제공해준다.
https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html
2. 프리미티브 타입과 레퍼런스 타입
- 기본형(Primitive Type)
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 계산을 위한 실제 값을 저장한다.
- 선언 위치에 따라 다르며 기본적으로 stack 영역에 저장되며 그 스택 영역이 사라지며 같이 사라진다.
- 참조형(reference type)
- 객체의 주소를 저장한다. 기본적으로
Java.lang.Object
를 상속받을경우 참조형이 된다. 즉, 기본형을 제외하고는 참조형이라 생각해도 된다. - 메모리 영역에서 힙에 저장되며 그것에 대한 주소값을 선언과 함께 제공받으면 그것을 이용해서 그 메모리영역, 값에 접근할 수 있다.
- 객체의 주소를 저장한다. 기본적으로
3. 리터럴
- 단순 그 자체 값을 의마한다.
int age = 50;
- 위 예제에서는
50
라는 것 자체가 리터럴이 된다.
- 위 예제에서는
- 인스턴스 리터럴
- 기본적으로 해당 값이 불변성을 가지고 있을 때
객체 리터럴
이라고 한다. - 불변 리스트나 맵, 혹은 String 같은 경우는 객체이지만 새로운 값을 만들 때마다 새로 객체를 만들기 때문에 객체 리터럴이라고 할 수 있다.
- 기본적으로 해당 값이 불변성을 가지고 있을 때
4. 변수 선언 및 초기화하는 방법
타입 및 이름
- 변수 타입: 변수에 저장될 값이 어떤 타입(type)인지 지정하는 것.
- 변수 이름: 변수에 붙힌 이름. 변수가 값을 저장할 수 있는 메모리 공간을 의미하므로 변수 이름은 이 메모리 공간에 이름을 붙혀주는 것.
- 변수 타입에 따라서 그 크기만큼에 메모리 공간을 찾고 해당 빈공간이 있는 곳을 차지해서 해당 변수 이름을 붙인다. 실제로 접근하기 위해서는 그 이름보다는 해당 메모리 공간이 어디있는지에 대한 주소값이 중요하다
초기화
- 명시적 초기화(explicit initialization)
- 우리가 아는 변수 초기화 방법이다. 클래스 및 지역변수 어디서든 사용가능하며 여러 초기화 방법중 최우선적으로 고려한다.
- 초기화 블럭(initialization block)
- 초기화 블럭은 클래스 초기화 블럭과 인스턴스 초기화 블럭으로 나뉜다.
- 클래스 초기화 블럭: 클래스변수의 복잡한 초기화에 사용. 블럭내에서는 로직도 추가할 수 있기 때문에 명시적 초기화만으로 부족할 때 사용한다.
- 인스턴스 초기화 블럭: 인스턴스 변수의 복잡한 초기화에 사용. 모든 생성자가 공통으로 수행해야 하는 로직이 있을 때 사용한다.
- 생성자(constructor)
- 인스턴스를 실행할 때 사용되는 생성자를 통해서 초기화되는 경우이다.
5. 변수의 스코프와 라이프타임
- 클래스 변수
- 클래스 전체적으로 공유되는 변수에 해당한다.
- 변수에 static을 붙이는 경우 클래스가 만들어지는 경우부터 해당 변수는 사용할 수 있다.
- 해당 클래스로 인해서 만들어진 인스턴스는 해당 변수를 사용할 수 있다.
- 인스턴스 변수
- 인스턴스가 생성되면서 만들어지는 변수이다.
- 인스턴스마다 가져야되는 값을 저장하기 위해 적절하다. 모든 인스턴스가 각자 데이터를 가진다.
- 로컬 변수
- 특정 메소드에서만 사용되는 경우에 해당 하는 변수이다.
- 해당 메소드가 종료되면 모든 정보가 사라진다.
6. 타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환
- 변수 또는 상수의 타입을 다른 타입으로 변환.
- 프로그램 동작 중에 해당 변수의 타입을 변경해야지만 연산이 가능한 경우가 있다. 그런 경우 타입을 변경해서 연산을 진행해야되는데 이럴 때 사용해야되는 것이 형변환이라고 한다.
방법
- 변활할 변수나 리터럴 앞에 타입을 괄호와 함께 붙혀주기만 하면 된다. 이 때 형변환 연산자는 그저 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환할 뿐이기에 기존의 변수나 리터럴이 변화되지는 않는다.
- 주의해야될 점은 타입마다 값을 표현하는 식이 다르기 때문에 형변환시에 값이 달라지는 경우가 존재한다.
- int to long: long이 모든 int 값을 표현할 수 있기 때문에 문제가 되지 않지만 반대에 경우 문제가 발생할 수 있다.
- double to int: double 변수 중에 만약 소수점 값이 있다면 해당 값을 int에서 표현할 수 없기때문에 값이 사라진다.
7. 1차 배열과 2차 배열
8. 타입 추론 (Type inference)
- 값을 보고 컴파일러가 데이터 타입이 무엇인지 추론한다는 것을 의미.
- 제네릭 이용해서 만들어진 클래스에 대해서 대표적으로 볼 수 있다.
List<String> stringList = new ArrayList<>();
- 위와 같은 예제에서
new ArrayList<>()
에 어떤 타입도 넣지 않아도 사용할 수 있는 것이 그 이유에 해당한다. - 제약사항
- 로컬 변수로 사용해야 한다.
- 선언과 동시에 반드시 값을 넣어주어야 한다.
Leave a comment