GeehDev

[Java] 변수 선언과 기본 자료형 본문

Study/Java

[Java] 변수 선언과 기본 자료형

geehyun 2024. 9. 8. 23:31

velog에서 이관해온 글

 


변수 선언

//선언만
자료형 변수명;

//선언과 동시에 할당
자료형 변수명 = 값;

Java에서의 변수선언도 JS와 유사하게 선언하지만, 차이점은 예약어가 Java에서 정해놓은 자료형으로 입력해서 사용한다는 점에서 차이가 있습니다.

💡 변수 선언 후 할당을 안하면?
변수 선언 시 선언과 동시에 값을 할당할 수도 있지만, 선언만 해놓고 값 할당은 나중에 할 수도 있습니다. 이럴 경우 값이 할당되기 전까지 해당 변수의 값은 null 상태입니다.
이러한 null의 경우 어떠한 연산을 해도 null이 나오기 때문에 논리적 오류에 주의해야합니다.

할당안하고 사용하기

위 이미지 처럼 변수 선언 후 할당을 안한채 사용하려하면 에러가 표시됩니다.

변수 네이밍 규칙

필수사항

  1. 식별자는 첫 시작은 글자, 달러기호($), 밑줄기호(_)로 시작해야 함 (숫자로 시작할 수 없음)
  2. 식별자에는 글자, 숫자, 달러기호($), 밀줄기호(_)만 사용할 수 있음
  3. Java 자체에서 이미 사용중인 키워드는 사용 불가
  4. 띄어쓰기불가

권고사항

  1. 한글 사용을 지양합니다. 되도록 영어로 작성하도록 합니다.
  2. 카멜(camel) 케이스 사용 권장

변수의 생존기간(life cycle)

변수의 생존기간이란, 변수가 만들어진 후 사라지기까지의 기간을 의미합니다.
사용자가 변수를 선언해서 사용 후 JVM에서 일정 기준 이후 메모리에서 삭제 처리 합니다.

이 기준을 변수의 생존기간이라 합니다. 이러한 기간은 아래의 문제 때문에 생기게 되었습니다.

  1. 보안이슈 - 외부에서 해당 변수 접근 문제
  2. 메모리 충돌 방지
{
    int a = 2; //변수 a 생성시점
    {
        int b = 3; //변수 b 생성시점
        System.out.println(b);
    } //변수 b 사라지는 시점
    System.out.println(a);
} //변수 a 사라지는 시점

 

변수의 생존기간은 해당 변수가 만들어진 {} 안에서만 존재한다.

 

변수의 생존기간

💡 변수의 생존기간
변수의 생존기간은의 기준은 변수의 할당시점이 아니라 변수의 선언시점 부터 시작한다는 점을 주의하자!

자료형

자료형의 경우 기본 자료형참조 자료형 두 가지로 구분이 됩니다.
기본 자료형의 경우 스택 영역에 저장이 되며, 참조 자료형은 힙(주소는 스택) 영역에 저장 됩니다.

기본자료형의 경우 변수명을 소문자로 시작, 참조자료형의 경우 변수명을 대문자로 시작하는 방식이 권고됩니다. (필수X)

💡 자바의 메모리 구조
자바의 메모리는 크게 3가지로 나눠집니다.(사실 4개지만....여튼 3개로 주로 구분한다 함...)

  • class, static, final, 메서드 영역
  • stack 영역
  • heap 영역

기본 자료형

Primitive Type으로 실제 값으로 받은 데이터 자체를 저장하는 자료형입니다.

해당 데이터는 스택 영역에 저장됩니다.

자료형 키워드 자료의 크기 값의 범위
부울대수 boolean 1byte true, false
정수 byte 1byte (-2^7) ~ (2^7)-1
  short 2byte (-2^15) ~ (2^15)-1
  int 4byte (-2^31) ~ (2^31)-1
  long 8byte (-2^63) ~ (2^63)-1
실수 float 4byte ±(1.40 x (10^-45) ~ 3.40 x (10^38))
  double 8byte ±(4.94 x (10^-324) ~ 1.79 x (10^308))
문자(정수) char 2byte 유니코드 문자(0 ~ (2^16)-1)

💡 값의 범위가 어떤 의미인지 확인하기
byte 자료형을 예시로 보면 -128 ~ 127까지를 표현할 수 있는 자료형이다. 그런데 이런 자료형에 해당 값을 초과하는 숫자를 넣게 되면 어떻게 될까?

