스터디/LiveStudy

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

TheWing 2020. 11. 20. 22:19

본 게시글은 백기선님의 자바 라이브 스터디를 진행하기 위한 정리 자료입니다

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

Primitive Type 종류와 값의 범위 그리고 기본 값

Primitive Variable

  • 8가지의 기본형 타입을 미리 정의하여 제공한다
  • Java 8에는 unsigned 가 지원된다.

  • 사칙 연산이 따로 지원이 된다
    • divideUnsigned 나누기
    • remainderUnsigned 나머지
    • compareUnsigend 비교연산
**System.out.println("Byte min="+Byte.MIN_VALUE+" max="+Byte.MAX_VALUE);
System.out.println("Short min="+Short.MIN_VALUE+" max="+Short.MAX_VALUE);
System.out.println("Integer min="+Integer.MIN_VALUE+" max="+Integer.MAX_VALUE);
System.out.println("Long min="+Long.MIN_VALUE+" max="+Long.MAX_VALUE);
System.out.println("Float min="+Float.MIN_VALUE+" max="+Float.MAX_VALUE);
System.out.println("Double min="+Double.MIN_VALUE+" max="+Double.MAX_VALUE);
System.out.println("Character min="+(int)Character.MIN_VALUE+" max="+(int)Character.MAX_VALUE);
int unsignedInt = Integer.parseUnsignedInt("4294967295");
System.out.println("unsignedInt = "+Integer.toUnsignedString(unsignedInt));
long unsignedLong = Long.parseUnsignedLong("17916881237904312345");
System.out.println("unsignedLong = " + Long.toUnsignedString(unsignedLong));**
  • 결과
Short min=-32768 max=32767
Integer min=-2147483648 max=2147483647
Long min=-9223372036854775808 max=9223372036854775807
Float min=1.4E-45 max=3.4028235E38
Double min=4.9E-324 max=1.7976931348623157E308
Character min=0 max=65535
unsignedInt = 4294967295
unsignedLong = 17916881237904312345

Reference Type

참조형 타입(Reference Type)

  • 기본형 타입을 제외한 타입들이 모두 참조형 타입이다
  • null 값이 존재한다
  • 주소값을 저장하는 공간으로 Heap에 저장된다

ReferenceType 자료형 보다 기본형 자료형을 선호하는 이유

  • 산술 연산이 가능하다
  • 매개변수로 객체가 요구되지 않을때
  • 기본값을 주어져서 저장할때
  • 객체간의 비교가 없을때

성능상의 이점이 있을때

  • 접근 속도

    • 기본 자료형은 스택 메모리에 값이 존재하고 래퍼 클래스는 스택 메모리에 참조 값이 있다. 실제 값은 heap 에 존재하게 된다. 값을 필요할 때마다 unboxing 과정을 거쳐야 하기 때문에 Primitive Type과 비교할때 접근 속도가 느려지게 된다.

    • 출처 https://www.baeldung.com/java-primitives-vs-objects

  • 차지하는 메모리의양

    • 64비트 컴퓨터기준

리터럴

  • 리터럴이란 프로그램에서 직접 표현한 값인 데이터 그 자체를 뜻한다 변수에 넣는 변하지 않는 데이터이다
int i = 2020;
  • int 앞에 i는 변수, 2020은 리터럴이다.
  • 2020과 같이 변하지 않는 데이터들을 리터럴이라고 부른다
int i = 2020;
float f = 0.1f;
boolean b = true;
char c = 'A';
String str = "String";

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

int i ;  // 변수 선언
i = 2020; // 초기화

변수의 스코프와 라이프사이클

  • 스코프는 변수의 사용 가능한 범위를 말한다
  • 예시를 들어 보겠다

  • global 변수의 생명주기는 main 메소드까지 들어오지 못한다
  • 즉 static 영역에 접근할 수 없어서이다.

  • 위와 같이 static을 선언하면 접근이 가능하게 된다

static

  • 같은 클래스 내에 있음에도 해당 변수는 사용이 불가능하다
  • static 변수나 메소드는 객체를 생성하지 않고 바로 사용을 할 수 있다.

Type Conversion, Casting and Type Promotion

타입 변환, 캐스팅

캐스팅

  • 타입을 명시적으로 변환하는 것

Widening Casting

  • 작은 크기의 타입을 더 큰 타입으로 전달할 때 캐스팅이 자동으로 수행된다
int i = 2020;
double d = i;
System.out.println(i);
System.out.println(d);
  • 결과
2020
2020.0

Narrowing Casting

  • 큰 크기의 타입을 작은 타입으로 전달할 때 수동으로 캐스팅해줘야 한다
double d = 2020.0;
int i = (int) d;
System.out.println(d);
System.out.println(i);
  • 결과
2020.0
2020

Type Promotion

  • 모든 byte, short 및 char값은 int로 승격된다.
  • 피연산자가 long 이면 전체 식이 long으로 승격된다
  • 피연산자가 float면 전체 식이 float로 승격된다.
  • 피연산자 중 하나가 double이면 결과는 double이다
byte b = 42;
char c = 'a';
short s = 1024;
int i = 50000;
float f = 5.67f;
double d = .1234;
double result = (f * b) + (i / c) - (d * s);
System.out.println((f * b) + " + " + (i / c) + " - " + (d * s));
System.out.println("result =" + result);

1차 및 2차 배열 선언하기

1차원 배열 선언

// 초기화 없이 선언
int[] arr;
int arr[];

//선언과 동시에 배열 크기 할당
int[] arr = new int[5];

// 선언 및 초기화
int[] arr;
arr = new int[5]; 

// 선언 및 값 지정
int[] arr = {1,2,3,4,5};

// 선언과 크기 지정 및 초기화
int arr = new int[]{1,2,3,4,5};

2차원 배열 선언

// 2차원 배열 선언
int[][] arr;
int arr[][];

//선언과 동시에 배열 크기 할당
int[][] arr = new int[5][5];

// 선언 및 초기화
int[][] arr;
arr = new int[5][5];

// 선언과 크기 지정 및 초기화
int[][] arr = new int[][]{{1,2},{3,4},{5,6}};

// 선언과 값지정
int[][] arr = {{1,2},{3,4},{5,6}};

1차원 배열 출력하기

import java.util.*;

public class Main {

    public static void main(String[] args)  {
        int[] arr = {1,2,3,4,5};
        System.out.println(Arrays.toString(arr));
    }
}
//결과
[1, 2, 3, 4, 5]

2차원 배열 출력하기

import java.util.*;

public class Main {

    public static void main(String[] args)  {
        int[][] arr = {{1,2},{3,4},{5,6}};
        System.out.println(Arrays.deepToString(arr));
    }
}
//결과
[[1, 2], [3, 4], [5, 6]]

타입 추론, var

var

  • Java 9까지는 local variable 유형을 명시적으로 언급하고 초기화에 사용된 이니셜 라이저와 호환되는지 확인해야 했다
String str = "Java 9";
  • Java 10에서는 다음과 같이 local variable을 선언 할 수 있다
var str = "java 10";
  • 사용시 중요한 것은 이니셜 라이저가 있는 지역변수에만 사용이 가능하다