Skip to the content.

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

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

         
  타입 할당되는 메모리 크기 기본값 데이터의 표현범위
논리형 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.4x10^38 ~ 3.4x10^38
double(기본) 8 byte 0,0 -1.7x10^308 ~ 1.7x10^308  
문자형 char 2 byte(유니코드) ‘\u0000’ 0 ~ 65,535

-프리미티브 타입

기본값이 있기 때문에 Null이 존재하지 않는다.만약 기본형 타입으로 Null을 넣고 싶다면 래퍼 클래스를 활용한다.

실제 값을 저장하는 공간으로 스택(Stack)메모리에 저장된다.

만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다.주로 문법상의 에러가 많다.

-레퍼런스 타입

기본형 타입을 제외한 타입들이 모두 참조형 타입이다.빈 객체를 의미하는 Null이 존재한다.

값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(Heap)메로리에 저장된다.

문법상으로는 에러가 없지만 실행시켰을때 에러가 나는 런타임 에러가 발생한다.예를 들어 객체나 배열을 Null값으로 받으면 NullPointException이 발생하므로 변수값을 넣어야 한다.

-리터럴

먼저 리터럴이란 데이터 그 자체를 말한다.

변수에 넣는 변하지 않는 데이터를 의미한다.

int a = 1;

여기서 리터럴은 1이다.즉 1과 같이 변하지 않는 데이터(boolean,char,double,long,int,etc…)를 리터럴이라고 부른다.

여기서 int 앞에 final을 붙일 시,a는 상수가 된다.

-상수

상수와 리터럴 둘 다 변하지 않는 값(데이터)를 의미한다.

코드적으로 말하자면 상수는 변하지 않는 변수라고 한다.

상수에 넣는 데이터는 숫자가 올 수도 있지만,클래스나 구조체 같이 기본형에서 파생된 객체나 유도형같은 데이터를 넣을 수 있다.

참조변수를 상수로 지정 할 때,참조변수에 넣은 인스턴스 안의 데이터까지도 변하지 않는 줄 착각 할 수 있지만

참조 변수가 상수(참조변수 메모리의 주소값이 변하지 않는다는 의미)지,그 주소를 가리키는 데이터들까지 상수라는 의미가 아니다.

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

일단 변수란 값을 저장할 수 있는 메모리 공간에 붙여진 이름이다.

변수선언의 형식1

int num;//변수형식 변수이름

변수선언의 형식2

int num = 10;//변수형식 변수이름 = 초기화할 값

초기화하는 법

int num;
num = 10;//이 부분이 초기화!

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

먼저 변수를 선언한다고 가정하자

public class Test{
int var1;
}

이 변수의 사용범위는 선언된 클래스의 중괄호 내에서 사용가능하다.이런 범위를 ‘스코프’라고 부른다.

이 상황은 스코프안에 스코프가 들어가는 상황이다.

Class안에 var1이란 변수가 선언 됐으면 var1의 스코프는 클래스 전체에서 놀수 있다.즉, foo()메소드 안에서도 들어갈 수 있다.

하지만 var2는 foo()메서드 안에서만 놀수 있다.꼭 메소드가 아니어도 상관이 없다.

-라이프타임

모든 변수는 생명주기라는 걸 가지게된다.클래스 내에서 선언하는 변수를 인스턴스 변수라고 하고,메소드 내에서 선언하는 변수를 지역변수라고 한다.

인스턴스 변수는 객체가 생성될 때,변수가 생성된다.

즉,현재 연습1클래스를 static main 메소드나 다른 클래스에서 인스턴스를 생성할때 생성 된다.

그리고 인스턴스는 참조가 없을 때 GC가 객체를 지워버리게 되는데 이때.인스턴스 변수도 같이 소멸된다.

매개변수는 예를들어 저 코드의 foo()의 메소드가 호출 될 때 var3가 생성되고 foo()의 메소드가 종료되는 시점에 var3로 소멸된다.

지역변수 로컬변수는 ‘{‘ 가 시작되는 시점에 생성되며 ‘}’로 끝나는 시점에 소멸된다.

마지막으로 클래스 변수인 정적변수는 클래스가 처음호출되면 생성이 되고 자바 어플리케이션이 종료되는 시점에 같이 소멸된다.

(여기서 static멤버들은 Static영역에 할당한다.

Static영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조 할 수 있는 장점이 있지만

GC가 관여를 할 수 없기때문에 프로그램의 종료시까지 메모리에 할당된 채로 존재하게 된다.

그렇기에 Static을 남발하면 시스템 성능에 악영향을 미치게 된다.)

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

하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환이라고 한다.

크게 두가지 방식으로 나눠진다.

묵시적 타입 변환(자동)

작은 그릇의 물을 큰 그릇에 옮겨 담을 때는 원래 물의 양이 보존되는 것과 같이 작은 데이터 타임에서 큰 데이터 타입으로 형변환을 하면

원본 데이터의 손실 없이 그대로 보존되기 때문에 자동 타입 변환이 일어난다.

byte가 가장 작은 그릇이고 double이 가장 큰 그릇이라고 생각하면 된다.

byte >> short/char >> int >> long >> float >> double
long var;
int n = 32555;
byte b = 25;
var = n; //int타입에서 long타입으로 자동 변환. var값은 32555
var = b; //byte타입에서 long타입으로 자동 변환. var값은 25

명시적 타입 변환(강제)

크 그릇의 물을 작은 그릇으로 옮겨 담을 때는 물이 넘쳐서 없어질수 있고 그대로 보존 될 수도 있다.

마찬가지로 큰 데이터 타입에서 작은 데이터 타입으로 타입 변환을 하게되면 데이터 손실이 발생할 수 있으므로

자동으로 타입 변환이 일어나지 않으며 개발자가 명시적으로 타입 변환을 지정해야 변환이 이루어 진다.

강제 타입 변환은 변환하고자 하는 타입을 ‘(‘ 와 ‘)’사이에 지정한다.

short car;
int n = 855638017; //n의 16진수 값은 0x33000001
var = (short)n; //int 타입에서 short타입으로 강제 변환

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

먼저 1차 배열의 선언법은 아래와 같다.

int[] arr = new arr[배열의 크기];
int[] arr = {1,2,3,4,5};

두가지로 선언을 할수 있으며 첫번째같은 경우에는 내용물이 아직 들어있지 않기 때문에 숫자 0이 들어 있다.

두번째와 같이 선언된 경우,인덱스0부터 차례대로 숫자가 들어간다.메모리의 형태를 그림으로 표현하였다.

2차 배열의 경우,

int[][] arr = new arr[행의 갯수][열의 갯수];
int[][] arr = arr[3][3];

1차 배열과 같이 두가지의 방법으로 선언되며 첫번째 방법은 1차배열처럼 0으로 채워져있다.

두번째 방법을 메모리의 형태로 그림을 그려보았다.

-타입 추론

타입 추론이란 정적 타이핑을 지원하는 언어에서,타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능이다.

타입 추론이 가능하다는 얘기는 타입을 명시하지 않아도 된다는 말이며,이 말은 곧 코드량을 줄이고 코드의 가독성을 높일수 있다는 것이다.

java 9 버전 이하에서는 다음과 같이 써야한다.

String name = "Virgil";

java 10버전 이상에서는 다음과 같이 타입 추론,var를 지원한다.

var name = "Virgil";

여기서 주의해야될 점이 vardhk <>연산자를 같이 사용하게 되면 컴파일 에러가 발생한다.

var name = new ArrayList<>();//컴파일 에러

그리고 IDE가 없으면 어떤 데이터 타입이 들어오는지 확인이 어렵다.