Programming/Java_자바

[Java 기초] 자바 변수

LEFT 2025. 1. 12. 22:19

변수와 리터럴

ex. int : 정수 타입 “키워드”

  • int i = 1; 이 있을때
    ➡️int : 정수타입 키워드
    ➡️ i : 하나의 값을 가질 수 있는 공간
    ➡️변수 1은 "정수 리터럴(literal) 1"을 말한다.

  • 리터럴(literal) : 변수에 입력되는 값
  • 컴퓨터는 “정수 하나”를 저장하기위해 메모리에 "4byte 크기의 저장공간"을 필요로함
    ➡️이 메모리의 영역을 변수라고 하는 것

❓키워드

➡️java에서 정한 “예약어”

❓예약어 (=키워드) 종류

➡️class, public, static, while 등등


변수

 

변수의 타입

1.기본형 타입

  • byte = 1byte
  • short = 2byte

  • int = 4byte (정수형) : 32비트의 수 표현
  • long = 8byte (정수형) : 64비트의 수 표현
    ➡️리터럴(값)뒤에 L, l을 붙임 (ex. long x = 5L;)
    ➡️큰 숫자 저장 시 long타입 사용 (자바는 기본적으로 숫자는 int형 으로 인식)
    - long타입 변수 y
    - 숫자 5L은 long타입 리터럴
    - 대문자 L을 값 뒤에 붙여서 주로 사용

  • float = 4byte (실수형) : 32비트의 수 표현
    ➡️리터럴(값)뒤에 F, f를 붙임 (ex. float f = 2F;)
    ➡️소수 부분 6자리까지 오차없이 표현

  • double = 8byte (실수형) : 64비트의 수 표현
    ➡️리터럴(값)뒤에 D, d를 붙이지만 생략 가능
    ➡️보통 실수를 표현 시 double 사용
    ➡️float보다 더 큰 값을 표현할 수 있고 소수점 이하에서 더 정교한 값을 표현가능
    ➡️소수 부분 15자리까지 오차없이 표현
  • char = 2byte (문자형)
  • boolean = 1byte (논리형)
    ➡️true나 false는 자바에서 미리 지정한 예약어, boolean의 기본값은 false
    ➡️컴퓨터의 “자료를 표현하는 최소 단위가 1byte”이지만 1비트로도 참과 거짓은 표현할 수 있다.
    💡0은 거짓, 1은 참

➡️모두 소문자로 시작하며 정해진 메모리를 가진다. 즉 기본형 변수는 “값을 가진다”는 것이다.


문자(char) 타입

  • 문자는 작은 따옴표로 묶음 (ex. char c = 'c';)
  • 문자는 2byte 크기를 가지며 유니코드 값을 가진다.
    ➡️ 2byte 정수 타입이기도 하다. 따라서 char타입은 0~65535까지 저장가능한 정수 타입이기도함
  • 유니코드 값 : 0000~0FFF 까지의 값을 가짐 2byte를 16진수로 표현한 것
    ➡️
    F : 16진수를 의미
    ➡️10진수 : 0~9까지 표현하는 것
    ➡️16진수 : 0~15까지 표현하는 것 (10 = A, 11 = B, 12 = C, 13 = D, 14 = E, 15 = F)

  • 4bit가 표현할 수 있는 수 : 0000~1111 (즉 0~15까지 표현 가능)
    ➡️4bit 하나에 16진수를 표현 가능

  • 1byte로 표현할 수 있는 16진수 : 00~FF까지 (4bit가 2개)
  • 2byte로 표현할 수 있는 16진수 : 00 00 ~ FF FF까지 (4bit가 4개)

❓동일한 2byte크기의 char타입과 short타입 차이점

➡️둘다 2byte의 정수타입인데 short는 음수, 0, 양수를 표현하고 char는 0과 양수를 표현합니다. 💡이 차이점


▶️실습 : char타입을 int타입으로, int타입을 char타입으로 변환

 

char to int

char c1 = ‘a’;

System.out.println((int)c1);
  • (int) 을 붙여서 강제 형변환을 시켜줄 수 있다 (명시적 형변환)

 

int to char

char c2 = (char)97;

System.out.println(c2);
  • 97번째 유니코드 문자를 c2에 저장

