[스터디할래 02] 자바 데이터 타입, 변수 그리고 배열
이 글은 ‘백기선’ 개발자님과 함께하는 온라인 자바 스터디에 참여하여 준비/학습한 내용을 정리하는 글입니다.📚
- 2주차 : https://github.com/whiteship/live-study/issues/2
- 목표 : 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
정리는 The Java Language Specification, Oracle을 기반으로 하였습니다.
자바 변수의 타입
- 자바는 정적 타입 언어(statically typed language)이다. 각 변수는 컴파일 시점에 변수의 타입을 알고있다.
- 반대인 동적 타입 언어는 컴파일 시점에 변수의 타입을 알 수 없다.
- 프로그래밍을 처음 배울 때는 파이썬같은 동적타입 언어가 생각할 것이 적어서 좋았다. 하지만, 자바를 더 많이 사용하게 되면서 컴파일 시점에 타입을 확인하는 것이 더 견고한 프로그램을 위한 길이 아닐까 하는 생각이 들었다. (현재 python3에서는 타입을 명시할 수도 있도록 개선되었다.)
- 자바는 강한 타입 언어(strongly typed language) 이다. 타입은 변수의 연산, 변수가 담을 수 있는 값을 제한한다. 컴파일 시점에 역시 에러를 감지한다.
공식 문서에서는 ‘The Java programming language is a statically typed language’와 ‘The Java programming language is also a strongly typed language’ 라고 표현하였다. statically typed language와 strongly typed language가 어떤 차이가 있는지 이해가 가지 않아서 찾아보았는데, 두 개념의 차이에 대해서는 프로그래머들 사이에서도 불분명한 것으로 보인다(참고 stackoverflow). Norman Ramsey 교수님은 말씀하셨다. “Every time I see a question about “strong” or “weak” typing, I kill a kitten.”
- 자바에는 2가지 종류의 타입(two kinds of types)이 존재한다: Primitive Type, Reference Type
- 스페셜 타입으로 ‘Null type’도 존재한다. 즉,
Null
은 primitive 타입도, reference 타입도 아니다.
번외 - null
타입
There is also a special null type, the type of the expression null, which has no name.(https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.1)
- null도 역시 타입이었다.
- null type은 이름이 없다. 그래서 타입이 null인 변수를 정의할 수는 없다.
- null reference 만이 null type을 표현할 수 있는 유일한 방법이다.
- null은 모든 reference type 에 할당될 수 있다.
프리미티브 타입 종류와 값의 범위 그리고 기본 값
- Primitive type은 다음과 같이 분류될 수 있다.
Integral Type
타입 | 크기 | 값의 범위 | 기본 값 |
---|---|---|---|
byte |
8-bit | -128 to 127 | 0 |
short |
16-bit | -32768 to 32767 | 0 |
int |
32-bit | -2147483648 to 2147483647 | 0 |
long |
64-bit | -9223372036854775808 to 9223372036854775807 | 0L |
char |
16-bit | ‘\u0000’ to ‘\uffff’ | \u0000 (null) |
char
는 UTF-16 을 표현하는 부호가 없는 정수로, 나머지는 부호화된 2의 보수 표현법(signed two’s-complement integers)을 따른다.
Floating Type
타입 | 크기 | 값의 범위 | 기본 값 | |
---|---|---|---|---|
float |
32-bit | ? | 0.0f (positive zero) |
|
double |
64-bit | ? | 0.0d (positive zero) |
float
은 32-bit IEEE 754 floating-point numbers,double
은 64-bit IEEE 754 floating-point numbers를 포함한다.
IEEE 754
- 부동소수점을 표현하는 가장 널리 쓰이는 규격의 종류라고 한다.
- 양수, 음수 뿐만 아니라 양의 0, 음의 0와, 무한대,
NaN
까지 포함한다. (Float.NaN
,Double.NaN
으로 표현)
프리미티브 타입과 레퍼런스 타입
레퍼런스타입
- Reference 타입에는
class
,interface
,type variables
와array
타입이 있다. class
와interface
타입은 점으로 구분된 identifier(dotted sequence of identifiers)로 구성되어 있다. 예)or.springframework.spring.XX
리터럴
- literal은 primitive type과
String
그리고null
타입의 소스코드 표현 방법이다. IntegerLiteral, FloatingPointLiteral, BooleanLiteral, CharacterLiteral, StringLiteral, NullLiteral
이 존재한다.- 예를 들어
IntegerLiteral
은 10진수, 16진수, 8진수, 2진수의 숫자로 표현한다. 또,long
타입은L
을 붙인다. - null type은
null
로 표현한다. - 즉, 리터럴은 이미 정해진 고정된 값을 코드로 표현하는 방법이다. 리터럴은 고정값이기 때문에 메모리에 하나만 올려두고 공동으로 사용한다.
변수 선언 및 초기화하는 방법
- 변수는 다음과 같이
{타입} {변수명} = {값}
으로 선언하고 초기화한다.String a = "";
변수의 스코프와 라이프타임
- 자바는 변수의 종류에 따라 각기 다른 스코프와 라이프타임을 가진다
- 인스턴스 변수 : 클래스의 인스턴스에서 생성되지만, 메서드나 블럭 바깥에서 선언되는 변수이다.
static
메소드를 제외한 클래스 전반에 유효한다. 클래스가 메모리에서 제거될 때까지 존재한다. - 클래스 변수 :
static
변수로도 불린다. 클래스 자체가 생성될 때 같이 생성된다. 프로그램의 종료 시점까지 유요하다. - 지역 변수 : 인스턴스나 클래스 변수가 아닌 모든 변수이다. 메서드 내부나 특정 코드 블럭에서 선언된다.
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환
- 한 데이터 타입에서 다른 데이터 타입으로 컴파일러에 의해 자동으로 변환되는 것
- source 타입과 destination 타입은 호환가능해야한다.
- destination 타입은 source 타입보다 상위 타입이어야 한다.
타입 캐스팅
- 프로그래머가 명시적으로 특정 타입에서 다른 타입으로 변경하는 것. 예를 들어
long
타입을int
타입으로 명시적으로 변환 - casting operator(
()
)로 명시한다. - Narrowing Conversion 이라고도 한다.
타입 프로모션
- 타입이 다른 변수들 간의 연산 시 연산 결과가 상위 타입으로 변환되는 것
- 예를 들어
int
형 변수a
와long
형 변수b
를 더할 경우, 연산의 결과는long
타입이다.
타입 추론, var
- 자바 10부터는
var
키워드로 타입 추론을 지원한다. - 예를 들어
var name = "Hello World";
와 같이String
변수를 선언할 수 있다.