Backend/Java

자바 데이터 타입, 변수 그리고 배열 (2주차)

가은파파 2021. 1. 11. 00:13

목표

자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

학습할 것

  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  • 프리미티브 타입과 레퍼런스 타입
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언하기
  • 타입 추론, var

 

# 프리미티브 타입 종류와 값의 범위 그리고 기본 값

- 8가지의 기본형 타입이 있습니다.

- 기본값이 있기 때문에 Null이 존재하지 않습니다.

- 실제 값을 저장하는 공간으로 Stack(스택) 메모리 영역에 저장 됩니다.

타입(Type)

할당 메모리크기

기본값(default)

데이터 표현 범위

논리형

boolean

1 byte

false

true, false

정수형

byte

1 byte

0

-128 ~ 127

short

2 byte

0

-32,768 ~ 32,767

int(기본)

4 byte

0

-2,147,483,648 ~ 2,147,483,647

long

8 byte

0L

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

실수형

float

4 byte

0.0F

( 3.4 x 10^(-38) ) ~ ( 3.4 x 10^(-38) ) 근사값

double

8 byte

0.0

(1.7 x 10^(-308)) ~ (1.7 x 10^(-308)) 근사값

문자형

char

2 byte (유니코드)

'\u0000'

0 ~ 65,535

byte타입 같은 경우 0~255까지가 아닌 -128 ~ 127까지의 범위를 포함하고 있을까?

바로 PC에서 음수를 표현하기 위해 MSB 라는것을 사용하기 때문입니다.

MSB(Most Significant Bit)는 최상위 비트를 의미하며 일반적으로 비트의 가장 왼쪽에 위치한 비트를 일컫습니다.

■ 0 0 0 0 0 0 0

MSB 또는 부호 비트의 값이 1이면 음수, 0이면 양수로 판단을 하며, 부호가 있는 자료형의 경우 1비트를 부호를 표현하기 위해 사용하기 때문에 양수는 0이 포함되기 때문에 128이 아니고 127이다.

만약, 0~255같이 부호가 없는 자료형을 사용하려면 unsigned 자료형을 사용하면 됩니다. 음수를 사용하지 못하는 만큼 양수의 값은 2배가 됩니다.

JAVA에서는 unsigned 자료형을 사용할수 없으므로 보통 표현 범위를 넘을때는 더큰 자료형을 사용한다고 합니다.(ex. Biginteger)

 

실수형 같은 경우는 0보다 크고 1보다 작은 수와 10의 거듭제곱의 곱으로 표현합니다.

cf.부동소수점 사용시 정확한 금융 어플리케이션을 계산시에 float, double 대신 Bigdecimal을 사용해야 한다.

 

# 프리미티브 타입과 레퍼런스 타입

프리미티브 타입은 위에서 살펴보았다.

레퍼런스 타입은

- 프리미티브 타입을 제외하고는 모두 레퍼런스 타입이라고 한다.

- 값이 저장되어 있는 곳의 위치값(주소값)을 저장하는 Runtime Data Area의 공간으로 주소값은 Stack 메모리에 저장,

실제값은 힙(Heap) 메모리 영역에 저장합니다.

 

int a = 10;
long b = 19;
Car c = new Car("kia", 100);
Stack(Runtime) Heap(G.C)
a 10 Car(new Car 로딩시 메모리에 생성)
b 19  
c    

예를 들어 아래 예제 코드 실행시에 주소값은 런타임 Stack, 실제값은 Garbage Collection에 Heap메모리에 저장된다.

 

# 리터럴 

리터럴은 그 자체로 값을 의미하는 것이다.

예를 들어 i = 10이라 할때, int인지 long인지 확실하게 알 수 없다. 그럴 때 long은 끝에 L,l을 붙여서 명시해주는 방식이 리터럴이다.

 

int year(변수) = 2020(리터럴);

 

Integer Literals

- long 타입은 L 로 끝나거나 l 로 끝나는 값

- 그외 나머지 숫자는 int

- 16진수 : 0x로 시작

- 2진수 : 0b 로 시작

ex. int i = 100_000_000_000; 표현 가능.

 

Floating-Point Literals

- float 타입은 F로 끝나거나 f로 끝나는 값

