[Java] 변수

thingzoo·2023년 6월 12일
0

Java

목록 보기
4/20
post-thumbnail

변수와 상수

변수(Variable)

변하는 값을 저장하는 공간

int number = 10; // 1. number라는 이름의 int 타입의 변수로 선언 및 초기화
number = 11; // 2. 변수의 값을 변경 (덮어쓰기)

상수(Constant)

변하지 않는 값을 저장하는 공간

final int number = 10; // 1. number라는 이름의 int 타입의 상수로 선언 (데이터 타입 앞에 final)
number = 11; // e2. 변수의 값 변경시 에러!

저장공간의 종류(변수 타입)

기본형(Primitive Type)

정수형: byte, short, int, long

0,1,2,99 와 같은 정수형 숫자값을 저장

정수형 변수 표현 범위

📌 오버플로우(Overflow)
각 변수 표현 범위를 넘는 숫자를 넣게되면 오버플로우가 발생하고, 해당 숫자를 출력해보면 입력값과 다른 값으로 표현되므로 항상 주의!!!!
(표현 범위를 초과한것이기 때문에 입력한 값보다 작거나 음수값 출력됨)

  • byte : -128 ~ 127
  • short(2byte): -2^15(32,768) ~ 2^15-1(32,767)
  • int(4byte): -2^31~2^31-1(21억)
  • long(8byte): -2^63~2^63-1(9백경)
byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.

short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.

int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.

long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.

📌 정수형 리터럴 구분값(리터럴 = 데이터값)
intlong 의 데이터값(리터럴)을 구분하기 위한 구분자로 long으로 담을 숫자뒤에 L을 붙임

이런식으로 데이터값(리터럴) 뒤에 붙이는 구분값을 “접미사”라고 부름

📌 데이터 표현 단위 정리

  • Binary Digit(Bit): 데이터 표현 최소 단위, 0과1형태의 2진수 데이터
  • Byte: 8 Bit
  • KiloByte(KB): 2^10 Byte
  • MegaByte(MB): 2^20 Byte
  • GigaByte(GB): 2^30 Byte
    ...

실수형: float, double

  • 0.123, 0.99999 와 같은 소수점 실수값 저장

실수형 변수의 표현 범위

📌 실수도 동일하게 각 변수 표현 범위를 넘는 숫자를 넣게되면 오버플로우가 발생하고, 해당 숫자를 출력해보면 입력값과 다른 값으로 표현된다.
특히, 실수는 표현범위가 매우 넓어서 정수형 변수에서 담지 못할 수 있다.

  • float (4byte) : 3.4 * -10^38 ~ 3.4 * 10^38(long 보다 큼)
  • double (8byte) : 1.7 * -10^308 ~ 1.7 * 10^308(long 보다 큼)

float 는 4byte 만쓰는데 어떻게 long 보다 더 넓은 범위를 표현가능한가?
float 라는 단어의 뜻은 “부동” 이라는 의미를 가지고 있으며 소수점이 움직인다는 의미의 “부동 소수점 방식”으로 숫자를 저장한다.

  • 부동 소수점 방식 : 가수와 지수를 구분해서 저장하고 이값들을 곱한 값을 저장(표현)하는 방식


    ✋ float 가 long 보다 더 넓은 범위를 표현하기 때문에 자동 형변환이 안됨!
float floatNumber = 0.123f; // float 는 4byte 로 3.4 * 10^38 범위를 표현하는 실수값
double doubleNumber = 0.123123123; // double 은 8byte 로 1.7 * 10^308 범위를 표현하는 실수값

📌 실수형 리터럴 구분값(리터럴 = 데이터값)
float 와 double 의 데이터값(리터럴)을 구분하기 위한 구분자로 float으로 담을 숫자뒤에 f 를 붙임

