ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (2) 자바 데이터 타입, 변수 그리고 배열
    레거시/백기선의 Study Halle 2020. 11. 25. 16:44
    반응형

    백기선님의 온라인 스터디 "스터디 할래" 2주차 정리 문서입니다. 오라클 자바 공식 문서를 참고하였습니다.

    목표

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

    학습할 것

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

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

    프리미티브 타입 즉, 자바에서 제공하는 기본 타입은 다음과 같다.

    타입 범위 크기 기본 값
    byte -128 ~ 127 8bit(1byte) 0
    short -32768 ~ 32767 16bit(2byte) 0
    int -2^31 ~ 2^31-1 32bit(4byte) 0
    long -2^63 ~ 2^63-1 64bit(8byte) 0L
    float -1.4E-45 ~ 1.4E-45 32bit(4byte) 0.0f
    double -4.9E-324 ~ 4.9E-324 64bit(8byte) 0.0d
    char 0~65535 16bit(2byte) '\u0000'
    boolean true or false 8bit(1byte) false

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

    자바에는 기본 타입 외에 "레퍼런스 타입"이라는 것이 있다. 이른 바, "참조 타입"이라고 불리우는데, 개발자가 직접 만든 클래스, 자바에서 제공하는 라이브러리에 들어있는 클래스들이 그들이다. 쉽게 말해, new 연산자로 생성되는 것이 그들이다.

     

    쉽게 볼 수 있는 예는 String이다. 이 레퍼런스 타입들의 기본 값은 null이다. 만약, null인 레퍼런스 타입 변수를 사용하면 NullPointExecption을 발생시키니 주의하자.

    리터럴

    리터럴이란 소스 코드 내에서 직접 입력된 값을 리터럴이라고 부른다. 크게 다음과 같이 구분된다.

    • 정수 리터럴
    • 실수 리터럴
    • 문자 리터럴
    • 문자열 리터럴
    • 논리 리터럴

    정수 리터럴
    정수 리터럴은 소수점이 없는 숫자를 말한다.

    0, -42, 75

    그리고 2진수를 표현하는 리터럴도 있다.

    0b01, 0b10

    또한 8진수를 표현하는 것도 있는데 앞에 0을 붙인다.

    02, -017 

    또한 16진수를 표현하는 것도 있다. 0x를 쓴다.

    0x001, 0x02

    실수 리터럴
    실수 리터럴은 소수점이 있는 숫자를 말한다.

    0.25, -0.9992

    또한, E, e 로 지수/가수를 표현할 수도 있다.

    5E7, 0.12E-5

    문자 리터럴
    문자 리터럴은 문자형 char의 값들을 표현한다. '로 묶여서 사용된다. 여기서 유니코드 문자와 이스케이프 문자도 포함된다.

    'A', '한', '\t'

    문자열 리터럴
    문자열 리터럴은 문자열 String의 값들을 표현한다. "로 묶여서 사용된다.

    "test", "테스트"

    논리 리터럴
    논리 리터럴은 다음과 같이 2가지가 있다. true는 참, false는 거짓을 나타낸다.

    true, false

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

    변수 선언은 다음과 같이 할 수 있다.

    타입 변수;

    예를 들면 이렇게 할 수 있다.

    int a;

    변수 선언 후, 기본 값으로 이미 초기화되지만, "=" 연산자로 원하는 값을 초기화할 수 있다. 다음처럼 말이다.

    a = 5;

    이를 합칠 수도 있다.

    int a = 5;

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

    변순느 크게 지역 변수, 인스턴스 변수 그리고 클래스 변수로 나눌 수 있다. 먼저 지역 변수의 스코프는 선언된 {}안이다. 또한, 변수의 라이프 타임은 프로그램이 선언된 {}을 시작할 때, 생성되어 끝날 때 종료된다. 다음 코드를 보자.

    class Example {
        public void add(int a, int b) {
            int result = a+b;
            System.out.println(result);
        }
    }

    이 경우, 지역 변수 result는 블록이 시작하면서 라이프타임이 시작되어 result를 출력한 후 중괄호가 끝날 떄, 변수들의 라이프타임이 종료된다.(a, b 역시 지역 변수로 취급된다.)

     

    인스턴스 변수는 멤버 필드로 볼 수 있다. 클래스 내부의 모든 메서드 및 블록 외부에서 선언된 변수들을 뜻한다. 스코프는 static을 제외한 클래스 전체이며, 라이프 타임은 객체가 메모리에 존재할 때까지 지속된다.

    class Example {
        int x;
    
        public void set(int x) {
            this.x = x;
        }
    }

    이 경우 x가 인스턴스 변수이다. Example 클래스 밖에서는 사용할 수 없다. 또한, 객체가 생성되어 소멸될 때까지 라이프 타임을 유지한다. 만약 main이 다음과 같이 있다고 해보자.

    class Example {
        // ...
    
        public static void main(String[] args){
            Example e = new Example();
            e.set(5);
        }
    }

    이 경우 main 메소드가 실행되어 종료될 때까지 객체 e가 유지된다. 이 때 e의 인스턴스 변수들의 라이프 타임이 유지된다.

     

    마지막으로 클래스 변수가 있다. 클래스 변수의 스코프는 클래스 전체이며 라이프 타임은 프로그램이 끝날 때까지 혹은 클래스가 메모리에 로드되는 동안 유지된다. 인스턴스 변수보다 확장된 스코프와 라이프타임을 가지고 있다.

    class Example {
        // ...
        static int result;
    
        //...
    }

    여기서 result가 클래스 변수라고 볼 수 있다. 이 녀석은 클래스가 로드 되는 순간부터 프로그램이 종료되어 메모리에 클래스가 제거될 때까지 유지된다고 보면 된다. 또한, 클래스 어디에서든 이 변수를 사용할 수 있다.

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

    타입 변환은 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.

    • 타입 프로모션 : 자동 타입 변환
    • 타입 캐스팅 : 강제 타입 변환

    먼저 타입 프로모션은 큰 크기 타입 변수에 작은 크기 타입 값을 할당하면 자동으로 큰 크기 타입으로 값이 변하는 것을 말한다.

    byte b = 5;
    int i = b; // 타입 프로모션이 일어난다.

    타입 프로모션은 다음과 같이 변환한다.

    byte < short < int < long < float < double

    즉 short에 byte를 대입하면, short, double에 long을 넣으면 double로 변환한다.

    타입 캐스팅은 강제적으로 타입을 변환하는 것이다. 이 때 큰 타입도 작은 타입으로 타입 변환이 가능하다.

    long l = 300L;
    int i = (int)l;

    이 경우, 큰 타입 long 변수인 l은 작은 타입 int의 i에 맞게 int 타입으로 타입 변환되어 값이 들어간다. 즉 강제적으로 타입을 변환시킬 때 타입 캐스팅을 쓴다.

    1차 및 2차 배열 선언하기

    배열은 같은 타입을 여러 개 선언 및 저장할 때 사용한다. 예를 들어 다음과 같이 말이다.

    int[] arr = {1, 2, 3, 4, 5};
    int[] arr2 = new int[8];

    arr은 정수형 5개를 정수형 배열로 한 번에 선언한 것을 뜻한다. 1, 2, 3, 4, 5가 초기화된다. arr2의 경우는 int 의 기본 값인 0 8개로 초기화가 된다.

    이 때 원소들을 접근할 때 "인덱스"로 접근하는데 이 때 0부터 시작하는 것을 알아야 한다. 예를 들어 첫 번째 원소인 1을 접근하기 위해서는 다음과 같이 코드를 작성해야 한다.

    System.out.println(arr[0]); // 1
    arr[0] = 5; // 값 재 할당.

    또한 배열은 "길이"가 있는데 이는 생성될 때 고정된다. arr의 경우 길이가 5이다.

    System.out.println(arr.length); // 5

    arr, arr2는 1차원 배열이다. 다차원 배열도 가능한데, 2차원 배열을 간단하게 만들어보자.

    int[][] arr = {
        {0, 1},
        {2, 3}
    };

    이 경우, 0은 arr[0][0], 1은 arr[0][1], 2는 arr[1][0], 3은 arr[1][1]로 접근할 수 있다. 역시 new 연산자로도 생성이 가능하다.

    타입 추론, var

    자바 10부터는 타입 추론이 가능하다. 예를 들어서, 정수형 값을 생성한다고 해보자.

    int i = 10;

    이것이 원래 일반적이 변수 선언이다. 타입 변수명 = 값 형태로 변수를 선언해야 한다. 하지만 자바 10부터 다음과 같이 변수 선언이 가능하다.

    var i2 = 5;

    이 때 자바 컴파일러는 숫자 리터럴을 보고 정수형 타입임을 추론한다. 즉 i2 역시 int 타입이 된다. 이것이 타입 추론이며, 이를 지원하는 키워드가 var이다. 사실, 코틀린, 스칼라와 더불어 최신 프로그래밍 언어들은 모두 타입 추론이 가능하다. 심지어 C++조차도... 자바는 비교적 늦게 들어온 기능으로 볼 수 있다.

    '레거시 > 백기선의 Study Halle' 카테고리의 다른 글

    (5) 클래스  (0) 2020.12.19
    (4) 제어문  (0) 2020.12.05
    (3) 연산자  (0) 2020.11.25
    (1) JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가  (0) 2020.11.19
Designed by Tistory.