▶️기본형 타입 메모리 표현

ex. int i = 1;

1byte 2byte 3byte 4byte
00000000 00000000 00000000 00000001

이처럼 1byte당 8bit로 채워진다. 가장 마지막인 최우측 비트만 1로 저장되어 1을 표현 (➡️2의 0제곱 = 1)


ex. 1byte = 8bit 

byte x = 0;
➡️8개의 비트 방에 0이 모두 채워지게됨

byte x = 1;
➡️8개의 비트 방에 10진수를 2진수로 바꿔 표현 (00000001)
2^0 (2의 0제곱) = 1

1byte(=8비트)로 표현할 수 있는 가장 큰 수는 모두 1로 채워지는 것 (11111111)

💡가장 좌측의 비트가  0이면 양수, 1이면 음수를 나타냄
즉 가장 큰 수는 가장 좌측의 "부호비트"를 제외하고 01111111 이므로 양수(1111111 = 127)을 의미
➡️양수 127이 1byte로 표현할 수 있는 가장 큰 수


▶️실습 - 양수 1을 음수로 바꾸는 과정 (보수 표현)

1. 양수 1(00000001) 의 모든 부호를 반대로 치환
2. 바뀐 11111110 에서 +1 더하기
3. 그 결과 11111111 이 되는데 이를  "1을 2의 보수로 표현한 -1"이라고 한다.

❓음의 보수 표현

  • 2의 보수를 사용하는 이유?
    ➡️1의 보수로 음수와 양수를 표현하게 되면 0이 +0, -0처럼 양수형, 음수형을 가지게되므로
    ➡️결국 0이 2개가 된다. 이를 해결하기 위해 등장한 것이 “2의 보수”

1byte가 표현할수 있는 가장 큰 값 01111111 (127)

➡️음의 보수 표현 : +1을 더하여 10000000
➡️만약 보수로 표현된 수를 다시 원래 값으로 돌릴때는"-1" 수행
그렇게되면 0에 1이 위에서부터 0에게 하나하나 빌려주게 되어 01111111 (-128)

⭐정리하자면 127에 +1을 더하게 되면 -128


2.참조형 타입

  • String = 문자열
  • ex. Book b = new Book();
    ➡️타입이 기본형이 아닌 타입으로 기본형타입은 소문자로 시작하는 반면 이러한 타입들은 대문자로 시작
    ➡️이를 "참조형타입" 이라고 부른다.

  • class 타입
  • interface 타입

➡️참조형 타입은 값을 가지지않고 메모리의 특정위치에 있는 값을 참조하는 (=레퍼런스) 타입


변수명 규칙

  • 하나이상의 글자
  • 길이 제한이 없다
  • 키워드는 변수명으로 사용할 수 없다 (int, short, boolean …)
  • 상수 값을 표현하는 단어 true, false, null 등도 마찬가지로 변수명으로 사용할 수 없다.

변수 선언

int x;
int y;
int z;
처럼 선언만 하거나

int x = 0;
int y = 0;
int z = 0; 
처럼 선언과 동시에 초기화를 해줄 수 있다.

int x, y, z
➡️이렇게 한번에 선언할 경우 초기값을 넣어주지 않으면 모두 0을 가지게된다.


타입의 변환

  • double형 타입에 int형 정수값은 잘 대입됨 (작은 값이 큰 공간에 들어가게되는 것은 가능)
  • int형 타입에 double형 실수값은 대입되지 않음 (큰 값이 작은 공간에 들어가는 것은 불가능)

묵시적 타입변환 (=자동타입변환, Implicit Conversion)

double d1 = 50; 
double d2 = 500L;
  • d1에는 int형 리터럴 50이 잘 저장되고
  • d2에는 long형 리터럴 500L이 잘 저장되는 것을 확인 가능

❓정수형인 long타입이 실수형인 double타입에 저장되는 이유

➡️정수 값인 500L이 실수형으로 변환되어서 자동으로 저장되는 것
➡️반면 int형 타입에 실수를 대입하면 오류가 발생
➡️실수는 정수를 포함하지만 정수는 실수를 포함할 수 없기 때문이다.


변경내용 있으면 수정예정 :)