byte test = (byte) 566;
byte test1 = (byte) 128;
System.out.println(test); //54 출력됨
System.out.println(test1); //-128이 출력됨

위 예시 처럼 넣은 값과 영 다른 엉뚱한 값이 나오는 것 처럼 보인다. 하지만 사실상 -128 ~ 127까지의 값 범위에서 127을 초과하면 다시 가장 낮은 값으로 돌아와서 -128이 표시되는 방식 입니다.

byte 예시

부울대수

  • boolean

참(true), 거짓(false) 값만 저장하는 자료형 입니다.
이 자료형의 경우 1bit를 사용하지만 Java의 자료처리 최소 단위가 1byte이기 때문에 1byte가 할당 됩니다.

정수

  • byte
  • short
  • int
  • long

💡 자바에서의 정수값 표현

  • 10진수 : 숫자
  • 2진수 : 0b + 숫자
  • 8진수 : 0 + 숫자
  • 16진수 : 0x + 숫자

실수

  • float
  • double

문자

  • char

💡 문자 저장/출력 방식

  • 문자의 저장 방식
    : 문자 값 또는 정수가 입력되었을 경우 문자로 입력된 경우 최종적으로 유니코드 표에 따른 정수값으로 메모리에 저장됩니다.
    \u로 시작하는 유니코드 정수 자체로 저장할 수도 있습니다.
  • 문자의 출력 방식
    : 메모리에 할당되어있는 정수값을 유니코드 표에 따른 문자로 출력합니다.

기본 자료형 간 타입 변환

Java에서 기본 자료형의 경우 =을 기준으로 선언한 자료 타입과 갑의 자료 타입을 맞춰서 입력해줘야합니다. 기본적으로 입력된 값이 해당 자료형 내에 포함될 경우 자동 형변환으로 자동으로 맞춰지지만, 입력된 값이 해당 자료형의 크기보다 클 경우 수동으로 형변환을 해줘야합니다.

boolean을 제외한 기본 자료형 7개는 자료형 끼리 서로 변환할 수 있습니다.

💡 자료의 크기 순서
boolean < byte < short < char < int < long < float < double
여기서 자료형의 크기는 자료형의 바이트 순이 아니라 저장하는 값의 범위 기준입니다.

 

이러한 자료형 변환을 Type Casting 이라고 하며 2가지 방법으로 할 수 있습니다.

 

- 캐스팅 방법 1 : (자료형) 표기

//사용법
자료형 변수명 = (자료형) 값;

//사용예시
byte test;
test = (byte)560;

 

- 캐스팅 방법 2 : 실수리터럴 단위문자 표기

//사용법
long 변수명 = 값L;
float 변수명 = 값F;

//사용예시
long test;
test = 16L;

실수의 경우 해당 단위문자를 이용할 수 있는데, L = long / F = float 으로 값 뒤에 표기합니다.
사실 L, F는 l, f로도 쓸수 있지만 되도록 대문자 L, F로 쓰는걸 권장합니다.

💡 명시적 형변환
Java의 경우 자동 형변환이 이뤄지기는 하지만, 코드를 짤 때 가능한 명시적으로 형변환하는 방식으로 작성하는 것을 권장합니다.

기본 자료형 간의 연산

자료형 간의 연산을 할 경우 CPU에서 연산 최소 단위가 int이므로 int보다 작은 단위의 자료형 끼리의 연산에서도 결과는 int형으로 나오게 됩니다.
또한, 다른 자료형 끼리의 연산의 경우 더 큰 자료형으로 자동형변환하여 연산된다는 점도 참고해야합니다.

기본 자료형의 초기값

기본 자료형, 참조 자료형 모두 선언 후 할당을 안 한 상태에서 출력하려하면 스택 메모리에 할당된 값이 없기 때문에 오류가 발생합니다.
따라서 각 자료형에 맞는 초기값을 설정해줘야할 경우 아래 초기값으로 설정합니다.

  • boolean : false
  • 정수형 : 0
  • 실수형 : 0.0

참고

Do it! 진짜 개발자가 되는 Java 프로그램 입분서 자바 완전 정복 - 김동형
위 책을 공부하며 작성하고 있습니다!

'Study > Java' 카테고리의 다른 글

[Java] 클래스의 상속과 다형성  (0) 2024.09.15
[Java] 클래스의 기본구조  (0) 2024.09.15
[Java] 참조 자료형 - 배열, 문자열(String)  (0) 2024.09.15
[Java] 연산자와 제어문  (1) 2024.09.08
[Java] Java의 기본 개요  (1) 2024.09.08