목표
  • 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  • 프리미티브 타입과 레퍼런스 타입
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언하기
  • 타입 추론, var

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

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

타입(Data type)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 것입니다. 자바에서 타입은 크게 기본형 타입과 참조형 타입이 있습니다.

  • 기본형(primitive type): 논리형, 문자형, 정수형, 실수형이 있다. 계산을 위해 실제 값을 저장합니다.
  • 참조형(reference type): 객체의 주소를 저장한다. null 또는 객체의 주소(4byte, 0x0 ~ 0xffffffff)를 갖는다.

프리미티브 타입

  • 총 8가지의 기본형 타입(Primitive type)을 미리 정의하여 제공합니다.
  • 기본값이 있기 때문에 Null이 존재하지 않는다. 만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용합니다.
  • 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장됩니다.
  • 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생합니다. 주로 문법상의 에러가 많습니다. (예를 들어 ;을 안붙였다는 이유로 빨간 줄이 쳐지는 경우)
  • 자바의 데이터 타입(Primitive type)의 유의사항과 응용

레퍼런스 타입

  • 기본형 타입을 제외한 타입들이 모두 참조형 타입(Reference type)입니다.
  • 빈 객체를 의미하는 Null이 존재합니다.
  • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(Heap) 메모리에 저장됩니다.
  • 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생합니다. 예를 들어 객체나 배열을 Null 값으로 받으면 NullPointException이 발생하므로 변수값을 넣어야 합니다.

리터럴

리터럴은 데이터 그 자체를 뜻 한다. 변수에 넣는 변하지 않는 데이터를 의미하는 것입니다.

int a = 1;

int 앞에 a는 변수이고, 여기서의 1은 리터럴입니다. 즉, 1과 같이 변하지 않는 데이터(boolean, char, double, long, int, etc...)를 리터럴(literal)이라고 부릅니다.

정수 - integer

  • 가장 일반적으로 사용되는 데이터 자료형입니다. 모든 임의의 정수 값은 정수 리터럴입니다. 예를 들어 1, 2, 3, 42는 정수 리터널입니다. 이런한 값들은 10진수이나, 8진수나 16진수를 사용할 수도 있습니다.
  • 8진수는 숫자 0을 앞에 표시하고 숫자를 표시한다. 일반 10진수에는 0을 표시하지 않기 때문에 07과 7은 다른게 인식합니다.
  • 16진수는 0x(또는 0X)를 먼저 적고 16진수 상수를 지정합니다. 범위는 016까지 이며 af(AF)가 1015까지를 대신한다.
  • 모든 정수형 데이터가 기본적으로 int형이기 때문에 long 데이터 자료형에 정확한 long 리터럴을 지정하기 위해서는 숫자 뒤에 알파벨 l(또는 L)를 추가 해줘야 합니다.
  • byte와 short 변수에 숫자를 저장할 때 저장되는 숫자의 범위가 해당 데이터 형의 자료형에 포함된다면 에러가 발생하지 않습니다.

부동 소수점 - floating point

  • 부동 소수점 리터널은 소수점 이하(분수)를 가진 10진 값들입니다. 예를 들어 2.0, 3.1415, -0.6667은 모두 부동 소수점 리터널입니다.
  • double형 자료형은 부동 소수점의 기본형입니다. 숫자 뒤에 알파벨 d(또는 D)를 추가할 수도 있습니다.
  • float형 자료형은 부동 소수점의 기본형입니다. 숫자 뒤에 알파벨 d(또는 D)를 추가할 수도 있습니다.

부울 - boolean

  • 부울 상수는 두개의 논리적인 값, true(참), false(거짓)만 있습니다. C/C++에서와 같이 참, 거짓을 숫자로 표시 할 수는 없습니다.

문자 - character

  • 자바의 모든 문자들은 Unicode를 사용합니다. 정수로 변환될 수 있으며, 더하고 빼는 거와 같은 연산도 가능합니다.
  • 정부 형태가 아닌 문자 리터럴을 표시하고자 할 때는 단일 인용 부호(,)를 사용합니다.
  • 유니코드나 직접 입력이 불가능한 문자들에 대해서는 역슬래쉬( \ )를 이용하여 표시할 수 있습니다.
