ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [live-study] 2주차 :: 자바 데이터 타입, 변수 그리고 배열
    JAVA/라이브 스터디 | whiteship 2020. 12. 26. 13:47

    https://youtu.be/HLnMuEZpDwU

    참고도서 : Java의 정석, Java in a Nutshell

     

    0. 변수

    변수란?
    • 변수(Variable)은 단 하나의 값만 저장할 수 있는 메모리 공간으로써, 저장된 값은 변경될 수 있으므로 "변수"라고 부른다.

     

     

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

    프리미티브(Primitive) 타입이란?
    • 자바에는 총 8개의 기본형 데이터 타입이 있다. 
    • 크게 논리, 문자, 정수, 실수로 나눌 수 있다.
    • 기본 자료형의 종류와 크기, 범위는 아래와 같다.
    분류 타입 디폴트 크기 범위
    논리형 boolean false 1byte 8bit false, true
    문자형 char \u0000 2byte 16bit \u0000 ~ \uFFFF
    정수형 byte 0 1byte 8bit -128 ~ 127
    short 0 2byte 16bit -32,768 ~ 32,767
    int 0 4byte 32bit -2^31 ~ 2^31-1
    long 0 8byte 64bit -2^63 ~ 2^63-1
    실수형 float 0.0 4byte 32bit 1.4E-45 ~ 3.4E38
    double 0.0 8byte 64bit 4.9E-324 ~ 1.8E308

    +) 실수형의 범위는 "양의 범위"만 적은 것으로, 음의 부호 "-"를 붙이면 "음의 범위"가 된다.

    +) 일반적으로 정수형을 저장할 때 int형을 사용하지만 숫자가 9자리가 넘어가면 long형을 사용한다.

     

    논리형
    • boolean형 하나가 있다.
    • truefalse 둘 중 하나의 값을 가질 수 있으며, default는 false이다.
    • 대소문자를 구분해 True 또는 False로 사용 할 수 없다.
    1
    boolean flag = true;
    cs

     

    문자형
    • char형 하나가 있다.
    • 문자를 저장할 수 있는 타입으로, 하나의 문자만 저장할 수가 있다.
    1
    char ch = 'A';
    cs

     

    정수형
    • byte : 1byte
    • short : 2byte
    • int : 4byte (default data type)
    • long : 8byte
    • 정수형 변수를 선언할 때는 범위를 생각해서 4개의 정수형 중 하나를 선택해야 한다. 예를 들어 byte(-128 ~ 127)형의 변수를 선언하고, byte의 범위를 넘어가도록 숫자를 더하면 어떻게 될까. 아래와 같이 127 + 1이 128이 아니라 -128이 되는 것을 볼 수 있다. 에러가 나지 않고 예상하지 못한 값이 나오는 것을 볼 수가 잇는데, 이를 오버플로우(overflow)라고 한다. 해당 타입(byte)가 표현할 수 있는 값의 범위를 넘어갔기 때문에 생기는 현상이다.

    실수형
    • float : 4byte | 7자리 (정밀도)
    • double : 8byte | 15자리 (정밀도)
    • 실수형은 오차가 발생 할 수 있으므로 정밀도(precision)가 중요하다. float의 정밀도는 7자리인데 이 말은 곧 7자리의 10진수를 오차없이 저장할 수 있다라는 뜻이다. 만약 그 이상의 정밀도가 필요하다면 float형이 아닌 double형을 써야한다.


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

    기본형(Primitive)와 참조형(Reference)
    • 프리미티브 타입은 앞서 설명한 것처럼 논리형, 문자형, 정수형, 실수형 총 8개의 데이터 타입에 값을 저장할 수 있는 타입이다.
    • 레퍼런스 타입은 프리미티브 타입이 실제 값을 저장하고 있는 것과 달리, 어떠한 객체의 주소를 저장하고 있다. (기본형 8개를 제외한 나머지 타입)
    레퍼런스 타입
    • 레퍼런스(Reference) 타입은 객체의 주소를 저장하므로 어떠한 클래의 이름을 변수의 타입으로 사용한다. 
    • 아래 코드는 Date 클래스 타입의 참조변수 now를 선언하고 초기화를 한 것이다. 아래와 같이 사용하게 되면 now라는 변수에 새로 생성된 Date 타입의 객체의 주소가 저장된다.

    Date now = new Date();

     


    3. 리터럴

    상수(Constant)란
    • 값을 저장할 수 있는 메모리 공간이며, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경이 불가능하다.
    • 상수를 선언하는 방법은 변수와 동일하며 '변수타입' 앞에 'final'이라는 키워드를 붙여주면 된다. 
    • 상수는 선언과 동시에 초기화를 해야하며 그 이후에는 값의 변경이 불가능하다.
    • 이름은 대문자로 하는 것이 관례이다.
    1
    final int MAX_VALUE = 30;
    cs

     

    리터럴(Literal)이란
    • 자바의 소스 코드 내에서 직접적으로 표현되는 상수 값을 말한다. (1, 1.0, '1', "str", true ..)
    • 프로그래밍에서 "상수(Constant)"는 이미 다른 의미로 사용되고 있는 용어 이므로, 이를 구분 짓기 위해서 리터럴 이라고 표현한다.
    • 즉, 아래에서 MAX_VALUE는 상수이고, maxValue는 변수가 되며, 20과 30은 리터럴이 된다. 

    final int MAX_VALUE = 30;

    int maxValue = 20;

    • 리터럴에도 변수와 마찬가지로 타입이 존재한다.
    분류 리터럴 접미사
    논리형 true, false -
    정수형 123, 100L L
    실수형 3.14 f, d
    문자형 'A' -
    문자열 "Hello" -



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

    변수 선언
    • 변수는 "변수 타입"과 "변수 이름"으로 구분 지을 수 있다.
    • 변수 타입은 말 그대로 변수에 저장될 "타입(type)"을 지정하는 것이다.
    • 변수 이름은 그 변수에 붙여줄 이름을 말하는 것이다. 당연히 같은 이름의 변수가 존재해서는 안되며, 이름을 정할때도 규칙이 존재한다.

    int age = 40;

    boolean flag = false;

    변수 명명 규칙
    • 자바 예약어는 사용할 수 없다. (예약어 참조)
    • 문자의 길이 제한은 없다. 
    • 첫 문자는 영어 소문자로 시작하며, 단어 여러개를 붙여서 쓰는 경우 각 단어의 첫 문자를 대문자로 한다. (관례, camelCase)
    • 영어 대소문자는 구분된다. (value != Value)
    • 첫 번째 글자는 문자이거나 $, _ 이어야 하고, 숫자는 맨 앞에 나올 수 없다. (ex. value, $value, _value, maxValue)

     

    초기화(Initialization)
    • 변수는 값을 저장할 수 있는 메모리 공간이므로, 쓰레기 값(알 수 없는 값)이 남아있을 수도 있어 적절한 값으로 초기화를 해야한다.S
    • 변수는 종류에 따라 초기화를 생략할 수도 있지만, 해주는 것이 좋다. 
    • 수학에서 "="의 의미는 같다라는 의미지만, 여기서 "="의 의미는 대입 연산자로서 값을 저장하라는 의미로 사용된다. 즉, "=" 연산자를 기준으로 왼쪽에는 변수가 선언되어 있고, 오른쪽에는 그 변수에 넣을 값을 넣어주면 변수에 값을 저장할 수가 있다.
    • 아래와 같이 변수를 초기화 해주게 되면, age라는 변수가 int형으로 선언이 되고, 40으로 초기화가 되어 메모리에 저장이 되었다라는 의미가 된다.

    int age = 40;



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

    변수의 스코프와 라이프타임
    • 변수는 중괄호 { } 블록 내에서 선언되고 사용된다.  변수가 사용될 수 있는 이러한 범위를 스코프(Scope)라고 한다.
    • 아래와 같이 변수가 if문의 중괄호 내부에서 선언이 되었다면, 그 밖에서는 사용할 수가 없다. 만약 해당 중괄호 밖에서 접근 시 "cannot be resolved to a variable"이라는 에러가 발생한다.
    • 그 이유는 { } 이러한 블록 내부에 선언된 변수를 지역변수(Local Variable)이라고 하는데, 이 변수는 선언된 블록을 벗어나기 전까지만 라이프타임이 유지된다.

    • 하지만 만약에, 아래와 같이 sum이라는 변수가 클래스 변수(Class Variable)로 선언이 되어 있다면, 에러 없이 원하는 값을 얻을 수 있다.
    • 그 이유는 클래스 변수는 클래스 전체에서 접근이 가능하며, static으로 선언된 이 변수는 프로그램이 실행될 때 java 메모리에 할당되며, 프로그램 종료시 해제된다.


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

    타입 변환 
    • 타입 변환이란 말 그대로 어떠한 변수나 리터럴의 타입을 변환하는 것이다.
    • 두 가지 종류가 있는데, 하나는 자동 타입 변환(Promotion)이고, 다른 하나는 강제 타입 변환(Casting)이다.
    캐스팅 (Casting)
    • 캐스팅은 강제 타입 변환으로, 형변환하고 싶은 변수나 리터럴 앞에 변환하고자 하는 타입을 붙여줘서 강제로 변환하는 것이다.
    • 아래와 같이 double형의 변수를 int형으로 강제로 변환할 수 있다.

     

    타입 프로모션(Promotion)
    • 타입 프로모션은 위와 같이 강제로 변환이 이루어지는 것이 아니라, 컴파일러가 알아서 생략된 형변환을 자동적으로 추가할 수 있다.
    • 아래와 같이 double형의 변수에 정수값을 넣었고, 형변환을 생략했지만 문제 없이 실수형태로 출력 되는 것을 볼 수 있다.

    • 하지만, 모든 타입을 자동적으로 형변환하는 것은 아니다. 
    • 아래와 같이 byte의 범위를 벗어나는 값을 저장하려고 하는 경우, 형변환을 하지 않으면 "cannot convert from int to byte"와 같은 에러가 발생한다.

    • 그래서, 자동 형변환은 규칙이 있다. 범위가 작은 크기의 타입에서 넓은 크기의 타입으로만 자동형변환이 가능하다.

    자동 형변환이 가능한 경우

    • long은 8 byte이고 float는 4 byte인데, long에서 float로 형변환이 가능한 이유는 실수형이 정수형보다 표현 할 수 있는 값의 범위가 더 크기 때문이다.

    long->float



    7. 1차 및 2차 배열 선언하기

    배열이란
    • "같은 타입"의 여러 변수를 하나로 묶은 것이다.
    배열의 선언
    • 배열을 선언하는 방법은 두 가지가 있다. (1차원)
    • 첫번째로는 타입명에 [] 를 붙이는 방법이고
    1
    2
    int[] arr;
    String[] arr2;
    cs
    • 두번째로는 변수이름에 []를 붙이는 방법이다. (+ 개인적으로는 이 방법을 선호한다.)
    1
    2
    int arr[];
    String arr2[];
    cs
    배열의 생성
    • 배열을 선언한 후 아무것도 하지 않으면 배열을 사용할 수도 없고 exception이 떨어질 것이다. 그래서 배열을 생성해야지만 실제로 값을 저장할 수 있는 공간을 만들 수가 있다. 배열을 생성할 때에는 키워드 "new"를 사용하여 타입과 길이를 함께 지정해주면 된다.
    • int타입의 arr라는 이름을 가지며 값을 5개 저장할 수 있는 배열을 만들고자 한다.
    1
    2
    3
    4
    5
    6
    //1. 선언과 생성 분리
    int arr[];
    arr = new int[5];
     
    //2. 선언과 생성 동시 (보통 이렇게 많이 쓴다)
    int arr[] = new int[5];
    cs
    1차원 배열
    • 위의 예시로 든 배열을 우리는 "1차원 배열"이라고 부른다.

    int arr[] = new int[5];

    배열의 인덱스
    • 배열은 여러 변수를 하나로 묶은 것으로, 각각의 값은 자신들만의 저장공간을 갖게 된다. 우리는 이를 배열의 요소(element)라고 부른다. 그리고 각각의 값은 배열이름[인덱스]와 같은 방법으로 접근 할 수 있다.
    • 인덱스(index)는 각 배열의 요소들을 구분하기 위한 번호이다. 인덱스의 범위는 0으로 시작하여 배열길이-1까지이다.
    • 처음 배열을 생성하면 초기화 된 상태로 각 타입에 맞는 값이 초기 값으로 저장되어 있다. (int배열의 경우 0)

    • 변수와 마찬가지로 배열의 값도 변경이 가능하다. 예를 들어 2번째 인덱스의 값을 1로 바꾸고 싶으면 아래와 같이 할 수 있다. 

    arr[2] = 1;

    2차원 배열
    • 1차원 배열 뿐만 아니라 2차원 이상의 다차원 배열도 선언하고 사용할 수 있다.
    2차원 배열의 선언과 생성
    • 1차원 배열과 마찬가지로 선언방법에는 타입명에 []를 붙이거나 변수이름에 [] 를 붙이는 방법이 있다. 다만 2차원 배열이기 때문에 대괄호를 두 번 [][] 써주어야한다.
    1
    2
    3
    4
    5
    6
    7
    8
    //1. 타입명에 [][]를 붙여준다.
    int[][] arr;
     
    //2. 변수이름에 [][]를 붙여준다.(이 방법을 선호한다)
    int arr[][];
     
    //3. 타입과 변수이름에 [][]를 붙여준다.
    int[] arr[];
    cs

     

    • 1차원 배열과 마찬가지로 선언 후 생성을 해주어야 배열에 접근이 가능하다.  아래와 같이 하면, 2행 3열의 2차원 배열을 생성 할 수 있다.

    int arr[][] = new int[2][3];

     

    0 0 0
    0 0 0
    • 배열의 인덱스에 접근 하는 방법도 동일하다. arr[0][2]의 숫자를 1로 바꾸고 싶으면 아래와 같이 할 수 있다.

    arr[0][2] = 1;

    0 0 1
    0 0 0


    8. 타입 추론, var

    타입 추론(Type Inference)
    • 타입 추론은 말 그대로 데이터 타입을 명시하지 않아도 자바 컴파일러가 타입을 추론할 수 있다라는 의미이다.
    • 자바 10 이전에는 익숙한 방식으로 타입을 명시적으로 선언하였었다.
    var
    • 자바 10에서 추가된 초기화 값이 존재하는 Local Variable 로 선언된다.
    • Member variable, Method parameter, return type 등으로 사용할 수 없다.
    • 초기화도 반드시 필요하다.
    • 아래와 같이 var로 변수를 선언하였다. 타입을 명시하지 않았지만 자바 컴파일러가 초기화된 값을 기준으로 변수의 타입을 추론할 수 있다.

    var str2 = "Hello World";

     

     

     

     

    참고자료

     

    댓글

Programming Diary