본문 바로가기

Programming/Java

[Online Study 2주차] 자바 데이터 타입, 변수, 그리고 배열

[학습 주제]

 

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

 

[학습 목표]

 

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

 

 

[학습 내용]

 

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

 

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

 

1.  기본형 타입(Primitive Type)

 

 -  사전에 정의해놓은 8가지 데이터 타입

 

 -  저장 공간에 실제 리터럴 형태의 값이 저장 

 

 Ex) int, char, short. long, float, double, boolean, byte

 

값의 종류 Type 크기(byte) 범위
정수 byte 1 8bit ( -128 ~ 127 )
short 2 16bit( -32768 ~ 32767 )
int 4 23bit ( -2147483648 ~ 2147483648 )
long 8 64bit
문자 char 2 16bit( 0~ 65535)
실수 float 4 23bit
double 8 64bit
논리 boolean 1 true, false

 

 

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

 

1.  레퍼런스 타입(Reference Type)

 

 -  실제 값이 아닌 해당 값을 참조하는 참조값(주소값)이 메모리상에 저장

 

 Ex) 클래스 Type, 인터페이스 Type, 배열 Type, 열거 Type (Primitive Type 제외 모두)

 

 

리터럴

 

1.  리터럴(Literal) 정의

 

 -  소스 코드 내에서 직접 입력된 값(데이터)

 

 -  변수 초기화 시 '저장할 값'

 

 cf) 상수(Constant) : 값을 한 번 저장하면 변경할 수 없는 '변수'

 

2.  리터럴 종류

 

  (1)  정수 리터럴

 

    1)  소수점이 없는 정수 리터럴 : 10진수

         Ex) 0. 15. -245

 

    2)  0으로 시작하는 리터럴 : 8진수

         Ex) 02, -06, 042

 

    3)  0x 또는 0X로 시작하고, 숫자 0~9, A~B(a~b)로 구성된 리터럴 : 16진수

         Ex) 0x5, 0xA, 0XB5, 0XAC35

 

   ->  정수 리터럴을 저장할 수 있는 타입은 5개(byte, char, short, int, long)

 

  (2)  실수 리터럴

 

    1)  소수점이 있는 리터럴 : 10진수 실수

         Ex) 0.25, -3.141592 

 

    2)  대문자 E or 소문자 e가 있는 리터럴 : 10진수 지수와 가수

          Ex) 5E8 = 5 * 10 ^ 8

 

   ->  실수 리터럴을 저장할 수 있는 타입은 2개(float, double)

 

  (3)  문자 리터럴

 

   1)  작은 따옴표 ' ' 로 묶인 하나의 텍스트

       Ex) 'A', '가'

 

   2)  이스케이프 문자 : 역슬래쉬 \가 붙은 문자 리터럴

 

   ->  문자 리터럴을 저장할 수 있는 타입은 1개(char)

 

이스케이프 문자 용도 유니코드
' \ t ' 수평 탭 0x0009
' \ n ' 줄 바꿈 0x000a
' \ r ' 리턴 0x000d
' \ "' " 큰 따움표 표시 0x0022
' \ '' ' 작은 따옴표 표시 0x0027
' \ ' \ 역슬레쉬 표시 0x005c
' \ u16진수 ' 16진수에 해당하는 유니코드 0x0000 ~ 0xffff

 

  (4)  문자열 리터럴

 

    -  큰따옴표 " " 로 묶인 텍스트

 

    -  큰따옴표 안에 텍스트가 없어도 문자열 리터럴 -> 내부에서 이스케이프 문자 사용 가능

        Ex) "한국", "xoq dlehd \t", "줄바꾸기 \n"

 

   ->  문자열 리터럴을 저장할 수 있는 타입은 1개(String)

 

  (5)  논리 리터럴

 

     -  boolean 논리 기본 데이터 타입에 저장 가능 

        Ex) true, false 

 

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

 

 1.  변수 선언

 

  -  변수 선언은 변수의 타입과 이름을 결정해 변수를 만들도록 명령하는 것으로, 변수의 이름을 작성하는 데에 몇 가지규칙이 있다.

 

  (1)  변수 이름 규칙

 

    -  첫 문자는 영문자 혹은 ' _  ' , ' & '  cf) 한글 사용 가능

 

    -  글자 수 제한 X, 공백 문자 및 특수 문자 사용 불가

 

    -  영문 대/소문자 구분

 

    -  Java에서 예약어로 사용되는 것을 이름으로 사용 불가

 

  (2)  이름 작성 방법

 

    -  클래스명 : Camel Case(대문자로 시작)(파스칼 케이스)


    -  변수 : Camel Case(소문자로 시작)


    -  상수 : Snake Case

 

  (3)  변수 선언

 

    -  예시로, 변수는 아래와 같이 선언할 수 있다.

 

