[자바 스터디] 2주차. 자바 데이터 타입, 변수 그리고 배열
21 Nov 2020
Reading time ~6 minutes
- 1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 2. 프리미티브 타입과 레퍼런스 타입
- 3. 리터럴
- 4. 변수 선언 및 초기화하는 방법
- 5. 변수의 스코프와 라이프타임
- 6. 타입 변환, 캐스팅 그리고 타입 프로모션
- 7. 1차 및 2차 배열 선언하기
- 8. 타입 추론, var(자바 10 이상)
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
1) 자바 데이터의 정수 타입 값
(1) byte
- 8비트의 크기
- -128부터 127 (\(-2^{7}\) to \(2^{7} - 1\))까지의 값을 가집니다.
- 기본값으로 0을 가집니다.
(2) short
- 16비트의 크기
- -32768부터 32767 (\(-2^{15}\) to \(2^{15} - 1\))까지의 값을 가집니다.
- 기본값으로 0을 가집니다.
(3) int
- 32비트의 크기
- -2147483648부터 2147483647(\(-2^{31}\) to \(2^{31} - 1\))까지의 값을 가집니다.
- 기본값으로 0을 가집니다.
(4) long
- 64비트의 크기
- -9223372036854775808부터 9223372036854775807(\(-2^{63}\) to \(2^{63} - 1\))까지의 값을 가집니다.
- 기본값으로 0.0L을 가집니다.
2) 자바 데이터의 부동소수점 타입 값
(1) float
- 32비트의 크기
- IEEE 754의 Single Precision 규격을 따릅니다.
- \(1.4\times10^{-45}\)부터 \(3.4\times10^{38}\)까지의 값을 가집니다.
- 소수점이하 6자리까지의 정밀도를 가집니다.
(2) double
- 64비트의 크기
- IEEE 754의 Double Precision 규격을 따릅니다.
- \(-4.9\times10^{-324}\)부터 \(1.8\times10^{308}\)까지의 값을 가집니다.
- 소수점이하 15자리까지의 정밀도를 가집니다.
3) 자바 데이터의 문자 타입 값
(1) char
- 16비트의 크기
- 음이 아닌 0부터 65535(\(2^{16}-1\))를 까지의 값을 가집니다.
- 기본값으로 ‘\u0000’을 가집니다.
4) 자바 데이터의 부울 타입 값
(1) boolean
- 8비트의 크기
- false 또는 true값을 가집니다.
- 기본값으로 false를 가집니다.
2. 프리미티브 타입과 레퍼런스 타입
프리미티브 타입
위에서 살펴본 정수타입, 부동소수점타입, 불리언타입 등이 있습니다. 변수에 실제 값이 저장되며 메모리의 스택 영역에 저장됩니다.
레퍼런스 타입
클래스타입, 인터페이스타입, 배열타입, 열거타입 등이 있습니다. 실제 값은 힙 영역에 저장되며 그 주소값만 스택 영역에 저장됩니다.
3. 리터럴
리터럴이란
프로그래밍에서 사용되는 데이터 값 자체를 의미한다. 다음과 같은 코드가 있다고 할 때 29나 3.14라는 값 자체를 ‘리터럴’이라고 부릅니다. 일반적으로 ‘상수’와 헷갈리기 쉽습니다. 값을 변경할 수 있는 age와 같은 저장공간은 ‘변수’라고 부르고 pi와 같이 값을 변경할 수 없는 저장공간은 ‘상수’라고 부릅니다.
int age = 29;
final double pi = 3.14
리터럴의 타입과 접미사
1) 논리형 리터럴
false, true와 같은 값입니다.
2) 정수형 리터럴
10, 0xAF, 10000L와 같은 값입니다. 기본적으로 int 타입이며 long 타입의 경우 l 또는 L이라는 접미사를 붙입니다.
3) 실수형 리터럴
3.14, 1.2e11, 5.6f와 같은 값입니다. 기본적으로 double 타입이며 float 타입의 경우 f또는 F라는 접미사를 붙입니다.
4) 문자형 리터럴
‘0’, ‘a’, ‘\n’과 같은 값입니다. 작은 따옴표로 감싸주어 표현합니다.
5) 문자열 리터럴
“Hello”, “365”, “R”과 같은 값입니다. 큰 따옴표로 감싸주어 표현합니다.
4. 변수 선언 및 초기화하는 방법
변수 선언
아래와 같이 변수타입(int)과 변수명(number)을 입력하여 원하는 타입의 변수를 선언할 수 있습니다.
int number;
변수 선언 규칙
- 대소문자 구분이 가능하며 길이 제한이 없습니다.
- int, static, public과 같은 예약어를 사용할 수 없습니다.
- 숫자로 시작할 수 없습니다.
- 특수문자는 ‘_‘와 ‘$’만 가능합니다.
- 일반적으로 currentTimeInKorea와 같이 카멜 표기법1을 권장합니다.
변수 초기화
위와 같이 number라는 변수를 선언하였다면 등호와 리터럴을 사용하여 초기화 할 수 있습니다. 예를 들면 아래 작성된 코드처럼 nubmer라는 변수의 값을 10으로 초기화 할 수 있습니다.
number = 10;
변수 선언과 동시에 초기화
위의 선언과 초기화 두 가지 동작을 한 번에 아래와 같이 할 수도 있습니다.
int number = 10;
5. 변수의 스코프와 라이프타임
아래 코드를 예로 들어 설명하겠습니다.
class VariableScope {
int instanceVariable; // 인스턴스변수
static int classVariable; // 클래스변수(=static 변수)
void method(){
int localVariable; // 지역변수
}
}
1) 인스턴스변수(instance variable)
- 라이프 타임 : 클래스 영역에 멤버 변수로 선언되며, 클래스의 인스턴스의 생성과 동시에 생성되며 인스턴스가 소멸될 때 사라집니다.
- 스코프 : 클래스 전체에서 접근 가능합니다. 하지만 main과 같은 static 메소드 내에서는 인스턴스화 하여야 접근이 가능합니다.
2) 클래스변수(class variable)
static 변수라고 불리기도 합니다.
- 라이프 타임 : 클래스 영역에 멤버 변수로 선언되며 모든 인스턴스가 공유할 수 있는 변수입니다. 클래스가 메모리에 로딩될 때 생성되며 프로그램 종료 시 소멸됩니다.
- 스코프 : 같은 프로그램내 어디에서도 접근이 가능합니다. 클래스가 인스턴스화 되지 않더라도 접근이 가능합니다.
3) 지역변수(local variable)
- 라이프 타임 : 메소드 호출 또는 반복문과 같은 블록 내의 변수 선언문에 의해 생성되며 메소드 호출이 끝나거나 반복문의 블록에서 벗어날 때 소멸됩니다.
- 스코프 : 메소드 내에서 또는 블록 내에서만 접근이 가능합니다.
6. 타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환
강제로 타입을 변환시키는 타입캐스팅과 프로그램 실행 시 자동으로 타입이 변환되는 타입 프로모션이 있습니다.
타입 캐스팅
변수의 타입을 강제로 다른 타입으로 변환하는 것을 말합니다. 다운 캐스팅과 업 캐스팅이 있습니다.
다운 캐스팅
큰 타입에서 작은 타입으로의 타입변호나을 말합니다. 아래와 같이 double 타입에서 int 타입으로 캐스팅 되게 되면 소수점 이하를 버리게 되는 데이터의 손실이 발생합니다.
double doubleNumber = 3.14;
int intNumber = (int) doubleNumber; // 3
업 캐스팅
작은 타입에서 큰 타입으로의 타입 변환을 말합니다.
int intNumber = 3;
double doubleNumber = (double) int Number; // 3.0
타입 프로모션
프로그램의 실행 도중 변수의 타입 변환이 자동적으로 발생하는 것을 말합니다. 예를 들어 아래와 같은 코드를 실행하면 타입이 달라 연산에 문제가 되므로 자동적으로 int 타입 변수를 double 타입으로 변환하여 연산을 진행하게 됩니다. 이러한 현상을 타입 프로모션(자동 형변환)이라고 합니다.
double doubleNumber = 2.5;
int intNumber = 1;
double addedNumber = doubleNumber + intNumber;
위의 코드가 아래와 코드와 같이 동작하게 됨을 말합니다.
double doubleNumber = 2.5;
int intNumber = 1;
double addedNumber = doubleNumber + (int)intNumber;
7. 1차 및 2차 배열 선언하기
1차 배열
1차 배열 선언
아래와 같은 두 가지 방식으로 배열을 선언할 수 있습니다.
int [] arr; // 1차 배열 선언
int arr []; // 1차 배열 선언
1차 배열 초기화
위와 같이 1차 배열을 선언한 후 아래과 같이 1차 배열을 초기화 할 수 있습니다. 기본값인 0으로 초기화됩니다.
arr = new int [5];
1차 배열 선언과 동시에 초기화
다음과 같이 1차 배열을 선언과 동시에 초기화 할 수 있습니다.
int [] arr = new int [5];
값을 0이 아닌 다른 값으로 초기화하고 싶은 경우 아래와 같이 초기화 할 수 있습니다.
int [] arr = {1,2,3,4,5};
2차 배열
2차 배열 선언
아래와 같은 두 가지 방식으로 배열을 선언할 수 있습니다.
int [][] arr; // 2차 배열 선언
int arr [][]; // 2차 배열 선언
2차 배열 초기화
위와 같이 2차 배열을 선언한 후 아래과 같이 1차 배열을 초기화 할 수 있습니다. 기본값인 0으로 초기화됩니다.
arr = new int [3][3];
1차 배열 선언과 동시에 초기화
다음과 같이 1차 배열을 선언과 동시에 초기화 할 수 있습니다.
int [][] arr = new int [3][3];
값을 0이 아닌 다른 값으로 초기화하고 싶은 경우 아래와 같이 초기화 할 수 있습니다.
int [][] arr = {{1,2,3},{4,5,6},{7,8,9}};
8. 타입 추론, var(자바 10 이상)
타입 추론이란 타입을 var로 지정하더라도 리터럴에 따라 타입을 추론하여 컴파일러가 알아서 지정해 주는 것을 말합니다.
var number = 10;
var word = "Apple"
위의 코드를 자동으로 아래의 코드처럼 인식해줍니다.
int number = 10;
String word = "Apple";
대신 아래와 같이 코드를 작성하게 되면 number라는 변수가 10으로 초기화 되기 때문에 int형으로 지정되었는데 “Hello World!”라는 문자열을 대입하려하면 컴파일 에러가 발생합니다.
var number = 10;
number = "Hello World!";
이러한 이유로 var를 사용해서 타입을 지정할 때에는 반드시 선언과 동시에 초기화 해주어야 합니다. 그래야 컴파일러가 var 대신에 한 가지 타입을 지정하여 코드를 동작시킬 수 있기 때문입니다.
주석
-
카멜 표기법란 낙타의 등을 연상시키는 표기법입니다. 기본적으로 소문자를 쓰며 여러 단어가 이어지는 경우에 뒤에 오는 단어의 첫글자를 대문자로 표기하는 방식입니다. ↩