[Java] 2주차 과제: 자바 데이터 타입, 변수 그리고 배열
by Roel Downey스터디 링크 : 링크
목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입 종류와 값의 범위 그리고 기본 값
프리미티브 타입 : 기본 타입
자바의 기본 타입은 8종류 ( 정수형, 실수형, 문자형, 논리형 )
타입 종류 | 값 범위 | 기본 값 |
byte (정수형) | -128 ~ 127 | 0 |
short (정수형) | -32,768 ~ 32,767 | 0 |
int (정수형) | -2,147,483,648 ~ 2,147,483,647 | 0 |
long (정수형) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0L |
float (실수형) | (3.4 X 10^-38) ~ (3.4 X 10^38) | 0.0F |
double (실수형) | (1.7 X 10^-308) ~ (1.7 X 10^308) | 0.0 |
char (문자형) | 0 ~ 65,535 | '\u0000' |
boolean (논리형) | ture,false | false |
- 참고 - 링크
프리미티브 타입과 레퍼런스 타입
- 기본 타입과 참조 타입
- 레퍼런스 타입은 변수들의 실제 값을 저장하고 있는것이 아니라 실제 값이 저장되어있는 메모리 주소를 저장하고 있다.
즉, 주소를 통해 실제 값을 참조하기 때문에 참조타입이라고 한다.
배열, 열거형, 클래스, 인터페이스
리터럴
데이터 그 자체를 뜻한다. 변수의 값이 변하지 않는 데이터 ( 메모리 위치 안의 값 )
변수 선언 및 초기화하는 방법
- 두가지 방법으로 설명하겠다.
변수에 값을 저장하기 위한 메모리 공간을 할당 받으면, 반드시 해당하는 타입의 데이터만 저장해야한다.
1. 변수 선언만 하는 방법
변수를 선언하여 메모리 공간을 할당받고, 나중에 변수를 초기화 하는 방법
선언만 된 변수는 반드시 초기화 후에 사용해야한다.
int number;
System.out.println(number); // error
number = 10;
System.out.println(number); // 10
2. 변수 선언과 동시에 초기화 하는 방법
int number = 10;
double radius = 3.14;
변수의 스코프와 라이프 타임
프로그램에서 사용된 변수들은 사용 가능한 범위를 가진다. 그 범위를 변수의 스코프라고 한다.
변수가 선언된 블럭이 그 변수의 사용 범위이다.
public class ValableScopeExam {
int globalValue = 10;
public void localScope(int value) {
int localValue = 20;
System.out.println(globalValue);
System.out.println(localValue);
System.out.println(value);
}
}
- globalValue 의 사용 범위는 클래스 전체이다.
- localValue 의 사용 범위는 localScope 메소드 블럭 내이다.
- value 의 사용 범위는 localScope 메소드 블럭 내이다.
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환 :
- 하나의 타입을 다른 타입으로 바꾸는 것을 뜻한다.
- 큰 타입에서 작은 타입으로의 타입 변환은 데이터의 손실이 발생 ( 자바 컴파일러는 오류를 발생시킨다.)
- 타입 변환은 묵시적 타입 변환 ( 자동 타입 변환 ) , 명시적 타입 변환 ( 강제 타입 변환 ) 이 있다.
1. 묵시적 타입 변환 ( 자동 타입 변환 ) : 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환
자바에서는 데이터의 손실이 발생하는 대입 연산은 허용하지 않는다.
double num1 = 10;
// int num2 = 3.14; //error
double num3 = 7.0f + 3.14;
System.out.println(num1);
System.out.println(num3);
num1의 결과는 10.0 : double 변수에 int 데이터를 대입함으로 , int 데이터가 double로 자동 타입 변환된다.
num2의 결과는 int 가 표현할 수 있는 범위보다 더 큰 double를 넣으므로 데이터 손실이 발생해서 컴파일 오류가 발생
num3의 결과는 float 와 double 데이터의 산술 연산을 수행한다. float 데이터가 double로 자동 타입 변환된다.
2. 명시적 타입 변환 ( 강제 타입 변환 ) : 사용자가 타입 캐스트(type cast)를 사용하여 강제로 수행한다.
(변환할 타입 ) 변환할 데이터
int num1 = 1;
int num2 = 4;
double result1 = num1 / num2;
double result2 = (double) num1 / num2;
System.out.println(result1);
System.out.println(result2);
result1의 결과는 0.0 : 나눗셈 연산 결과로는 int 형인 0이 반환되지만 double 변수에 결과가 대입될때 0.0으로 자동 변환된다.
result2의 결과는 0.25 : 피연산자 중 하나의 타입이 double 형이 되면, 나눗셈 연산을 위해 나머지 하나의 피 연산자도 double형으로 자동으로 타입 변환이 된다.
- 참고 - 링크
1차 및 2차 배열 선언하기
1차 배열 : 타입[] 배열이름 = new 타입[배열길이]; 로 배열 선언과 생성을 동시에 할 수 있다.
배열 길이를 초과하는 인덱스를 사용하면 ArrayIndexOutOfBounds 예외가 발생한다.
길이가 3인 int형 배열 선언 및 생성하고 0번째에는 10을, 1번째에는 100을, 2번째에는 1000을 초기화한다. 그리고 출력한다.
int[] number = new int[3];
number[0] = 10;
number[1] = 100;
number[2] = 1000;
for(int i = 0 ; i<number.length; i++ ) {
System.out.println(number[i]);
}
결과:
10
100
1000
2차 배열 : 타입[][] 배열이름 = new 타입[배열길이][배열길이]; 로 배열 선언과 생성을 동시에 할 수 있다.
2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이다.
int[][] arr = new int[2][3];
arr[0][0] | arr[0][1] | arr[0][2] |
arr[1][0] | arr[1][1] | arr[1][2] |
int[][] arr = new int[2][3];
int value = 10;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = value;
value += 10;
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
10 20 30
40 50 60
타입 추론, var
타입 추론 : 변수 타입을 명시하지 않고 컴파일러가 데이터 타입이 무엇인지 추론한다는 것을 의미
var
- 지역변수에서만 사용이 가능
- 선언과 동시에 반드시 초기화를 해야한다.
- null 초기화하면 작동하지 않는다.
- 람다 표현식에는 var 사용할 수 없다.
- 타입이 없이 배열에 초기값을 넘겨도 작동하지 않는다.
- 참고 - 링크
'Java' 카테고리의 다른 글
[Java] 3주차 과제: 연산자 (0) | 2020.11.25 |
---|---|
[Java] 동시성(Concurrency)과 병렬성(Parallelism) 차이 (0) | 2020.11.17 |
[Java] 1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2020.11.16 |
[디자인패턴] 빌더 패턴 (Builder) (0) | 2020.08.30 |
[Java] Java Optional (0) | 2020.08.30 |
블로그의 정보
What doing?
Roel Downey