- 그 외 나머지 double (optional, D 혹은 d 로 끝나는 값)

 

Character and String Literals

- Unicode character 

  • 유니코드(와 모든 언어 코드)의 각 문자는 식별 가능한 Code Point라는 숫자를 가진다.(데이터베이스의 PK를 생각하면 된다.) 예를 들어 유니코드의 0번째 문자는 0번째 Code Point라고 부른다. 유니코드에서는 아래 형식으로 표현한다.
// 한글 문자인 '가'를 의미하는 Unicode Escape Sequence이다.
\uAC00

 

 

# 변수 선언 및 초기화하는 방법

class A{
	public int a;
}

class Main {
	public static void main(String[] args) {
		//primitive 타입 변수 선언 및 초기화
		int value = 10;

		//reference 타입 변수 선언 및 초기화
		A a = new A();
	
	}

}

컴파일된 바이트코드 소스로 OP코드 보기

ex. int i = 10;

 

실제 작업은 2줄로 진행.

- 나중에 멀티쓰레드시에 문제 발생할 수 있음.

 

# 변수의 스코프와 라이프타임

스코프는 변수의 범위라고 하는데, 선언된 블럭 위치에 따라서 달라진다.

class Hello{
    int instanceValue; //인스턴스 변수
    static int classValue; //클래스 변수(static, 공유 변수)

    void method() {
        int localValue = 0; //지역변수
    }
}

변수의 선언위치 생성시기

변수의 종류 선언위치 생성시기
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 인스턴스가 생성되었을 때
지역 변수 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블록 내부) 변수 선언문이 수행되었을 때

 

클래스 변수 : static 키워드를 붙힐 경우 클래스 변수가 되며, 모든 인스턴스가 값을 공유한다. global variable의 성격을 가진다.

인스턴스 변수 : 인스턴스 변수를 쓰기 위해서는 생성을 해야 한다.

지역 변수 : 매소드 종료와 함께 소멸.

 

 

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

 

  • 타입 프로모션 : 자신의 표현 범위를 모두 포함한 데이터 타입으로 변환.
  • 타입 캐스팅 : 자신의 표현 범위를 모두 포함하지 못한 데이터 타입으로 변환.
class Hello{
    public static void main(String[] args) {
        
        float float_v1 = 1.23f;
        long long_v1 = float_v1; // 표현 범위가 벗어났다.

        float float_v1 = 1.23f;
        long long_v1 = (long)float_v1; // 타입 캐스팅을 통해 해결한다.

    }
}

타입 프로모션의 경우 타입 캐스팅과 같이 어떤 데이터 타입으로 변환해야 하는지 명시하지 않아도 된다.

 

# 1차 및 2차 배열 선언하기

배열이란?

- 배열은 하나의 변수에 여러 값을 저장하는데 쓰이는 정적 리스트(Static List) 입니다.

- 배열의 크기는 int값으로 특정되어 있습니다.

- 배열의 저장공간은 0번부터 n-1개 까지 n개의 값을 특정 위치에 저장합니다.

- 배열의 요소마다 붙여진 일련번호를 Index(인덱스)라고 합니다.

 

public class main {
	public static void main(String[] args) {
    
        //1차원 배열 선언방법
		int[] numbers = new int[10];
		int numbers2[] = new int[10];
		int[] numbers3 = {1,2,3,4,5};
		int numbers4[] = {1,2,3,4,5};
		int[] numbers5 = new int[]{1,2,3,4,5};

		//2차원배열 선언방법
		int[][] numbers = new int[5][5];
		int numbers1[][] = new int[5][5];
		int numbers2[][] = {{1,2},{5,5},{3,4}};
		int numbers3[][] = new int[][]{{1,2},{5,5},{3,4}};
	}
}

# 타입 추론, var

타입추론(Type inference)란?

- 코드 작성당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것입니다.

- Lambda와 Generic에서 볼수 있습니다.

- JAVA 10에서 "var"라는 Local Variable Type-Inference가 추가되었습니다.

var

- JAVA 10부터 타입을 추론하는 var키워드가 추가되었습니다.

- 선언과 동시에 초기화(Initializer) 가 칠수적으로 요구됩니다.

- 지역변수로만 선언할수 있습니다.(지역변수로 하지 않을시 컴파일에러 발생)