Study 2. 자바 데이터 타입, 변수 그리고 배열 🙂

정지은·2023년 1월 9일
0

JAVA를 잡아~

목록 보기
2/15
post-thumbnail

Today's Study


  1. 프리미티브 타입의 종류, 값의 범위, 기본 값
  2. 프리미티브 타입 vs 레퍼런스 타입
  3. 리터럴
  4. 변수 선언&초기화
  5. 변수의 스코프와 라이프타임
  6. 타입 변환, 캐스팅 그리고 타입 프로모션
  7. 1차 및 2차 배열 선언하기
  8. 타입 추론, var
  9. Stop's Quetion

1. 프리미티브 타입의 종류, 값의 범위, 기본 값


Primitive type : 기본형 타입

Primitive Type의 특징

  • 총 8가지의 Primitive type이 있다.
  • 선언 후 사용이 가능하다.
  • OS가 달라진다고 해서 자료형의 길이가 변하지 않는다.
  • 비객체 타입으로 NULL값을 가질 수 없으며, 넣고 싶다면 Wrapper Class를 사용해야 한다.
Wrapper Class (래퍼 클래스)
Primitive type을 객체로 다루기 위해서 사용하는 클래스
불변성을 가지는 것이 특징이다.
  • 스택 메모리에 저장된다.

자료형키워드크기기본값표현 범위
논리형boolean1bytefalsetrue 또는 false (0과 1이 아니다)
문자형char2byte\u00000 ~ 65,535
정수형byte1byte0-128 ~ 127
short2byte07
int4byte0-2,147,483,648 ~ 2,147,483,64
long8byte0-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
실수형float4byte0.0-3,4E38 ~ +3.4E8
double8byte0.0-1.7E308 ~ +1.7E308

1) boolean

  • 논리형으로 참과 거짓을 저장하는 타입이다.
  • 두가지 값만 표현하므로 크기가 가장 작다.
  • 실제로는 1bit면 충분하지만, 데이터를 다루는 최소 단위가 1byte이므로 메모리 크기가 1byte이다.

2) byte

  • 주로 이진데이터를 다루는데 사용된다.

3) short

  • short는 C언어와의 호환을 위해 사용되는 타입으로 잘 사용되지는 않는다.

4) int

  • 정수의 연산을 위한 기본타입으로 byte, short의 변수가 연산을 하면 결과는 int형이 된다.

5) long

  • 수치가 큰 데이터를 다루는 프로그램에서 주로 사용한다.
  • long 타입의 변수를 초기화 할때에는 L을 붙여 long타입의 데이터임을 알려주어야 한다.
long l = 2147483648L;

6) float, double

  • 실수를 가수와 지수 형식으로 저장하는 부동소수점 방식으로 저장된다.
  • 가수를 표현하는 것은 float형보다 double형이 표현가능 범위가 더 크기에 보다 정밀하게 표현할 수 있다.
  • Java에서 실수의 기본 타입은 double형이기에 float형은 long 타입처럼 F를 붙여 float형임을 명시한다.
float f = 1234.567F;

2. 프리미티브 타입 vs 레퍼런스 타입


Reference type은 참조형 타입으로 Primitive type을 제외한 타입을 말한다.
클래스 타입, 인터페이스 타입, 배열 타입, 열거 타입이 있다.

Reference 타입의 특징

  • java.lang.Object 클래스를 상속하는 모든 클래스들을 말한다.
  • NULL값을 가질 수 있다.
  • 선언 시, stack 메모리에는 객체의 변수와 그 값이 저장되어 있는 heap의 주소값이 저장됩니다.

Primitive Type vs Reference Type

  • Primitive Type은 NULL값을 저장할 수 없고, 제너릭 타입에서 사용할 수 없지만 Reference Type은 가능하다.
  • Reference Type은 실제 값이 저장되어 있는 heap메모리를 참조하여 언박싱 과정을 거쳐야 하니 Primitive Type에 접근 속도는 느리다.
  • 엄청 큰 숫자를 복사해야 하는 상황이라면 값 자체를 옮기기 보다 값이 저장되어 있는 heap메모리의 주소를 옮기는 참조타입이 좋을 수 있다.
  • stack, heap 메모리를 사용하는 Reference Type의 메모리양이 압도적으로 높다.


3. 리터럴


데이터(값) 그 자체를 뜻한다.

int i = 10;

이 때 i 는 변수, 10이 리터럴이다.


리터럴 표기법

변수를 선언함과 동시에 그 값을 지정해주는 표기법을 말하며 코드상에서 데이터를 표현하는 방식이다.


🤔 10은 상수가 아닌가?

Java에서 상수는 constant로 변하지 않는 변수를 뜻한다. 하지만 위의 코드에서 10은 변수에 넣는 데이터로 초기화를 통해 변경이 되기에 리터럴이라고 하는 것이다.

const a = 1;

여기서 a가 상수이고 1이 리터럴이 되는 것이다.



4. 변수 선언&초기화


변수 선언