문자형: char

  • ‘A’, ‘1’ 와 같은 문자값 하나 저장
  • 작은 따옴표(')를 사용
char alphabet = 'A'; // 문자 하나 저장

📌 아스키 코드(ASCII Code)
저장공간에 저장하는 값은 0,1 을 통한 숫자값을 저장한다.
그럼 문자는 어떻게 숫자로 저장할까?
바로, 숫자(int)를 문자(char)로 매핑해서(짝을 지어서) 표현한다!
숫자를 문자로 매핑하는 방법은 여러가지 방법이 있다.
그중에 Java 에서는 기본적으로 아스키 코드라는 규칙으로 문자를 저장(표현)하고 있다.
그래서 문자와 숫자는 서로 형변환 가능하다..!

char ch = (char)asciiNumber; 	// 숫자 -> 문자
int asciiNumber = (int)letter; 	// 문자 -> 숫자

논리형: boolean

  • True/False값 저장
boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화
flag = false; // 2. False 값 저장

참조형(Reference Type)

참조형 변수 = 주소형 변수?

다른 기본형 변수가 실제 값을 저장하는 저장공간 이라면
참조형 변수는 실제 값이 아닌 원본값의 주소값을 저장
따라서 주소형 변수라고도 불림

저장 관점에서 차이점

  • 기본형 변수 : 원본값이 Stack 영역에 존재
  • 참조형 변수 : 원본값이 Heap 영역에 존재
  • Stack 영역에는 따로 저장 해둔 원본값의 Heap 영역주소를 저장!

📌 메모리 구조

  • Stack: 정적으로 할당된 메모리 영역
    • 크기가 몇 byte 인지 정해져 있는 기본형 변수 저장
    • 추가로, 크기가 정해져 있는 참조형 변수의 주소 값도 저장
  • Heap: *동적으로 할당된 메모리 영역
    - 크기가 계속 늘어날 수 있는 참조형 변수의 원본 저장합

문자열: String

  • “Apple”, “텍스트” 와 같은 문장을 저장
  • 큰 따옴표(")를 사용
  • 문장의 끝에 \0(널문자)가 함께 저장이 됨!
    (몇개의 byte 를 쓸지 모르기 때문에 끝을 표시)
String message = "Hello World"; // 문자열 저장

그외: Object, Array, List …

  • 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장
List<int> alphabet = [0,1,2,3]; // 리스트: 기본형 변수 여러개 저장

래퍼 클래스(Wrapper Class)

래퍼 클래스(Wrapper Class)는 말 그대로 “기본형 변수를 클래스로 한번 랩핑(감싸는) 변수”

기본 타입래퍼 클래스
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

필요성

클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있음

박싱 VS 언박싱

  • 박싱: 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것
  • 언박싱: 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것
// 박싱: int -> Integer
int number = 21;
Integer num = new Integer(number);
// 언박싱: Integer -> int
int n = num.intValue();

형변환

  • Java 프로그래밍을 하다보면 문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고싶은 경우, 문자열에 숫자값을 추가하고 싶은 경우 등… 어떤 변수형을 다른 형으로 변환이 필요한 경우가 많다.
  • 형변환은 주로 기본형 변수인 정수 ↔ 실수 ↔ 문자 들 사이에서 일어난다.

자동 형변환 vs 강제 형변환

  • 작은 타입 > 큰 타입 형변환시 (자동 형변환)
    • 더 큰 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 없음
    • 값의 손실없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환
  • 큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
    • 더 작은 표현범위를 가진 타입으로 변환된는것이라 값의 손실이 생김
    • 값의 손실이 생기기 때문에 자동이 아닌 개발자가 선택하여 형변환

자동 형변환

  • Java 프로그래밍에서 형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환 되는 경우가 있다.
  • 프로그램 실행 도중에 값을 저장하거나 계산할때 자동으로 타입변환이 일어난다.

작은 크기의 타입에서 큰 크기의 타입으로 저장될때 큰 크기로 형변환이 발생

📌 변수 타입별 크기 순서
byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)

byte byteNumber = 10;
int intNumber = byteNumber;    // byte -> int 형변환
System.out.println(intNumber); // 10

char charAlphabet = 'A';
intNumber = charAlphabet;   // char -> int 형변환
System.out.println(intNumber); // A의 유니코드 : 65

intNumber = 100;
long longNumber = intNumber; // int -> number 형변환
System.out.println(longNumber); // 100

intNumber = 200;
double doubleNumber = intNumber; // int -> double 형변환
System.out.println(doubleNumber); // 200.0  (소수점이 추가된 실수출력)

작은 크기의 타입이 큰 크기의 타입과 계산될때 자동으로 큰 크기의 타입으로 형변환이 발생

int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber; // result 에 15.5 저장됨 (int -> double)

intNumber = 10;
int iResult = intNumber / 4; // iResult 에 2 저장됨 (int형 연산 -> 소수점 버려짐)

intNumber = 10;
double dResult = intNumber / 4.0; // dResult 에 2.5 저장됨 (double형 연산 -> 소수점 저장)

강제 형변환

Double, Float to Int

(Int)캐스팅 방식으로 실수를 정수로 치환하는 방법
이때 실수형의 소수점아래자리는 버려짐

double doubleNumber = 10.101010;
float floatNumber = 10.1010

int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환

Int to Double, Float

(Double,Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법

int intNumber = 10;
double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber;  // int -> float 형변환

+) 변수 초기화
자바에는 멤버변수, 클래스변수(static), 지역변수가 있는데
멤버변수, 클래스변수(static) 들은 기본값 초기화가 되지만,
지역변수는 초기화되지 않는다..!!!

Reference

🔗 스파르타코딩클럽 Java 문법 종합반
🔗 메모리구조 사진 자료

profile
공부한 내용은 바로바로 기록하자!

0개의 댓글