Skip to content

Latest commit

 

History

History
369 lines (177 loc) · 9.9 KB

Week2 - 자바 데이터 타입, 변수 그리고 배열.md

File metadata and controls

369 lines (177 loc) · 9.9 KB

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

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

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

Primitive 데이터 타입: boolean, char, int, short, byte, long, float, double

Reference 데이터 타입: String, Array 등등

기본형 종류별 크기와 범위

자료형 저장 가능한 값의 범위 크기 (byte) 기본 값
boolean false, true 1 false
char '\u0000' ~ '\uffff', 0 ~ 2^16 - 1(65,535) 2 ‘/u0000'
byte -128 (-2^7) to 127 (2^7 – 1). 1 0
short -32,768(-2^15) to 32,767(2^15 – 1) 2 0
int -2,147,483,648 (-2^31) to 2,147,483,647 (2^31-1) 4 0
long -9,223,372,036,854,775,808 (-2^63) to 9,223,372,036,854,775,807 (2^63 – 1) 8 0
float 1.40239846 x 10^-45 ~ 3.40282347 x 10^38 4 0.0
double 4.9406564584124654 x 10^-324 ~ 1.7976931348623157 x 10^308 8 0.0
  • float 과 double은 양의 범위만 나타낸 것, 음의 범위도 동일

기본형 종류

  1. boolean

    true, false의 불린 값은 1bit로 저장된다. 하지만 자바는 1byte로 값을 채워 넣는다.

    boolean 타입의 크기는 가상머신에 따라 다르다. (Virtual machine-dependent) 라는 이야기도 있다.

  2. char

    char 형 변수를 선언할 때 문자 리터럴을 사용하면, 자동으로 유니코드로 변환된다.

    실제로는 문자의 유니코드(정수)가 저장된다.

    아래의 결과는 true가 된다.

    char ch1 = 'A';
    char ch2 = 65;
    
    System.out.println(ch1 == ch2);	// true 

    왜 자바의 char형의 크기는 2 byte 인가?

    • C나 C++ 과 같은 언어는 아스키를 사용한다. 그리고 아스키는 8-bits 면 충분한다.

      하지만 자바는 아스키 코드가 아닌 유니코드 시스템을 사용하고 유니코드를 나타내기 위해서는 8 bit가 부족하기 때문에 2 byte를 사용한다.

  3. byte

    이진 데이터를 다룰 때 사용된다.

    크기가 큰 배열에서 메모리를 절약하는데에 유용하게 쓰인다.

  4. short

    byte와 마찬가지로 큰 배열에서 메모리를 절약할 때 사용한다.

    메모리를 절약하고 싶지만 byte가 너무 작을 때 사용할 수 있다.

  5. int

    원래 범위는 -2^31 부터 2^31-1 (약 20억) 까지 인데,

    Java 8 이후부터는 부호 없는(unsigned) 정수값을 2^32-1 (약 40억)까지 저장할 수 있다.

    • unsigned 부호없는
      • +나 -라는 부호를 구별하지 않는 수 시스템
  6. long

    long 타입 역시, Java 8 이후부터는 2^64-1를 최대값으로 갖는 부호없는 long을 나타낼 수 있다.

    원래 범위는 -2^63 부터 2^63–1까지.

  7. float

    정수형과 달리 실수형에서는 오차가 발생 할 수 있기 때문에 정밀도(precision)가 중요하다.

    float은 정밀도가 7자리 인데, 이 말의 뜻은,

    a * 10^n 의 형태 (1 <= a < 10) 로 표현된 7자리의 10진수를 오차없이 저장할 수 있다는 뜻이다.

    아래의 세개의 값이 float타입으로 저장했을 때 오차없이 저장할 수 있다.

    1234.567 = 1.234567 * 10^3

    0.00001234567 = 1.234567 * 10^-5

    1234567000 = 1.234567 * 10^9

  8. double

    7자리 이상의 정밀도가 필요하다면 double 타입을 이용하면 된다.

    double의 정밀도는 15자리, float의 약 두 배이다.

(float, double, 부동소수점에 관한 이야기는 자바의 정석에 잘 설명되어 있다.)

참고: https://www.baeldung.com/java-primitives

https://www.geeksforgeeks.org/data-types-in-java/?ref=lbp

자바의 정석

Reference Data Type (참조형)

참조형 타입의 변수는 값을 저장하는 곳의 주소를 갖는다.

주소를 통해 객체를 참조한다는 뜻으로 참조형이라고 한다.

배열, 열거, 클래스, 인터페이스 타입이 해당된다.

힙 영역에서 객체나 배열이 생성되고 스택 영역의 변수에서 이를 참조한다.

기본값은 null이고, 할당되는 메모리의 크기는 4byte(객체이 주소값)이다.

스택과 힙

  • 스택
    • 기본형 타입의 변수들과 그 값들이 함께 저장된다.
    • 힙 영역에 저장되어 있는 참조형 변수들의 주소(reference)가 저장된다.
    • 참조형 타입의 변수가 저장된다.
    • new 연산자를 통해 생성된 인스턴스 변수가 저장된다.

