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

이상민·2021년 5월 25일
0
post-thumbnail
post-custom-banner

1. 프리미티브 타입의 종류

직접 데이터를 담는 데이터 타입

1-1) 정수타입

  • byte, short, int, long, char이 있고 크기가 각자 다르다
public class IntegerType {
    public static void main(String[] args) {
        System.out.println("byte 크기 " + Byte.SIZE);
        System.out.println("short 크기 " + Short.SIZE);
        System.out.println("int 크기 " + Integer.SIZE);
        System.out.println("long 크기 " + Long.SIZE);
        System.out.println("char 크기 " + Character.SIZE);
    }
}
byte 크기 8
short 크기 16
int 크기 32
long 크기 64
char 크기 16
  • 자바에서 char 타입은 16비트인 유니코드로 문자를 표현한다
  • 기본 값은 0 이다

1-2) 부동소수점 타입

  • float, double이 있고 크기 차이가 있다
public class FloatingPointType {
    public static void main(String[] args) {
        System.out.println("float 크기 " + Float.SIZE);
        System.out.println("double 크기 " + Double.SIZE);
    }
}
float 크기 32
double 크기 64
  • 기본 값은 0.0이다

1-3) 불리언 타입

  • boolean : 1bit 크기로 true/false를 나타낸다
  • 기본 값은 false이다

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

  • 자바의 데이터 타입은 프리미티브 타입과 레퍼런스 타입으로 나눌 수 있다
프리미티브 타입레퍼런스 타입
유형내장된 기본 유형프리미티브 타입을 제외한 모든 타입
Null기본값이 있어 Null이 존재X빈 객체를 의미하는 Null이 존재
저장stack 메모리에 실제 값 저장heap 메모리에 주소 값 저장

2-1) 레퍼런스 타입 유형

  • 클래스 타입 : 여러 타입의 변수와 메소드를 묶어 새롭게 정의한 사용자 정의 타입
  • 인터페이스 타입 : 여러 클래스 타입에서 공통으로 사용하는 상수와 메소드를 분리해 추상화 시킨 타입
  • 배열 타입 : 같은 데이터 타입을 가진 데이터를 메로리에 연속적으로 저장하여 만든 데이터들의 그룹
  • 열거 타입 : 표현할 데이터가 정해진 수의 값만을 가진 경우 이들을 하나의 타입으로 정의

3. 리터럴

프로그램에서 직접 표현한 값

  • 정수, 실수, 문자, 논리, 문자열 리터럴이 있다

3-1) 정수 리터럴

  • 10, 8, 16, 2진수 리터럴이 있다
int a = 15;      // 10진수
int b = 015;     // 8진수
int c = 0x15;    // 16진수
int d = 0b0101;  // 2진수

3-2). 실수 리터럴

  • 소수점 혹은 지수 형태로 표현할 수 있다
double f = 0.1234;    // 소수점
double g = 1234E-4;   // 지수
  • 숫자 뒤에 f나 d를 명시적으로 붙이기도 한다
float h = 0.1234f;    // f 필수
double i = .1234d;    // d 생략가능

3-3). 문자 리터럴

  • 작은 따옴표로 문자를 표현한다
char a = 'H';       // 알파벳 리터럴
char b = '한';      // 한글 리터럴
char c = \uae00;    // 유니코드 리터럴
char d = '\n';      // 특수문자 리터럴

3-4) 문자열 리터럴

  • 큰 따옴표로 문자열을 표현한다. 문자열은 프리미티브 타입이 아니다
String e = "JAVA";

3-5) 논리 타입 리터럴

boolean a = true;
boolean b = 10 > 0;

⚠️ C언어와 달리 0과 1로 논리 값을 나타낼 수 없다


4. 변수 선언과 초기화

변수를 선언하고 처음으로 값을 저장하는 것을 변수 초기화라고 한다

  • 기본 값에 의존하기보다 적절한 값으로 초기화하는 것이 좋다
  • 지역 변수는 사용 전 반드시 초기화가 이뤄져야한다

4-1) 변수 선언

int a;                   // 프리미티브 타입
String b = new String()  // 레퍼런스 타입

4-2) 변수 초기화 - 명시적

a = 100;
b = "Java";
  • 대입 연산자를 이용해 명시적으로 초기화할 수 있다

