본문 바로가기
스터디/[white-ship] 자바 스터디(study hale)

2주차 과제: 자바 데이터 타입, 변수 그리고 배열

by doyoungKim 2021. 1. 2.

목표

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

학습할 것

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

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

프로그래밍 언어에서 사용되는 데이터들은 타입을 통해서 어떤 데이터 종류인지를 알 수 있다.
크게 메모리에 직접 데이터를 가지고 있는 프리미티브 타입(int, float, boolean 등이 이에 속한다.)데이터를 가지고 있는 곳을 가르키는 주소를 가지고 있는 레퍼런스 타입(클래스, 인터페이스, 배열, 열거 타입이 이에 속한다.)으로 나뉜다.

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

프리미티브 타입 종류

프리미티브 타입은 크게 수치와 불리안 타입(boolean)으로 나뉘고

수치는 각각 정수와 부동 소수점 타입으로 나뉘고 정수 타입은 byte, short, int, long, char 부동 소수점 타입은 float, double 로 나뉜다. 쉽게 말해서 소수점이 있는지 없는지로 나뉜다고 본다.

타입의 종류와 자세한 값들을 정리해 본다면 다음과 같다.

만약 int 변수에 22억이 담기면 어떻게 표현이 될까?

  int value = Integer.MAX_VALUE-1;
  for(int i = 0; i < 4; i++, value++) {
      System.out.println(value);
  }
 2147483646
 2147483647
 -2147483648
 -2147483647

이러한 값이 나온 이유는 int 는 32비트 로 되어있고 가장 앞에 있는 비트는 부호비트이기 때문에 1이 증가하면서 부호비트가 바뀌어 버린 것이다.

 

실수형 데이터 타입은 부동 소수인데 주의할 점이 있다.

  float number = 0f;
  for (int i = 0; i < 10; i++) {
     number += 0.1f;
  }
  System.out.println(number); 
  1.0000001

결과 값이 이상하다.

따라서 돈 계산 같은 경우는 BigInteger 쓰자!

    BigDecimal number2 = BigDecimal.ZERO;
    for (int i = 0; i < 10; i++) {
        number2 = number2.add(BigDecimal.valueOf(0.1));
    }
    System.out.println(number2);
    1.0

3. 리터럴

고정된 값을 할당 하는 것을 의미한다. 고정되어 있기 때문에
동적으로 변경될 일은 없고 컴파일이 되고 나면 메모리 공간에 값이 저장된다.

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

// 변수 선언 
int i;

// 초기화 
// 식별을 위해 _ 를 써도 된다 !
i = 1_000;

// 변수 선언 및 초기화
 int i2 = 10;

//주의할 점은 해당 변수 타입의 맞는 값을 리터럴 해줘야 한다.
char c = 100; X

변수 선언만 하고 초기화를 하지 않으면 어떻게 될까?

메모리 영역에 따라 다르다. 만약 Heep이나 Static 같은 영역(ex_static 변수)을 사용한다면 선언만 할 경우
기본값으로 자동 초기화 된다.

 

자동 초기화

하지만 스택 영역(ex_메소드, 지역변수)에서는자동 초기화가 되지 않는다.
스택영역의 자료구조는 LIFO (Last In First Out) 으로 되어 있다. (나중에 실행된 메소드가 먼저 반환)
예를 들어, 객체의 메소드가 실행되면, 해당 메소드가 사용할 메모리가 할당된다. 그리고 할당 받은 메모리에 메소드의 파라미터와 메서드의 지역변수들이 저장되는데, 이때 나중에 실행된 메소드가 반환 할 때, 깔끔하게 메모리를 정리하고 반환 하는 것이 아니다.

즉,

int i;

 

라는 변수 즉, 값을 담을 공간만 만들어놓는다면, 이곳에는 전에 실행된 메소드의 데이터들(쓰레기 값)이 고스란히 남아있을 것이다.

따라서 스택영역을 사용할 때는 초기화를 하자 ! 물론, IDEA 툴들이 잘 알려준다.

초기화 하라고 알려준다.

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

변수가 어디서 선언 되느냐의 따라서 변수의 스코프 유효범위 라이프 타임이 달라진다.

중괄호 영역 안이 스코프이다.

{

...

}

스코프는 메소드로 인해서 생길 수도있고 클래스 로도 생길수가 있고 각종 다양한 방법으로 생성될 수 있다.
어떤 스코프안에서 변수가 선언되었는지 에 따라서 변수는
크게 인스턴스변수, 클래스 변수(맴버변수), 로컬 변수 로 나뉘어진다.

먼저 메모리에 할당된 변수(전역) 는 참조를 할 수 있다.

이때, 가장 가까운 변수에게 우선순위가 있다.

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

자동 형변환

기존에 변수타입 보다 큰 변수타입에 할당이 된다면 자동적으로 변환을 해주는 것이다.

하지만 byte(정수형) -> char(문자형) 는 될 수 없다.

타입의 범위가 다르기 때문이다.

강제 형변환

오토박스

타입 프로모션

같은 숫자형 타입 끼리 사칙연산을 할 경우 더 큰 타입 변수로 할당 한다면 형변환을 자동으로 해주는 프로모션 !~

int i = 10;
double d = 5.5;
double di = i + d; // 둘 중 더 큰 타입인 double 타입에 할당 한다면 자동으로 해준다.
int id = i + (int) d; // 둘 중 더 작은 타입 int 라 형변화을 해줘야 한다

 

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

배열은 힙 영역에 저장되는 객체로써 특징은 다음과 같다.

  1.  고정된 크기를 가진다.
  2.  (논리)메모리에 연속적으로 배치되어있다.
  3.  순서가 존재하며 순차적으로 할당된다. (인덱스로 접근 가능)

만약 배열안에 배역이 있다면 이차배열 이라고 불린다.

8. 타입 추론, var

주의할 점은 해당 변수 타입의 맞는 값을 리터럴 해줘야 한다.

타입 추론이란, 코드 작성 당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것이다.
다른 개발자들은 네이밍이나 주석을 봐야겠지..

선언과 동시 초기화가 반드시 되어야 한다.

var greetingMessage = "hello message"; // 타입 추론을 지원하는 var키워드가 자바10부터 추가되었다.

단순히 변수를 선언할 때 타입을 추론하는 것이 아니라 아래의 유용한 활용법이 있다.

for 문

//자바 9
for(Doyoung doyoung: doyoungGroup) {

}
// 자바 10
for(var doyoung : doyoungGroup) {

}

 

Lamda 매개변수

Consumer<Person> personConsumer = (@Nonnull var person) -> {
    // @Nonnull 어노테이션에 의해 person에 널체크부터 하겠지?
}

 

익명클래스

var supply = new Supplier<String>() {
    @Override
    public String get() {
        // someThing do it
    }
}
728x90

댓글