성빈
[JAVA] 2주차 자바 데이터타입, 변수, 배열 본문
목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입 종류와 값의 범위 그리고 기본 값
정수형 | byte | 0 | -128 ~ 127 | 1byte |
short | 0 | -32,768 ~ 32,767 | 2byte | |
int | 0 | -2,147,483,648 ~ 2,147,483,647 | 4byte | |
long | 0L | 9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 8byte | |
실수형 | float | 0.0f | (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 | 4byte |
double | 0.0 | (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 | 8byte | |
문자형 | char | '\u0000' | 0 ~ 65,535 | 2byte |
논리형 | boolean | FALSE | false, ture | 1byte |
- int와 float의 차이 (같은 4byte임에도 값의 범위가 차이나는 이유 )
- float와 double의 차이 (정밀도)
- float은 7자리, double은 15~16자리 까지 표현할 수 있다. 따라서 더 높은 정밀도가 필요하다면 double을 사용해야 한다.
프리미티브 타입과 레퍼런스 타입
- 기본형 타입 (Primitive type)
- byte, short, signed/unsigned int, signed/unsigned long, float, double, boolean, char
- 기본값이 있기 때문에 null이 존재하지 않음
- 실제 값을 저장하는 공간으로 Stack 메모리에 저장
- 참조형 타입 (Reference type)
- 기본형(primitive) 타입을 제외한 타입들이 모두 참조형 타입
- 빈 객체를 의미하는 null 존재
- 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 Heap 메모리에 저장
- 배열/클래스/인터페이스에 대한 레퍼런스
리터럴(literal)
리터럴은 변수에 넣는 변하지 않는 데이터를 의미한다. 정수, 실수, 문자, 논리, 문자열 모두 리터럴이 있다.
- 정수 리터럴
- 정수 리터럴은 int타입으로 자동 컴파일된다.
int n = 15; // 십진수:15
int m = 015; // 8진수:015, 10진수:13
int k = 0x15; // 16진수:0x15, 10진수:21
int b = 0b0101; // 2진수:0b0101, 10진수:5
10진수 | 0으로 시작하지 않는 수 | 15 → 10진수 15 |
8진수 | 0으로 시작하는 수 | 015 → 10진수 13 |
16진수 | 0x로 시작하는 수 | 0x15 → 10진수 21 |
2진수 | 0b로 시작하는 수 | 0b0101 → 10진수 5 |
- 실수 리터럴
- 소수점 형태나 지수 형태로 실수를 표현한 값
- double 타입으로 자동 처리된다.
- 숫자 뒤에 f나 F를 붙이면 float, d나 D를 붙이면 double 타입으로 강제 변환할 수 있다.
double d = 0.1234;
float f = 0.1234f; // f = 0.1234로 하면 컴파일 오류
double w = .1234D; //0.1234와 동일
- 문자 리터럴
- 단일 인용부호(’ ‘)로 문자를 표현하거나, \u 다음에 문자의 유니코드 값을 사용하여 표현한다.
char a = 'A';
char b = '글';
- 문자형 리터럴
- 이중 인용부호(” ”)로 표현
String str = "good";
- 특수문자 리터럴
‘\b’ | 백스페이스 | ‘\r’ | 캐리지 리턴 |
‘\t’ | 탭 | ‘\”’ | 이중 인용부호 |
‘\n’ | 라인피드 | ‘\’’ | 단일 인용부호 |
‘\f’ | 폼피드 | ‘\\’ | 백슬래시 |
- 논리 리터럴과 boolean 타입
- true, false 두 개밖에 없다.
- boolean 타입의 변수에 직접 치환하거나 조건문에 사용한다.
- C/C++과 달리 Java에서 숫자를 참, 거짓으로 사용 불가하다.
boolean a = true;
boolean b = 10 > 0; // 10>0가 참이므로 b값은 true
boolean c = 1; // 타입 불일치 오류
while(ture) { // 무한루프. while(1)로 하면 안됨.
...
}
변수 선언 및 초기화하는 방법
변수는 데이터를 저장하는 공간이다. 변수를 선언하면 타입 크기의 메모리가 할당되며, 프로그램은 실행 중에 값을 쓰고 읽는 공간으로 사용한다.
● 변수 선언
: 데이터 타입과 변수 이름으로 변수를 선언한다.
int price; // 데이터 타입과 변수이름
char c1, c2, c3 // 같은 타입의 변수를 여러 개 선언하려면 콤마로 분리한다.
● 변수 선언과 동시에 초기화
: 변수 선언과 동시에 초깃값을 지정할 수 있다.
int radius = 10;
char c1 = 'a', c2 = 'b', c3 = 'c';
double weight = 75.56;
변수의 스코프와 라이프타임
- 변수의 스코프
- 스코프란 변수를 사용할 수 있는 영역을 의미한다.
- 일반적인 규칙은 변수가 선언된 블록 내에서만 변수에 접근할 수 있다.
- 블록은 { }을 말하는데, Java에서 Class와 Method가 블록을 가진다.
- 변수의 라이프 타임
- 라이프 타임은 이러한 변수가 유효한 시간을 말하는데,
- 프로그램이 구동되는 동안 변수가 '값을 담고 있을 수 있는 주기'를 말한다.
- 변수의 종류
- 변수의 스코프와 라이프 타임은 변수의 종류에 따라 상이하다.
- 이는 변수가 선언된 위치에 따라 세 가지 영역으로 나눌 수 있다.
- 클래스 변수
- 인스턴스 변수
- 지역 변수
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때 프로그램이 끝날 때까지 클래스 전역 인스턴스 변수 클래스 영역 인스턴스가 생성될 때 객체가 메모리에서 활용될 때까지 static 메소드를 제외한 클래스 모든 영역 지역변수 메소드 영역 변수 선언문이 수행되었을 때 블록을 벗어났을 때까지 메소드 안
타입 변환, 캐스팅 그리고 타입 프로모션
- 타입 변환
- 데이터 타입을 다른 데이터 타입으로 변환하는 것을 의미한다.
- 자동 타입 변환과 강제 타입 변환으로 나뉜다.
- 자동 타입 변환 (묵시적 타입 변환, 타입 프로모션)
- 값의 허용 범위가 작은 타입이 큰 타입으로 저장될 때 발생한다.
- 자동 형 변환이 이루어지는 순서 : byte < short < char < int < long < float < double
- 강제 타입 변환 (명시적 타입 변환, 캐스팅)
- 개발자가 강제로 타입 변환을 지시하는 경우이다.
- 표현 방식 : (변환할 타입) 변환할 데이터
- 문제점 : 데이터 손실이 발생할 수 있다.
- 강제 변환을 하면 컴파일 오류가 발생하지 않지만, 300에서 256을 초과한 만큼, 44(300%256=44)가 변수 b에 저장되어 데이터 손실이 발생하게 된다.또한, 실수를 정수로 강제 변환하면 소수점 이하의 손실이 발생한다.
- double d = 1.9; int n = (int)d; // 강제 타입 변환으로 n=1이 됨
- int n = 300; byte b = n; // 컴파일 오류. int 타입은 byte 타입으로 자동 변환되지 않음 byte b = (byte)n; // n을 byte 타입으로 강제 변환. b=44
int num1 = 1;
int num2 = 4;
double result1 = num1 / num2;
double result2 = (double) num1 / num2;
System.out.println(result1);
System.out.println(result2);
1차 및 2차 배열 선언하기
- 배열
- 여러 개의 데이터들을 인덱스 구조에 저장을 한다.
- 배열의 길이는 한번 생성하면 줄이거나 늘릴 수 없고 같은 타입들만이 배열의 원소로 사용된다.
- 배열도 결국은 타입에 따라 default값으로 채워진다.
- 참조의 경우 null
- int / short / byte / long의 경우 0
- float / double 의 경우 0.0
- bool의 경우 false
- char의 경우 \\u0000
다차원 배열, 1차원 배열 vs 2차원 배열 vs 3차원 배열(비교) (tistory.com)
- 1차원 배열
- 선언하기 타입[] 배열이름 = new 타입[배열길이];
- 배열 선언, 생성, 할당을 동시에 하는 방법
- int[] score = {10, 11, 12}; // 또는 int score[] = {10, 11, 12};
- 배열 선언 후에 생성과 할당을 하는 방법
- int score[]; string name[]; // 배열 선언 score = new int[] {10, 50, 100}; name = new string[] {"white", "ship}; // 생성과 할당
- 배열 선언 후 -> 생성 후 -> 할당을 하는 방법
- int score[]; // 선언 score = new int[3]; // 생성 score[0] = 10; score[1] = 50; score[2] = 100; // 할당
- 선언하기 타입[] 배열이름 = new 타입[배열길이];
- 2차원 배열
- 선언하기 타입[][] 배열이름 = new 타입[배열길이][배열길이];
int[][] intArray = new int[2][3]; // 2행 3열의 2차원 배열 생성 char charArray [][] = new char[5][5]; // 5행 5열의 2차원 배열 생성 double doubleArray[][] = {{0.01, 0.02}, {0.03, 0.04}}; // 2행 2열의 2차원 배열 생성
타입 추론, var
- 타입 추론
- 변수 타입을 명시하지 않고 컴파일러가 데이터 타입이 무엇인지 추론한다는 것을 의미
- Java10부터 지역 변수를 선언할 때 변수의 타입 대신 var 키워드를 사용할 수 있다.
var price = 200; // price는 int타입으로 결정 var name = "apple" // name은 String 타입으로 결정 var name; // 컴파일 오류. 변수 선언문에 초깃값이 주어지지 않으면 타입을 추론할 수 없음
참고자료
- 명품 JAVA Programming (황기태 지음)
- https://drinkcoldbrew.tistory.com/2
'JAVA' 카테고리의 다른 글
[JAVA] 3주차 연산자 (0) | 2023.10.27 |
---|---|
[JAVA] 1주차 JVM (0) | 2023.07.17 |