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

유재희·2021년 4월 2일
0

JavaStudyLive

목록 보기
2/4
post-thumbnail

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

프리미티브 타입(primitive type)은 메모리 공간에 직접 데이터를 담는 타입의 데이터 타입이다.

primitive type타입메모리기본값범위
정수형byte1 byte0-128~127
short2 byte0-32,768 ~ 32,767
int4 byte0-2,147,483,648 ~ 2,147,483,647
long8 byte0L-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
실수형float4 byte0.0F(3.4 X 10-38) ~ (3.4 X 1038)의 근사값
double8 byte0.0(1.7 X 10-308) ~ (1.7 X 308)의 근사값
문자형char2 byte(유니코드)'\u0000'0 ~ 65.535
논리형boolean1 bytefalseture, false

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

자바의 데이터 타입은 크게 프리미티브(primitive)타입과 레퍼런스(refernce) 나눠 진다. 이 둘의 가장 큰 차이로는 메모리를 참조 or 메모리공간에 직접 대입이다.

각각의 타입으로 변수를 선언시 그에 해당하는 메모리를 받게되는데 이 때 프리미티브 타입은 할당받은 메모리에 직접 변수를 담고 레퍼런스 타입은 다른 곳을 참조하는 주소값을 담는다.

(참조 이미지 링크:https://kingpodo.tistory.com/54)


3. 리터럴

리터럴이란 프로그램에서 직접적으로 표현되는 상수 값을 말한다. 실제로 저장되는 값 그 자체로 메모리에 저장되어 있는 변하지 않는 값이다. 간단하게 코드내에서 직접 쓴 값이라고 생각하면 편하다.

리터럴의 종류로는 정수, 실수, 문자, 문자열, 논리형 등이 있다.

int int_v1 = 0b10;	// ->2진수
int int_v2 = 010;	// ->8진수
int int_v3 = 10;	// ->10진수
int int_v4 = 0x10;	// ->16진수
long long_v1 = 10L;	// ->long타입 리터럴

//실수 타입 리터럴은 double타입으로 컴파일 되므로 
//float타입일 경우 f or F를 명시
float float_v1 = 1.1234F;	
double double_v1 = 1.234;
double double_v2 = 1.234d;
double double_v3 = 1234E-3d

char char_v1 = 'C';
char char_v2 = '유';

boolean boolean_v1 = true;
boolean boolean_v2 = 12 > 34;

String string_v1 = 'hello world!';
//모든 우항을 리터럴 이라고 부른다.

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

int num;
변수 선언

int num = 1;
변수 초기화

변수를 선언 하고 처음으로 값을 저장하는 것을 변수 초기화 라고 한다. 경우에 따라 변수 선언 후 바로 초기화를 할수도, 안 할수도 있지만 가능하다면 선언과 동시에 초기화를 하는 것이 바람직하다 멤버 변수는 초기화 하지 않아도 변수의 타입에 맞는 기본값으로 초기화가 가능하지만 지역 변수는 선언 후 사용하기 전에 반드시 초기화가 이루어져야 한다

class Init{
	int num;
    int sum = num;	//인스턴스 변수
    
    void method(){
    
    int x;		//지역 변수
    int y = x; // 에러(x 초기화 후 y에 초기화 가능)
    
    }
}
//컴파일러는 초기화 되지 않은 지역 변수에 기본값을 할당하지 않기 때문에 컴파일 타임 오류가 발생한다.

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

변수의 스코프(영역)이란?

변수에 접근하거나 접근할 수 있는 유효 범위/영역

일반적인 규칙은 변수가 선언된 블록내에서만 액세스 할 수 있다
{ var num = 10 ... }

public class Varcope{
	int num = 10;
    
    public static void main(String[] args){
    	int num = 20;
        System.out.println(num);
        
    }
}

위 코드를 실행하면 num의 값은 20으로 출력된다.

int num = 20;
main 블록 안에 이 문장이 없다면?

num의 값은 10으로 출력이 된다.
즉 호출된 순간 블록 내의 변수를 찾고 없다면 그 밖의 블록에서 변수를 참조하는 규칙이다.

변수의 라이프 타임(Life Time)이란?

변수가 메모리에서 살아있는 시간

지역변수 해당되는 블록 시작지점에서 종료지점까지 유효하다.
매개변수 해당되는 메소드 시작지점에서 메소드 종료지점까지 유효하다.

int sum(int num){//매개변수
	int num2;//지역변수
}

인스턴스 변수 클래스 안, 메소드/블럭 밖에서 선언된 변수이며 클래스의 인스턴스가 생성되고 참조될때까지 유효하다.

public class Life{
	int var; //인스턴스 변수
    {
    	int localVariable; //지역변수
    }
    
    int helloLife(int time){ //매개변수
    	int time; //지역변수
    }	
}

public class Lifes{
	public static void main(String[] args){
    	Life now = new Life();//인스턴스 생성 now.time 생성됨
        now = null; //Life class 참조 해제
        //GC...now.time소멸
    }
}

클래스 변수 데이터 타입 앞에 static을 붙여 정적 데이터로 JVM이 클래스를 참조하여 프로그램이 실행된 후부터 종료 될때까지 유효하다.

public calss Life{
	static int classV = 10;
    
    public static void main(String[] args){
    	System.out.println(classV); //결과값 : 10
    }
}

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

자바를 포함한 여러 프로그래밍 언어에는 데이터 타입을 변환해주는 캐스트 연산자가 존재한다.
캐스트 연산자를 이용한 타입 변환에는 두 가지로 설명 할 수 있다.

  • 타입 캐스팅(명시적 형 변환)
  • 타입 프로모션(묵시적 형 변환)

타입 캐스팅은 저장 공간이 큰 데이터를 작은 데이터로 형 변환시 사용되는 기법이다.
자동 형 변환이 불가능하여 개발자가 명시적으로 선언을 해줘야 형 변환이 이루어진다.

public class Type{
	public static void main(String[] args){
    	int casting = 10;
        
        byte ref = casting; // 에러 발생
        
        byte ref = (byte)casting //명시적 형 변환 (casting) 실행가능 
    
    }
}

타입 프로모션은 저장 공간이 작은 데이터를 저장 공간이 큰 데이터로 형 변환하는 것을 뜻한다.
작은 데이터가 큰 데이터로 변환 되는 과정은 자동으로 변환되어 저장이 가능하기 때문에 개발자가 따로 명령을 선언할 필요가 없다.

public class Type{
	public static void main(String[] args){
    	int promo = 10;
        
        long ref = promo; //실행 가능 
    }
}

자동 형 변환이 되는 데이터 크기의 순서는 이렇다.

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8) (byte)