변수를 사용하기 위해 필요한 선언과정이다.

int i;
  • 다음과 같이 변수의 이름은 값을 저장할 수 있는 메모리공간에 이름을 붙여주는 것이다.
  • 위처럼 변수를 선언하게 되면 stack의 빈 공간에 i라는 이름으로 int의 타입크기에 맞는 저장공간이 확보되고, i를 사용해 이 저장공간을 사용할 수 있다.

변수의 초기화

변수를 사용하기 전 처음으로 값을 저장하는 것

  • 변수를 선언하여 생긴 저장공간에 어떤 값을 저장할지 정해주는 과정이다.
  • 지역변수는 초기화하기 전에 사용할 수 없다.
i = 2000;
  • 위의 코드를 보자면, i라는 저장공간에 2000 값을 저장하는 것이다.
int i = 2000;
  • 흔히 이렇게 사용하는데 이것은 변수를 선언하는 동시에 초기화하는 과정이다.


5. 변수의 스코프와 라이프타임


변수의 스코프 : 변수를 사용할 수 있는 영역
라이프 타임 : 변수가 값을 담고 있을 수 있는 주기

  • 스코프는 변수가 선언되는 영역에 따라 접근하는 방법이 다르다.
  • 라이프타임은 변수의 종류에 따라 상이하기 때문에 종류에 따른 차이를 생각하는 것이 중요하다.

변수의 종류선언 위치스코프라이프사이클
클래스 변수클래스 영역클래스 전체클래스가 메모리에 올라간 후 프로그램이 끝날 때까지
인스턴스 변수클래스 영역static 블록과 static 메서드를 제외한 클래스 전체인스턴스가 생성된 후 메모리에 살아있을 때까지
로컬 변수메소드, 생성자, 초기화 블록 내부변수가 선언된 블록 내부변수가 선언된 후 블록을 벗어날 때까지


6. 타입 변환, 캐스팅 그리고 타입 프로모션


타입 변환

변수 또는 상수의 타입을 다른 타입으로 변환하는 것

  • 서로 다른 타입간의 연산이 필요한 경우, 형변환을 통해 서로의 타입을 일치시킨 후 연산을 수행해야 한다.
double a_score = 98.45;
int b_score = 98;
int sum = (int)a_score + b_score;
  • 기본형 변수는 boolean을 제외한 타입만 가능하다.
  • 타입간의 크기가 다르기 때문에 형변환을 통해 크기의 차이만큼 값손실이 발생할 수 있다.

프로모션

묵시적 형변환으로 작은 데이터 타입에서 큰 데이터 타입으로 형 변환이 되는 것이다.

int a = 10;
float b = a;	// b = 10.0

위의 코드처럼 (float) a 로 명시적인 형 변환을 해주지 않아도 큰 데이터 타입에는 작은 데이터 타입의 모든 값을 넣을 수 있기 때문에 자동으로 형변환이 되는 것이다.


캐스팅

명시적 형변환으로 주로 큰 데이터 타입에서 작은 데이터 타입으로 형 변환을 할 때 사용한다.

float a = 10;
int b = a;		//error
int b = (int)a;

큰 데이터 타입의 값을 작은 데이터 타입에 억지로 넣는다고 생각하면 된다. 값의 손실이나 변형이 생길 수 있기 때문에 자동으로 되지않고 작성자가 명시적으로 입력을 해주어야 가능하다.



7. 1차 및 2차 배열 선언하기


1차원 배열과 2차원 배열의 차이는 대괄호( [] )의 갯수 차이이다. 이는 메모리가 허용하는 한도까지 차원을 높일 수 있다.

int[] oneDimensionalArray = new int[5]{1, 2, 3, 4, 5};

int[][] twoDimensionalArray = new int[2][2]{{1,2}, {3,4}};

다음 코드들은 각각 1차원, 2차원 배열을 선언, 생성, 초기화를 모두 시켜준 경우이다.

2차원 배열의 경우, new int[행][열]로 이해하면 된다.


int[] array; //선언
array = new int[5] //생성
array = {1, 2, 3, 4, 5}; //초기화

이는 선언과 생성, 초기화를 따로 해준 것으로 array라는 배열을 선언하고 이 배열을 길이를 5로 하여 생성한다. 그 후 변수의 이름으로 배열의 값을 저장해주는 것이다.


int[] array = {1, 2, 3, 4, 5}; //가능

int[] array2;
array = {1, 2, 3, 4, 5};	//error

다음 경우를 보자. array는 선언과 초기화를 같이 해주었다. 이 경우는 따로 길이를 설정하여 생성하지 않아도 생성과 초기화가 동시에 가능하다. 하지만 array2의 경우는 선언 후 array에 값을 저장할 때 new int[] 를 생략할 수 없다.



9. Stop's Question 🤷‍♀️


Q1. Wrapper Class는 어떤 경우에 사용하는 것인가?


본 스터디는 2020 백기선님의 자바스터디의 커리큘럼을 참고하여 진행하고 있습니다.

0개의 댓글