4-3) 변수 초기화 - 블록

static int var = 10;
int hello = 3;
{         // 인스턴스 초기화 블록
    System.out.println("hello -> 5 초기화");
    hello = 5;
}
static {  // 정적 초기화 블록
    System.out.println("var -> 20 초기화");
    var = 20;
}
  • 명시적 초기화는 복잡한 로직으로 값을 변수에 넣기에 한계가 있어 블록으로 나눠 초기화한다
  • 인스턴스 초기화 블록 : 인스턴스 생성 순간 초기화 진행
  • 정적 초기화 블록 : JVM이 클래스 로더로 로딩 시점에 초기화

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

5-1) 변수의 스코프

변수는 어디에서 선언되었는지에 따라 사용 범위가 달라진다. 일반적으로 중괄호로된 블록내에서 사용가능하다

img
  • 위 같은 코드가 있을때 var1은 Test 클래스 내에서 자유롭게 쓰일 수 있는 반면, var2 변수는 foo 메소드 내에서만 사용할 수 있다
  • 메소드가 아니어도 중괄호로 구분된 (예. if문, for문) 스코프 안에서만 사용할 수 있다

5-2) 변수의 라이프타임

변수의 스코프에 따라 라이프타임 역시 변한다

  • 인스턴스(전역) 변수 : 객체가 생성될 때 생성되고 객체가 참조되지 않을 때 객체와 같이 소멸된다
  • 매개변수 : 메소드 호출 시 생성되고 메소드 종료 시점에서 소멸된다
  • 지역 변수 : 선언된 스코프가 시작하는 시점에 생성되고 끝나는 시점에 소멸된다
  • 클래스 변수(정적) 변수 : 클래스 호출 시 생성되고 자바 애플리케이션 종료시 소멸된다

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

연산을 수행하기 위해선 데이터들이 같은 자료형이어야한다. 같은 타입으로 만들기 위해 변환하는 것을 타입(형) 변환이라고 한다.

  • 캐스팅(명시적) : 큰 데이터 타입에서 작은 데이터 타입으로 변환
  • 프로모션(자동) : 작은 데이터 타입에서 큰 데이터 타입으로 형 변환

6-1) 캐스팅

  • (자료형)변수; 구조로 명시적으로 변수를 해당 자료형으로 변환한다.
  • 작은 데이터 타입에서 큰 데이터 타입으로 변환하기 때문에 이 과정에서 정보 손실이 발생할 수 있다

6-2) 타입 프로모션

  • 큰 타입에서 작은 데이터 타입으로 변환하는 경우, 데이터 손실 문제가 없다

img

  • long --> float에서처럼 표현 범위가 더 넓다면 단순 자료형 크기를 떠나 변환 가능하다

7. 배열

배열 : 같은 타입의 자료를 하나로 묶어 놓은 것

  • 자바의 배열은 동적으로 할당된다 (C언어는 정적)
  • 자료형 뒤에 대괄호 []를 붙여 선언할 수 있다
  • 인덱스를 통해 원소에 접근한다

7-1) 1차원 배열

다음처럼 선언할 수 있다

type[] arr1
type arr2[]

메모리를 할당 받으려면 크기를 명시하거나 초기화 해야한다

int[] arr1 = new int[5];                // 크기 명시
int[] arr2 = new int[] {1, 2, 3, 4, 5}; // 초기화
int[]arr3 = {1, 2, 3, 4, 5};            // new type 명시 생략 가능

이때 arr1, arr2, arr3는 실제로는 배열의 레퍼런스를 담고 있기 때문에 하나의 배열을 다수의 변수가 참조하는것도 가능하다

7-2) 2차원 배열

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

위 코드는 3x3 크기의 정방형 배열을 만든다.
자바는 각 행의 열 크기가 다른 비정방형 배열도 지원한다


8. 타입 추론, var

타입을 명시하지 않고 컴파일러가 알아내는 것

  • Java10부터 편의를 위해 타입 추론을 지원하는 var이 도입되었다
String msg = "Java";  // 타입 명시
var msg = "java";     // 타입 추론

var 사용 시에는 반드시 선언과 초기화를 동시에 해줘야한다

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다
post-custom-banner

0개의 댓글