참고: https://kingpodo.tistory.com/54

리터럴

  • 데이터 그 자체
  • 변수에 넣는 변하지 않는 데이터
int a = 1;
  • 여기서 1을 리터럴이라고 한다.

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

변수 선언

int count;

타입과 변수명을 사용해서 선언한다.

변수 초기화하는 방법

int count = 20;

타입과 변수명을 적고 값을 대입하여 초기화한다.

변수의 종류

Local Variable 지역 변수

  • 하나의 블럭, 메소드, 생성자의 내부에서 정의되는 변수이다.

  • 함수가 호출될 때 생성되고, 함수가 반환될 때 소멸된다.

  • scope

    • 선언된 곳 내부에서만 지역 변수가 존재할 수 있다.
  • 지역 변수는 꼭 초기값을 넣어줘야한다 .

Instance Variable 인스턴스 변수

  • 메소드, 블록, 생성자의 바깥에서 선언된다.
  • 지역 변수와 달리, 접근 제어자를 사용한다. 따로 접근 제어자를 명시하지 않으면 기본 접근 제어가자 사용된다.
  • 꼭 초기화 할 필요는 없다.
  • 객체가 생성되는 경우에만 인스턴스 변수에 접근 가능하다.

Static Variable 정적 변수

  • 인스턴스 변수와 같은 방식으로 선언되지만, static 키워드를 추가로 붙여준다.

  • 객체의 개수와 상관없이 하나의 정적 변수가 생성된다.

  • 프로그램이 실행되는 시점에 생성되고 실행이 종료되면 소멸된다.

  • 꼭 초기화 할 필요는 없다.

참고: https://www.geeksforgeeks.org/variables-in-java/?ref=rp

타입 변환

자바에서 다른 타입끼리의 연산은 우선적으로 피연산자들을 같은 타입으로 만든 후에 수행된다.

타입의 크기가 작은 타입에서 큰타입으로 변환하는 것은 생략할 수 있다.

타입 변환의 종류

묵시적 타입 변환(자동 타입 변환) -> promotion

명시적 타입 변환(강제 타입 변환) -> casting

묵시적 타입 변환

컴파일러가 자동으로 수행해주는 타입 변환

자바에서는 데이터의 손실이 발생하지 않거나, 데이터의손실이 최소화되는 방향으로 묵시적 타입 변환을 진행한다.

데이터의 손실이 발생하는 대입 연산은 허용하지 않는다.

double num1 = 10;		// OK
int num2 = 3.14		// 컴파일 에러 

명시적 타입 변환

타입 캐스트 연산자 ()를 사용하여 강제적으로 수행하는 타입 변환이다.

참고: http://tcpschool.com/java/java_datatype_typeConversion

배열 선언하기

  • 배열이란 동일한 자료형으로 선언된 데이터 공간을 메모리에 연속적으로 나열한 것

  • 1차 배열은 아래와 같이 선언할 수 있다.

    int[] arr1;
    int arr2[];
  • 2차 배열은 다음과 같이 선언한다.

    int[][] array;
  • 배열 생성 후 초기화하면 배열의 주소가 할당된다.

  • 배열 변수는 reference 타입이다.

    • 배열도 객체이기 때문에 힙 영역에 생성되고
    • 배열 변수는 힙 영역의 배열 객체를 참조하게 된다.

참고: https://coding-factory.tistory.com/253

var

자바 10 이후부터 도입된 자료형이 필요 없는 var는 컴파일러가 프로그래머의 의도를 추측해야한다는 의미에서 타입 추론이라고 한다.

JS에서 사용되는 var와는 차이가 있다.

Java의 var를 설명하기에 앞서 프로그래밍 언어의 유형에 대해 알아보자.

첫번째로 정적 유형 언어로 이는 각 컴파일 시점에 변수의 타입이 결정된다.

변수가 한번 특정 데이터 타입으로 선언되면, 다른 데이터 타입으로 바뀔 수 없다.

C, C++, Java 가 이에 해당된다.

두번째로 동적 유형 언어는 런타임 시 변수의 타입이 결정된다.

런타임에 한줄씩 실행된다.

이후에 다른 데이터 타입을 가질 수 있다.

루비와 파이썬, JS 가 이에 해당된다.

JS의 var

var num = 1;
num = "number 1";
  • 선언 시에 데이터 타입을 명시하지 않는다.
  • 선언 할 때와 다른 데이터 타입을 대입할 수 있다.

하지만 아래와 같이 자바의 var는 초기화 이후에 다른 타입의 할당이 불가능하다.

var num = 10;
num = 10.5;		// 컴파일 에러!!!
  • 또한 지역변수에서만 제한적으로 사용 가능하다.

참고: https://digiconfactory.tistory.com/entry/%EC%9E%90%EB%B0%94-10-var-%EC%9D%98-%EC%82%AC%EC%9A%A9-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%97%86%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0