여기서 왜 8바이트인 long이 4바이트인 float으로 자동 형 변환이 가능한 것일까?

float은 부동 소수점으로 인한 표현 크기가 더 크기 때문이다.


7. 1차원 배열과 2차원 배열의 선언

배열이란?

  • 배열은 같은 데이터 타입인 데이터들을 선형으로 모아놓은 자료구조이다.
  • 배열에 저장된 각 데이터에 접근 할때는 index로 구분하여 접근 한다.
  • 배열은 하나의 공간을 갖게 되고 그 공간에 값을 저장하는게 아니라 다른 공간에 저장한 후 그 공간의 주소를 저장한다(참조형)

배열의 선언


int[] Arr = new int[10];		//선언과 동시에 메모리 크기 할당
int[] Arr = {1, 2, 3, 4, 5};		//선언과 동시에 값을 대입
int[] Arr;

선언과 동시에 메모리 크기를 할당할 수 있고 값을 선언하며 초기화도 가능하다.

선형 자료구조의 하나로 동일한 타입의 데이터를 연속적으로 저장하여 하나의 변수로 묶어서 관리하기 위한 자료구조

  • 배열의 선언
class Arr{
	
    int[] integerArr;
    int intergerArr[]; //크기 할당, 초기화 없이 참조 변수만 선언
    
    int[] integerArr = new int[10]; //선언과 동시에 배열의 크기까지 할당
    
    int[] integerArr = {1, 2, 3, 4, 5}; //선언과 동시에 크기 할당 및 초기화
    
}
  • 2차원 배열의 선언
calss Arr2{
	int[][] integerArr2 = new int[5][5];
    
   	int[][] integerArr2 = {{1,2,3},{4,5,6},{7,8,9}};
}

2차원 배열은 행렬을 응용한 문제를 해결하거나 2차원내에서 어떤 문제들을 해결할 때 등 여러가지로 활용된다.

ex)
0 0 0 0 0 0 = {{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,1}}
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1


8. 타입 추론, var

자바 10 버전부터 타입 추론 기능이 추가되었다.

소스코드에 타입을 명시하지 않아도 컴파일러가 컴파일 과정에서 데이터의 타입을 유추하는 기능이다. method 호출 및 선언과 variable 혹은 object 선언을 통해 실제 타입을 추론하는 형식이다.


var a = "hello" 	// String a = "hello"로 유출
var b = 10 	 	// int a = 10으로 유출

참고 URL
https://gbsb.tistory.com/6
https://blog.naver.com/hsm622/222144931396
https://league-cat.tistory.com/411

profile
몰라요

0개의 댓글