본문 바로가기
JAVA

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

by e-pd 2020. 11. 17.

github.com/whiteship/live-study/issues/2

 

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

자바의 기본타입 

자료형 범위 기본값 크기
byte -128 ~ 127 0 1바이트
short -32,768 ~ 32,767 0 2바이트
int -2,147,483,648 ~ 2,147,483,647 0 4바이트
long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 0L 8바이트
float 32비트 부동 소수점(IEEE 754) 지원 0.0F 4바이트
double 64비트 부동 소수점(IEEE 754) 지원 0.0 8바이트
boolean true, false '\u0000' 1비트
char 유니코드 문자 false 2바이트
docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


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

primitive type은 '값'형이다. stack 메모리의 실제 값을 가리킨다,

reference type은 객체의 주소를 참조하는 타입들을 말한다.

레퍼런스 타입의 디폴트 값은 null 이다.

 

레퍼런스 타입의 종류

  • class type
  • array type
  • interface type
www.tutorialspoint.com/What-are-reference-data-types-in-Java


리터럴

변수나 상수에 저장되는 값 그 자체를 말한다.

1
2
3
4
5
boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;
cs
docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

 

정수 리터럴 

int intNum = 123;
long longNum1 = 123L;
long longNum2 = 123l;
long longNum3 = 29384982398342349820934;   // 컴파일 에러

 

int리터럴은 없음

long 의 리터럴 L, l  (int 범위보다 큰 수 일때 생략시 오류 발생)

l의 경우 1과 헷갈리는 가독성의 문제로 L를 추천함

 

  • 16진수 리터럴 : 0x
  • 2진수 리터럴: 0b
  • 8진수 리터럴 : 0

 

부동 소수점 리터럴

double num1 = 123.12;
double num2 = 123.12d;
double num3 = 123.12D;

float num4 = 123.0F;
float num5 = 123.0f;
  • float 리터럴  : F, f
  • dobule 리터럴 : D, d (보통 생략)

 

문자, 문자열 리터럴

char ch = 'a';
String hello = "World";
String uni = "\u03b2";
String hello2 = "Hello\nWorld";
  • 문자 리터럴 : 작은 따옴표
  • 문자열 리터럴 : 큰 따옴표
  • 유니코드 : \unnn
  • 이스케이프 문자: \ 로 시작 ( \t, \n, \b \\ .... )

 

  • 기타 리터럴
  • null : 참조형에 사용
  • _ : 가독성을 위해 java7부터 사용 ( ex) 100_000)


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

변수를 선언하는 것은 stack 영역에 메모리를 할당하는 것을 말합니다

 

변수를 먼저 선언하고 나중에 초기화를 하는 방법

타입 변수이름;

 

1
2
3
4
5
public static void main( String[] args) {
        int a1;
        a1 = 2; // 초기화
        System.out.println(a1);
}
cs

초기화를 하지않으면 컴파일 오류가 발생

 

 

선언과 동시에 초기화를 하는 방법

타입 변수이름 = 초기값;
타입 변수이름 = 초기값, 타입 변수이름 = 초기값; 

 

1
2
3
4
public static void main( String[] args) {
       int b = 3;
       boolean studyHard = true, studyExit = false;
}
cs

 

하지만 여러 변수를 동시에 초기화 할 수 선언할 수 없음

1
2
3
4
public static void main( String[] args) {
       int a, b;
       a = 1, b= 2;    // 컴파일에러
}
cs


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

종류 스코프 라이프타임
Instance 변수 static method를 제외한 모든 클래스 영역 객체가 메모리에 존재하는 동안
Class 변수 모든 클래스 영역 프로그램이 종료시
지역 변수 블록이 선언된 내부 블록 내부를 컨트롤 하는 동안
www.learningjournal.guru/article/programming-in-java/scope-and-lifetime-of-a-variable/


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

타입변환

기존의 타입에서 다른 타입으로 변경하는 것

 

큰범위로의 캐스팅, 좁은 범위로의 캐스팅이 있다.

 

큰 범위로 캐스팅 (자동으로 캐스팅)

byte->short->char->int->long->float->double

 

1
2
3
4
5
6
7
 public static void main( String[] args) {
        int num = 10;
        double castNum = num;         // 자동으로 캐스팅된다  
 
        System.out.println(num);      // 10
        System.out.println(castNum);   // 10.0
}
cs

 

 

작은 범위로의 캐스팅 : 데이터 손실이 있기때문에 직접(explicit) 선언을 해야합니다.

double -> float -> long -> int -> char -> short -> byte
1
2
3
4
5
6
7
public static void main( String[] args) {
        double doubleNum = 10.5;
        int intNum = (int) doubleNum; // Manual casting: double to int
 
        System.out.println(doubleNum);   // 10.5
        System.out.println(intNum);      // 10
}
cs
참고 : www.w3schools.com/java/java_type_casting.asp

 

타입 프로모션은

연산시에 타입이 같지 않을때 타입을 큰 범위로 자동으로 캐스팅하는 것을 말한다.

 

promote 규칙

char->int
byte->short->int->long->float->double
1
2
3
4
5
 public static void main( String[] args) {
        char c = 'b';                // c의 int로 promote 
        int a = 50;
        System.out.println(a + c);    // 148
}
cs
www.java2s.com/Tutorials/Java/Data_Types/What_is_Java_type_promotion.htm

1차 및 2차 배열 선언하기

 

1차원 배열의 선언

타입 변수명[];

타입[] 변수명;

 

2차원 배열의 선언

타입 변수명[][];

타입[][] 변수명;

 

타입 추론, var

Java 10부터 지원

컴파일러가 자료형을 추론(type reference)

선언과 동시에 값을 대입

1
2
3
4
5
6
7
8
public class Main {
 
    public static void main( String[] args) {
      var hello = "world";
       var hi;  // 컴파일 에러
    }
}
 
cs

var는 변수 이름에 []를 사용할 수 없다.

선언과 동시에 {}에 값 대입을 이용할 수 없다

 

github.com/whiteship/live-study/issues/2

 

'JAVA' 카테고리의 다른 글

제어문  (0) 2020.12.05
연산자  (0) 2020.11.22
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가  (0) 2020.11.17
Interface default methods  (0) 2020.10.19
Java8 Function  (0) 2020.10.18