public class Main {
    public static void main(String[] args) {
        int num;
        String name;
        Character char; 
    }
}

 

2.  변수 초기화

 

  -  Java에서 초기화(Initialization)는, '객체를 선언하고, 값을 [최초]로 할당하는 것이다.'

 

  -  즉, int num; 이라고 작성한 것은 변수 선언

 

  -  num = 10; 이라고 작성한 것은 값을 '할당(allocation)'

 

  -  int num = 10; 이라고 작성한 것은 선언과 동시에 값을 최초로 할당한 초기화에 해당한다.

 

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

 

위와 같이 작성하면 아래와 같이 변수 num 이 초기화되지 않았다는 에러 문구를 확인할 수 있다. 

 

Variable 'num' might not have been initialized

 

  -  그러나, 이때 '클래스 영역'에서 선언한 변수들은 실행 시 초기화를 하지 않아도 Compiler에서 자동으로 값을 할당해준다.

 

public class Main {

    int num;
    String name;
    Character c;

    public static void main(String[] args) {

        Main m = new Main();
        System.out.println(m.num);
        System.out.println(m.name);
        System.out.println(m.c);

    }
}

 

위와 같이 Main 클래스에 대한 객체 m을 생성하여 사용한 멤버 변수 num, name, c는 초기화 하지 않고 선언만 하였음에도 0 , null, null과 같이 값이 자동으로 할당된다.

 

0
null
null

Process finished with exit code 0

 

 -> 따라서 클래스 영역에서 변수를 선언하고 초기화를 하지 않을 때에는 에러가 발생하지 않지만 

 

     '메소드 영역'에서 선언할 경우에는 자동으로 값이 할당되지 않아 에러가 발생하게 된다.

 

 

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

 

  1.  변수의 스코프(Scope)

 

    -  해당 변수를 사용할 수 있는 영역 범위

 

    -  변수의 종류(클래스 변수, 인스턴스 변수, 지역변수, 매개변수)에 따라 변수의 Scope가 달라진다.

 

    (1)  클래스 변수 & 인스턴스 변수 -> 클래스 영역

 

    (2)  지역 변수 -> 클래스 영역 이외의 영역

 

      -  이때, 지역 변수의 경우 {  지역변수 Scope  } 와 같이 블록 안에서 변수를 선언하고, 블록 안에서만 사용 가능하다.

 

      -  매개변수는 메소드의 괄호 (   매개변수   ) 안에서 선언하고, 해당 메소드 내에서 사용 가능하다.

 

 

  2.  변수의 라이프타임(Lifetime)

 

   -  해당 변수가 메모리에 언제까지 살아있는지를 의미

 

    (1)  클래스 변수

 

      -  클래스 처음 호출 시 생성되어 -> Java 어플리케이션이 종료되는 시점에 함께 소멸된다.

 

    (2)  인스턴스 변수

 

      -  객체가 생성될 때 변수가 생성되고 -> 인스턴스 참조가 없을 때 가비지 컬렉터가 객체를 지우는데,  이때 인스턴스 변수도 같이 소멸된다.

 

    (3)  지역변수

 

      -  블록이 시작되는, 즉 ' { ' 가 시작되는 시점에 생성도어 -> ' } ' 로 끝나는 시점에 소멸된다.

 

    (4)  매개변수

 

      -  메서드 호출 시 생성되어 -> 메서드 종료 시점에 소멸된다.

 

 

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

 

  -  Java에서는 타입(type)을 변환하는 경우가 있는데, 캐스팅과 프로모션 2가지 종류로 변환이 가능하다. 

 

  -  이때, boolean 타입은 다른 원시 타입(primitive type)으로 변환이 불가능하다.

 

  1.  타입 캐스팅(Narrow Conversion, 큰 -> 작은 타입)

 

   -  자신의 표현 범위를 모두 포함할 수 없는, 더 작은 표현 범위의 데이터 타입으로 변환

 

   -  캐스팅은 프로모션과 달리 타입 변현을 직접 명시하여야 한다.(강제/명시적 형변환)

 

      Ex)  8바이트를 모두 사용하고 있는 상황에서, long 타입에서 -> int 타입으로 변경을 할 때에는, 5 ~ 8 바이트에 해당하는 부분을 모두 버려야 한다. 

 

