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

3 minute read

목표

자바 데이터 타입, 변수 그리고 배열에 대해 학습하세요. issue

학습할 것

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

  • boolean은 true와 false 두 값만 표현하면 되기에 1바이트면 충분하다.
    • 기본 값: false
  • char는 자바에서 유니코드(2 byte문자 체계)를 사용하기에 2byte
    • 기본 값: \u0000
  • byte는 크기가 1byte이므로 byte.
    • 기본 값: 0
  • int(4 byte)를 기준으로 짧게는 (2 byte) 길게는 (8 byte)를 취사선택한다.
    • 기본 값: 0
  • float은 실수값을 부동소수점(floating-point)방식으로 저장하기 때문에 float
    • 기본 값: 0.0F
  • double은 float보다 두 배의 크기(8byte)를 갖기 때문에 double
    • 기본 값: 0.0

실수형

컴퓨터가 실수를 표현하는 것에 있어서 가끔식 값이 달라지는 경우가 있다.

가장 큰 이유는 부동소수점이라는 것을 이용해서 실수를 표현하기 때문에 실제 값과 다른 경우가 존재한다.

해당 문제를 해결하기 위해서 java8부타 BigDecimal 이라는 타입을 제공해준다.

https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html

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

  • 기본형(Primitive Type)
    • 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 계산을 위한 실제 값을 저장한다.
    • 선언 위치에 따라 다르며 기본적으로 stack 영역에 저장되며 그 스택 영역이 사라지며 같이 사라진다.
  • 참조형(reference type)
    • 객체의 주소를 저장한다. 기본적으로 Java.lang.Object를 상속받을경우 참조형이 된다. 즉, 기본형을 제외하고는 참조형이라 생각해도 된다.
    • 메모리 영역에서 힙에 저장되며 그것에 대한 주소값을 선언과 함께 제공받으면 그것을 이용해서 그 메모리영역, 값에 접근할 수 있다.

3. 리터럴

  • 단순 그 자체 값을 의마한다.
  • int age = 50;
    • 위 예제에서는 50 라는 것 자체가 리터럴이 된다.
  • 인스턴스 리터럴
    • 기본적으로 해당 값이 불변성을 가지고 있을 때 객체 리터럴이라고 한다.
    • 불변 리스트나 맵, 혹은 String 같은 경우는 객체이지만 새로운 값을 만들 때마다 새로 객체를 만들기 때문에 객체 리터럴이라고 할 수 있다.

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

타입 및 이름

  • 변수 타입: 변수에 저장될 값이 어떤 타입(type)인지 지정하는 것.
  • 변수 이름: 변수에 붙힌 이름. 변수가 값을 저장할 수 있는 메모리 공간을 의미하므로 변수 이름은 이 메모리 공간에 이름을 붙혀주는 것.
    • 변수 타입에 따라서 그 크기만큼에 메모리 공간을 찾고 해당 빈공간이 있는 곳을 차지해서 해당 변수 이름을 붙인다. 실제로 접근하기 위해서는 그 이름보다는 해당 메모리 공간이 어디있는지에 대한 주소값이 중요하다

초기화

  1. 명시적 초기화(explicit initialization)
    • 우리가 아는 변수 초기화 방법이다. 클래스 및 지역변수 어디서든 사용가능하며 여러 초기화 방법중 최우선적으로 고려한다.
  2. 초기화 블럭(initialization block)
    • 초기화 블럭은 클래스 초기화 블럭과 인스턴스 초기화 블럭으로 나뉜다.
    • 클래스 초기화 블럭: 클래스변수의 복잡한 초기화에 사용. 블럭내에서는 로직도 추가할 수 있기 때문에 명시적 초기화만으로 부족할 때 사용한다.
    • 인스턴스 초기화 블럭: 인스턴스 변수의 복잡한 초기화에 사용. 모든 생성자가 공통으로 수행해야 하는 로직이 있을 때 사용한다.
  3. 생성자(constructor)
    • 인스턴스를 실행할 때 사용되는 생성자를 통해서 초기화되는 경우이다.

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

  1. 클래스 변수
    • 클래스 전체적으로 공유되는 변수에 해당한다.
    • 변수에 static을 붙이는 경우 클래스가 만들어지는 경우부터 해당 변수는 사용할 수 있다.
    • 해당 클래스로 인해서 만들어진 인스턴스는 해당 변수를 사용할 수 있다.
  2. 인스턴스 변수
    • 인스턴스가 생성되면서 만들어지는 변수이다.
    • 인스턴스마다 가져야되는 값을 저장하기 위해 적절하다. 모든 인스턴스가 각자 데이터를 가진다.
  3. 로컬 변수
    • 특정 메소드에서만 사용되는 경우에 해당 하는 변수이다.
    • 해당 메소드가 종료되면 모든 정보가 사라진다.

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

타입 변환

  • 변수 또는 상수의 타입을 다른 타입으로 변환.
  • 프로그램 동작 중에 해당 변수의 타입을 변경해야지만 연산이 가능한 경우가 있다. 그런 경우 타입을 변경해서 연산을 진행해야되는데 이럴 때 사용해야되는 것이 형변환이라고 한다.

방법

  • 변활할 변수나 리터럴 앞에 타입을 괄호와 함께 붙혀주기만 하면 된다. 이 때 형변환 연산자는 그저 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환할 뿐이기에 기존의 변수나 리터럴이 변화되지는 않는다.
  • 주의해야될 점은 타입마다 값을 표현하는 식이 다르기 때문에 형변환시에 값이 달라지는 경우가 존재한다.
    • int to long: long이 모든 int 값을 표현할 수 있기 때문에 문제가 되지 않지만 반대에 경우 문제가 발생할 수 있다.
    • double to int: double 변수 중에 만약 소수점 값이 있다면 해당 값을 int에서 표현할 수 없기때문에 값이 사라진다.

7. 1차 배열과 2차 배열

8. 타입 추론 (Type inference)

  • 값을 보고 컴파일러가 데이터 타입이 무엇인지 추론한다는 것을 의미.
  • 제네릭 이용해서 만들어진 클래스에 대해서 대표적으로 볼 수 있다.
  • List<String> stringList = new ArrayList<>();
  • 위와 같은 예제에서 new ArrayList<>() 에 어떤 타입도 넣지 않아도 사용할 수 있는 것이 그 이유에 해당한다.
  • 제약사항
    • 로컬 변수로 사용해야 한다.
    • 선언과 동시에 반드시 값을 넣어주어야 한다.

ref

catsbi님의 블로그

hsm622의 블로그

Leave a comment