Java 타입과 변수 그리고 배열 (with 타입추론, var)

Chori·2021년 11월 2일
1

Java 기초

목록 보기
2/3
post-thumbnail

기본은 아무리 강조해도 부족하지 않다.


Primitive Type (기본형 타입)

종류 데이터형 크기(byte / bit) 기본값 표현 범위
논리형 boolean 1 / 8 false true 또는 false
문자형 char 2 / 16 \u0000 '\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터)
정수형 byte 1 / 8 0 -128 ~ 127
정수형 short 2 / 16 0 -32768 ~ 32767
정수형 int 4 / 32 0 -2147483648 ~ 2147483647( -21억 ~ + 21억)
정수형 long 8 / 64 0L -9223372036854775808 ~ 9223372036854775807(-100경 ~ + 100경)
실수형 float 4 / 32 0.0F 1.4E-45 ~ 3.4028235E38
실수형 double 8 / 64 0.0 4.9E-324 ~ 1.7976931348623157E308

기본형 타입은 총 8가지로 정의되어 있다.
각 타입별로 기본값이 존재하기 때문에, Null은 존재하지 않는다.
만약 기본형 타입을 객체로 만들어 Null을 기본값으로 설정하고 싶다면, 래퍼 클래스를 사용한다.
기본형 타입은 실제 값이 스택(Stack) 메모리에 저장된다.
컴파일 시점에 타입의 표현 범위를 넘어나는 값이 존재하면 컴파일 에러가 발생한다.


Reference Type (참조형 타입)

데이터형 크기(byte / bit) 기본값
배열(Array) 4 byte (객체의 주소값) null
열거(Enumeration) 4 byte (객체의 주소값) null
클래스(Class) 4 byte (객체의 주소값) null
인터페이스(Interface) 4 byte (객체의 주소값) null

기본형 타입을 제외한 모든 타입을 참조형 타입이라고 한다.
기본형 타입과 다르게 Null을 허용하며, 기본값으로 설정된다.
참조형 타입은 값이 힙(Heep) 메모리에 저장된다.

최상위 객체인 Object를 상속받으면 참조형이 된다.

java.lang.Object

참조형 타입으로 선언한 객체가 Null일 경우 문법에는 문제 없지만,
객체를 사용할경우 NullPointException(NPE)가 발생한다.

참고자료1
참고자료2


자바 리터럴

소스코드 내 직접 입력된 값(데이터)을 의미한다.
(변수 초기화 시 '저장할 값'도 해당된다.)

리터럴 종류

논리 리터럴 (boolean)

  • true, false 값만 가질 수 있다.

정수 리터럴 (byte, char, short, int, long)

  • 소수점이 없는 정수 리터럴은 10진수 ex) 0, 255, -256 등
  • 0으로 시작하는 숫자 리터럴은 8진수 ex) 01, -02 등
  • 0x, 0X로 시작하고 0~9, A~F, a~f로 구성된 리터럴은 16진수 ex)0x1, 0xA 등
  • long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙여 표시한다.
    (소문자 l은 1과 비슷하프로 대문자 L을 추천)

실수 리터럴 (float, double)

  • 소수점이 있는 정수 리터럴은 10진수 실수, 기본이 double 타입이다.
  • 숫자 뒤에 f(flout)이나 D(double)을 붙이면 명시적으로 선언할 수 있다.

문자(열) 리터럴 (char, String)

  • 문자 리터럴은 ' '로 문자를 표현한다.
  • 문자열 리터럴은 " "로 문자열를 표현한다.
  • 이스케이프(/) 문자를 사용하여 특수한 용도로 사용할 수도 있다.

참고자료1
참고자료2


변수 선언 및 초기화

자바에서 변수를 선언하기 위해서는 type(타입)을 지정하고 리터럴에 맞게 초기화를 해주어야 한다.

타입 변수명 = 초기화 할 값

int Age = 24;
double Height = 174.8;
char bloodType = 'A';
String name = "chori";

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

public class Test {
    int var1;  //전역 변수, 인스턴스 변수, 필드
    static int var2; //클래스 변수, 정적 변수
  	
    void testMe(int var3) { //매개 변수, 파라미터
    	int var4 = 0; //지역(로컬)변수
    }
}

스코프(Scope)

변수를 사용 할 수 있는 범위(영역)를 뜻하며,
변수를 선언했을 때 선언한 코드 블럭{ } 내에서 사용하는 것을 의미한다.

위 코드에서 Test 클래스에 선언된 전역 변수들은
클래스가 종료될 때까지 사용된다.

라이프타임(Life Cycle) = 생명주기

변수가 메모리에서 살아있는 기간을 의미한다.
스코프와 다른 점은 코드 블럭에 따른 생명주기가 아닌,
객체의 참조여부에 따라 생명주기가 결정 될 수 있다는 점이다.

위 코드에서 var1 변수는 인스턴스 변수로, 메서드 내에서 인스턴스화하여 사용할 수 있는 변수다.
이후 인스턴스 객체의 사용이 끝나고 참조가 없어지면, 가비지컬랙터(GC)가 메모리에서 삭제한다.


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

캐스팅(명시적 형변환)

큰 데이터에서 작은 데이터 타입으로 형변환 하는 것.

강제 형변환이라고도 하며, 작은 크기 타입 변수에 (작은 크기 타입)큰 크기 타입을 대입하여 형변환 한다.

double dNum = 123.12;
int num = (int)dNum;

강제 타입 변환을 할 때엔 값의 손실이 발생할 수 있으므로 주의해야 한다.

타입 프로모션(묵시적 형변환)

작은 데이터 타입에서 큰 데이터 타입으로 형변화 하는 것.

int num = 100;
long lNum = num;

byte, int 등의 타입은 char 타입으로 자동 형변환 할 수 없다.


1차 및 2차 배열 선언하기

1차원 배열 생성 방법

1) int[] num = new int[5]; //5개의 값을 저장 할 수 있는 배열 선언.
2) int[] num = {1,2,3,4,5};

2차원 배열 생성 방법

1) int[] num = new int[2][3]; //3개 크기의 배열을 2개 가질 수 있는 배열 선언.
2) int[] num = {{1,2,3},{4,5,6}};

타입 추론, var

java 10 버전 부터 타입 추론과 var를 사용할 수 있게 되었다.

타입 추론이란?

개발자가 명시적으로 변수의 타입을 지정하지 않아도,
컴파일러가 자동으로 변수의 타입을 리터럴 값으로 추론하는 것이다.
일반적으로 자바스크립트 등의 함수형 언어에서 지원하던 기능을 java 10버전 부터 사용이 가능하다.

var를 사용하는 이유

컴파일 시점에 var를 초기화된 값으로 보고 추론에서 바이트코드에 명시적으로 형을 선언한다.
즉 int 리터럴 값은 int로 명시하기 때문에 타입추론 변수를 읽을 때마다
타입을 알아내기 위한 연산을 하지 않는다는 것. 그로 인해 연산기능이 높아질 수 있다.

참고자료1


해당 포스트는 백기선 라이브 스터디 2주차를 참고하여 학습한 내용입니다.

profile
꾸준한 성장

1개의 댓글

comment-user-thumbnail
2021년 11월 2일

잘읽었습니다

답글 달기