escape 시퀀스 설명
\ddd 8진 문자 (ddd)
\uxxxx 16진수 Unicode 문자 (xxxx)
\` 단일 인용 부호
\" 이중 인용 부호
\ 역슬래쉬
\r 캐리지 리턴
\n 뉴 라인(또는 라인 피드)
\f 폼 피드(form feed)
\t 탭(tab)
\b 백스페이스(backspace)

문자열 - string

  • 문자열 리터널은 이중 인용 부호(", ")로 지정하여 사용합니다.

    String str = "안녕하세요.";

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

변수(variable)

값을 저장할 수 있는 메모리상의 공간.

변수 선언

int num; // int: 변수 타입, num: 변수 이름
  • 변수 타입은 변수에 저장될 값이 어떤 타입인지를 지정하는 것입니다.
  • 변수 이름은 변수에 붙인 이름입니다.
  • 변수는 '값을 저장할 수 있는 메모리 공간'이므로 변수의 이름은 메모리 공간에 이름을 붙여주는 것입니다.
  • 이름을 이용해 저장공간(변수)에 값을 저장하고, 저장된 값을 읽어올 수 있습니다.

변수를 선언하면 메모리의 빈 공간에 변수타입에 맞는 크기의 저장공간이 확보되고, 앞으로 이 공간은 변수이름을 통해 사용할 수 있게 된다.

변수의 초기화

  • 변수를 사용하기 전에 처음으로 값을 저장하는 것입니다.
  • 알 수 없는 값(쓰레기값, garbage value)이 남아 있을 수 있기 때문에 변수를 사용하기 전에 반드시 초기화(initialization)를 해야합니다.
  • 변수에 값을 저장할 때는 대입연산자 '='를 사용합니다.
  • 오른쪽의 값을 왼쪽(변수)에 저장하라는 뜻이빈다.
int x;   // 변수의 선언
x = 0;   // 변수의 초기화

int x = 0;  // 변수 x를 선언하고 0으로 초기화 한다.

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

변수의 스코프는 변수에 접근할 수 있는 프로그램 영역을 가리킨다. 라이프타임은 변수 혹은 레퍼런스의 '유효범위'이다. 변수가 메모리에 얼마나 유지되어있는가의 정도라고도 볼 수 있다.

https://www.learningjournal.guru/article/programming-in-java/scope-and-lifetime-of-a-variable/
public class scope_and_lifetime {
    int num1, num2;   //Instance Variables
    static int result;  //Class Variable
    int add(int a, int b){  //Local Variables
        num1 = a;
        num2 = b;
        return a+b;
    }
    public static void main(String args[]){
        scope_and_lifetime ob = new scope_and_lifetime();
        result = ob.add(10, 20);
        System.out.println("Sum = " + result);
    }
}

인스턴스 변수

클래스안에 있지만 다른 메서드 밖에 선언된 변수를 인스턴스 변수라고 한다.

  • scope : static method를 제외한 클래스어디서나 사용가능
  • lifetime : 클래스 객체가 메모리에 남아있을때 까지

클래스 변수

클래스안에 선언되고 static으로 선언된 변수를 클래스변수라한다.

  • scope : 클래스안에 어디서나 사용가능
  • lifetime : 프로그램이 끝날때까지

지역변수

클래스변수와 인스턴스 변수가 아닌 모든 변수들을 지역변수라 한다.

  • scope : 선언된 블록안에서만 가용가능
  • lifetime : 블록이 컨트롤될때까지

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

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

서로 다른 타입간의 대입이나 연산을 할 때 형변환으로 타입을 일치시켜서 하는것이 원칙입니다.

타입은 아래의 두 가지 방법으로 변환될 수 있습니다.

타입 프로모션 (자동형변환)

표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우, 값손실이 없으므로 두 타입중에서 표현범위가 더 넓은 쪽으로 자동으로 형변환됩니다.

왼쪽에서 오른쪽으로의 변환은 형변환 연산자를 사용하지 않아도 자동 형변환이 되며, 그 반대 방향으로의 변환은 반드시 형변환 연산자를 써줘야 합니다.

캐스팅 (명시적 형변환)

캐스팅은 더 큰 범위의 타입 값을 더 작은 범위의 타입값에 할당하기 위해서 반드시 축소(캐스팅)를 해줘야 합니다.

이것은 자동형변환할 수 없는 호환되지 않는 데이터 유형에 사용할 수 있습니다. 타입을 명시해줘서 강제적으로 형변환(캐스팅) 해 줄 수 있습니다.

1차 및 2차 배열 선언하기

public class Test {

    public static void main(String[] args) {

        // 1차원 배열 생성
        int[] arr1 = {1,2,3,4,5};

        // 또다른 1차원 배열 생성 (값 입력 안됨)
        int[] arr1 = new int[5];

        // 2차원 배열 생성
        int[][] arr2 = {{1,1,1,1,1},{2,2,2,2,2}};

        // 2차원 배열 생성 (값 입력 안됨)
        int[][] arr2 = new int[2][5];
    }
}

타입 추론, var

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

자바 10부터 타입 추론을 지원하는 var키워드가 추가되었습니다. 이 키워드는 local variable이면서 선언과 동시에 초기화가 필수적으로 요구됩니다.

장점

  • 생산성 향상, 가독성 좋음, 인스턴스 객체의 타입이 바뀌어도 생성되는 클래스부분은 수정하지 않아도 됩니다.
  • Object대안 가능, 람다식, 익명클래스 등에서 활용 가능.

단점

  • IDE에따라 바로 타입 확인이 어렵습니다.
  • 해당 위치만 보고 어떤 타입의 데이터가 할당될지 알 수 없을 수도 있습니다.(변수명을 var checkList 등 의미있는 네이밍으로 어느정도 보완 가능)
참조

+ 따끈한 최근 게시물