public class Main {
    public static void main(String[] args) {    
        long number = 1234; 
        int num = (int) number
    }
}

 

 

  2.  타입 프로모션(Wide Conversion, 원래 타입 -> 더 큰 타입)

 

   -  자신의 표현 범위를 모두 표현 가능한 데이터 타입으로의 변환

 

   -  프로모션은, Java에서 타입 변형을 명시하지 않아도, '자동'으로 타입 변경이 가능하다.

 

   -  프로모션은 타입 변경 시 '데이터의 유실이 없기 때문' 이다.

 

public class Main {
    public static void main(String[] args) {
        int num = 0;   // 4 byte
        long number = num;   // 8 byte
    }
}

 

  3.  변수 범위

 

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

 

      의 순서대로 범위가 커지며, 따라서 왼쪽에서 오른쪽으로는 자동 형변환, 즉 프로모션이 적용된다.

 

 

1차 및 2차 배열 선언하기

 

  1. 1차원 배열

 

    (1)  배열 선언

 

      -  배열을 선언하는 방법은 아래 3가지가 있다.

 

public class Main {

    public static void main(String[] args) {

        int[] arr;
        int []arr2;
        int arr3[];    

    }
}

 

      -  배열은 선언만 하게 되면 메모리 공간을 차지하지 않으며,

 

      -  초기화를 통해 배열의 크기(사이즈)를 지정해주어야 메모리 공간을 차지하게 된다.

 

    (2)  배열 초기화

 

      -  선언한 배열은 크기를 지정해 주어 초기화할 수 있다.

 

      -  이때, int 형 배열은 default로 배열의 각 원소 값이 0으로, String이나 Character 형 배열은 default로 배열의 각 원소 값이 null 로 초기화 되는 것을 확인할 수 있다. 

 

    (3)  배열 선언 및 초기화

 

      -  배열 선언 및 초기화는 배열을 선언하는 동시에 크기를 지정하여 초기화하는 것이다. 

 

      -  이때, 크기를 지정하여 초기화하는 것이 아닌 실제 배열의 원소 값을 입력하여 초기화할 수 있다.

 

public class Main {

    public static void main(String[] args) {

        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
   
    }
}

 

public class Main {

    public static void main(String[] args) {

        int[] arr;   // 베열 생성
        arr = new int[10];   // 배열 초기화
        System.out.println("int 형 배열 생성 및 초기화 : " + arr);
        for (int x: arr) System.out.print(x + " ");

        System.out.println();System.out.println();

        String[] arrStr;   // 베열 생성
        arrStr = new String[10];   // 배열 초기화
        System.out.println("String 형 배열 생성 및 초기화 : " + arrStr);
        for (String x: arrStr) System.out.print(x + " ");

        System.out.println();System.out.println();

        Character[] arrChar = new Character[10];   // 배열 생성 + 초기화
        System.out.println("Character 형 배열 생성 및 초기화 : " + arrChar);
        for (Character x: arrChar) System.out.print(x + " ");

    }
}

 

int 형 배열 생성 및 초기화 : [I@75b84c92
0 0 0 0 0 0 0 0 0 0 

String 형 배열 생성 및 초기화 : [Ljava.lang.String;@6bc7c054
null null null null null null null null null null 

Character 형 배열 생성 및 초기화 : [Ljava.lang.Character;@232204a1
null null null null null null null null null null

 

  2.  2차원 배열

 

    (1)  배열 선언

 

      -  2차원 배열은 가로와 세로의 범위가 있으며 가로는 열 크기, 세로는 행 크기에 해당한다.

 

    (2)  배열 초기화

 

      -  선언한 배열은 크기를 지정해 주어 초기화할 수 있다.

 

    (3)  배열 선언 및 초기화

 

      -  배열 선언 및 초기화는 배열을 선언하는 동시에 크기를 지정하여 초기화하는 것이다. 

 

데이터타입[가로][세로] 배열명 = new 데이터타입[가로][세로];

 

타입 추론, var

 

  1.  var

 

    -  Java 10에서 도입된 var는 변수를 선언할 때 타입 지정을 생략할 수 있으며, 이때 컴파일러가 타입을 추론한다.

 

    -  컴파일 타임에 추론하는 것이므로, Runtime에 추가적인 연산을 하지 않으며 성능에 영향을 미치지 않는다.

 

    -  Java에서 var는 지역 변수에서만 사용 가능하다.

 

    -  var을 사용할 때에는 변수의 타입 추론을 위해 초기화가 필요하며, 이때 null로는 초기화할 수 없다.

 

    -  또한, 배열에 var을 사용할 수 없으며 Lambda에도 사용할 수 없다.

 

var f = () -> { };    // compile error

 

 

 

 

참고

 

 -  https://codechacha.com/ko/java-local-variable-type-inference/

 -  https://catch-me-java.tistory.com/17  

 -  https://wakestand.tistory.com/92