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

kwang·2022년 6월 27일
0

Java-Live-Study

목록 보기
3/15
post-thumbnail

목표

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

학습할 것

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

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

아래의 표를 이용해서 각 타입의 명칭, 크기, 기본값, 범위를 알아보자.

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

Primitive type(기본형 타입)

  • 기본값이 있는 자료형으로 null이 존재하지 않는다. null 값을 가질려면 래퍼 클래스를 이용해야한다.

  • 총 8가지의 기본형 타입이 존재한다.

  • 기본형 타입은 스택(Stack) 메모리에 그 값이 저장된다.

  • 각 타입은 할당되는 메모리 크기가 있는데 그에 따라 값의 범위가 정해진다.

Reference type(참조형 타입)

  • 기본형 타입을 제외한 타입들이 모두 참조형 타입이다.

  • 값을 할당하지 않으면 기본값이 존재하지 않아 null이 할당된다.

  • 힙 영역에 참조형 타입의 변수들이 생성된다. 이 변수들은 실제 데이터가 아니다. 실제 데이터는 힙 영역에 생성되고 그 주소를 참조하는 변수이다.

  • ex) 배열, 클래스등이 있다.

리터럴

리터럴은 데이터 그 자체를 뜻한다. 그리고 변수의 값이 변하지 않는 데이터를 의미한다.

	int num = 10;

num 변수에 할당된 10이 리터럴이다.

10이 리터럴인건 알겠다. 그럼 num은? 변수와 상수에 대해서도 알아보겠다.

우선 num은 변수이다. 변수는 그 값이 계속 변할 수 있다. 하지만 상수는
final이라는 예약어를 붙여서 그 값이 절대 불변하게 사용할 수 있다.

	final int fi = 3.14;

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

변수의 선언은 자료형 변수명;과 같은 형식으로 선언하면 된다.

//변수의 선언
	int i;
    double d;
    char c;

초기화는 변수의 값을 할당하는 것을 말한다. 각 자료형을 초기화 해보자

정수형

정수 리터럴은 int타입이 기본 값으로 사용되기에 long타입은 L을 붙여준다.

int i = 10;
long l = 100L;

실수형

실수 리터럴은 double 타입이 기본 값으로 사용되기에 float에는 F를 붙여준다. double 타입에도 D를 붙여줄 수 있다.

double d1 = 1.01;
double d2 = 1.02D;
float f = 1.03F;

논리형

true 또는 false 또는 조건식으로 값을 할당할 수 있다.

boolean b1 = true;
boolean b2 = false;
boolean b3 = 4 < 9;

문자형

작은 따옴표로 문자를 표현하거나 '\u' 다음에 유니코드 값을 입력할 수 있다.

char c1 = 'A';
char c2 = '\uac00';    //'가'라는 문자 표현

문자열

큰 따옴표를 이용하여 할당할 수 있다.

String str = "String";

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

스코프는 영역을 의미한다.

Java에서 사용하는 변수들은 모두 사용 가능한 범위가 지정된다.

종류에 따른 변수의 스코프를 알아보자

지역 변수(Local variable)

  • 특정 지역에서 선언된 변수를 말한다. ex) 메서드, if문, for문등
  • 해당 지역이 호출되어 사용되고 나면 소멸한다.

전역 변수(Global variable)

  • 인스턴스 변수라고도 하며 클래스의 필드에 선언된다.
  • 해당 클래스 타입의 인스턴스가 생성되고 소멸할 때 같이 소멸된다.

클래스 변수(Static variable)

  • 클래스 변수, 정적 변수라고도 한다.
  • 클래스가 생성되어 프로그램이 종료될때까지 유지되는 변수이다.
  • static 예약어를 붙어 선언한다.
public class ValableScope {
    static int staticVal = 7;	// 스태틱 변수
    int globalScope = 10;	// 전역변수, 인스턴스 변수
    
    public void scopeTest(int value) {
    	int localScope = 10;	// 지역변수
        System.outprintln(localScope);	// 오류 X
    }
    
    public static void main(String[] args) {
    	System.outprintln(globalScope);	// 오류발생
    	System.outprintln(localScope);	// 오류발생
    	System.outprintln(staticVal);	// 사용가능
    }
}

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

type 변환

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

프로모션과 캐스팅

  • 프로모션 (자동 형변환) : 작은 데이터 타입에서 큰 데이터 타입으로 변환하는 것을 말한다. 아래의 이미지의 왼쪽에서 오른쪽 방향으로는 자동 형변환이 가능하다.
int i = 100;
long l = i;
float f = l;

자동으로 형변환이 되고 컴파일 에러가 나지 않는다.

  • 캐스팅 (명시적 형변환) : 큰 데이터 타입에서 작은 데이터 타입으로 변환하는 것을 말한다. 위에 이미지의 오른쪽에서 왼쪽방향으로 형변환을 할 경우는 어떻게 될까? 데이터의 크기가 작아지기 때문에 손실될 수 도 있다. 그래서 명시적으로 변환할 자료형을 표현해줘야 한다.
long l = 1000L;
int a = (int) l;

1차 및 2차 배열 선언하기

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

//크기 할당 & 초기화 없이 배열 참조변수만 선언
int[] arr;
int arr[];

// 선언과 동시에 배열 크기 할당
int[] arr = new int[5];
String[] arr = new String[5]; 

// 기존 배열의 참조 변수에 초기화 할당하기
int[] arr;
arr = new int[5]; //5의 크기를 가지고 초기값 0으로 채워진 배열 생성

// 선언과 동시에 배열의 크기 지정 및 값 초기화
int[] arr = {1,2,3,4,5}; 
int[] arr = new int[]  {1,3,5,2,4};    
int[] odds = {1,3,5,7,9};  
String[] weeks = {"월","화","수","목","금","토","일"};

// 2차원 배열 선언
int[][] arr = new int[4][3];   //3의 크기의 배열을 4개 가질 수 있는 2차원 배열 할당  
int[][] arr9 = { {2, 5, 3}, {4, 4, 1}, {1, 7, 3}, {3, 4, 5}};
//arr[0] >> {2, 5, 3};
//arr[1] >> {4, 4, 1};
//arr[2] >> {1, 7, 3};
//arr[3] >> {3, 4, 5};

타입 추론, var

타입추론

들어가기 앞서 해당 기능은 Java 10버전부터 사용가능한 방법이다.

변수의 타입을 명시적으로 작성하지 않아도 컴파일러가 컴파일시 리터럴 값을

확인하여 해당 데이터에 맞는 타입을 추론해주는 것을 말한다.

    public static void main(String[] args) {
//    	String str = "Hello";  기존 선언 방법
        var str = "Hello";
//      str = 10; String으로 추론 이미됨 불가능!  
        if (str instanceof String) {
            System.out.println("String입니다.");
        }
    }

var는 지역변수, 메소드 파라미터, 리턴 타입으로 사용 못하고 변수 선언시 초기화 값이 있을 경우 사용 가능하다.

위에 코드처럼 str이 String으로 타입 추론이 되고 나면 다른 자료형의 데이터를 할당하는 것은 불가능하다.

사실 다른 자료형을 직접 써주지 굳이 사용할 필요가 있을까싶다...

0개의 댓글