Cute Running Puppy
본문 바로가기
개발일기/Java

[Java] 변수

by 징구짱 2023. 2. 16.
728x90

상수
  •  번만 값이 저장 가능한 변수
  • 숫자에 의미있는 이름을 붙여 코드 자체의 가독성을 늘리기 위해 사용   ex) '시험의 만점은 100이다.'
     
  final int finalScore = 100;

 

 


리터럴
 
  • 그 자체로 값을 의미하는 것
  • 기존의 상수와 같은 의미지만 상수는 변수 리터럴은 데이터를 의미

 

 


변수, 상수, 리터럴 구별하기
int score = 100;
final int finalScore = 1000;
  • score : 변수
  • finalScore : 상수
  • 100, 1000 : 리터럴

 

 


리터럴의 접두사와 접미사

리터럴의 종류(타입) 구분

접두사

접두사를 사용하여 2진수(0b), 8진수(0), 16진수(0x), 를 표현할 수 있다.

int ob = 0b0101; // 2진수, 접두사 0b
int i = 100; // 10진수
int oct = 0100; // 8진수, 접두사 0
int hex = 0x100; // 16진수, 접두사 0x

 

접미사

  • 정수형
    • byte, short, int, long
    • 기본형 : int  (접미사를 붙이지 않음)
    • long : 구분을 위해 리터럴 마지막에 접미사로 L을 붙임 ex) 100L
      접미사는 대소문자를 구별하지 않지만 L의 소문자 l 은 숫자 1 혼동되기 쉽기 때문에 대문자를 사용 
long price = 2_147_483_648L; // _ 를 사용하여 숫자 표현 가능!
// long l1 = 2_147_483_648; // Error 발생, int 범위를 넘었으니 L 접미사 필수!
long l2 = 100; // int의 범위를 넘지 않으면 L 생략 가능!

 

  • 실수형
    • float, double
    • 기본형 : double (접미사를 붙이지 않음)
    • float: 구분을 위해 리터럴 마지막에 접미사로 f를 붙임  ex) 3.14f
// float tax1 = 3.14;	// 기본형이 double 이므로 접미사 f 필요
float tax2 = 3.14f;

double score1 = 3.14159265358979; // d 생략 가능!
double score2 = 3.14159265358979d;

float f1 = 10f; // 10.0f
double d1 = 10.; // 10.0
double d2 = .10; // 0.10
double d3 = 1e3; // 1000.0 , e3 = 10의 3제곱
double d4 = -1e3; // -1000.0
 

 


변수와 리터럴의 타입 불일치
  • 범위가 '변수 > 리터럴' 인 경우 : OK
int i = 'A';  		// int > char, 'A' = 65
long l = 123; 		// long > int
double l = 3.14f;	// double > float

 

  • 범위가 '변수 < 리터럴' 인 경우 : Error
int i = 30_0000_0000;		// int의 범위(대략 20억)를 넘음
long l = 3.14f;			// long < float
				// long(8bye), float(4byte)라 가능할 것 같지만 
				// 실수형은 정수형 보다 저장 범위가 훨씬 넓기 때문에 Error
float f = 3.14;  		// float < double;

 

  • byte, short 변수에 int 리터럴 저장 : OK  (단, 변수의 타입의 범위 이내여야함)

 

 


기본형

  • 기본형 : 가장 기본이 되는 타입
    • 논리형 (boolean) : 조건식과 논리적 계산에 사용
    • 문자형 (char) : 변수 당 하나의 문자만을 저장
    • 정수형 (byte, short, int, long) : 정수 값을 저장. 주로 int, long을 사용. byte는 이진데이터를 다루는데 사용
    • 실수형 : float, double
  • 기본형 변수는 실제 값을 저장

 

 


기본형의 표현범위

  • 1bit 에는 0과 1이 들어갈 수 있음
  • n비트로 표현할 수 있는 값의 개수 : 2ⁿ 개                                           ex) 8bit = 2 : 256개
  • n비트로 표현할 수 있는 부호없는 정수의 범위 : 0  ~  2ⁿ-1                ex) 8bit : 0 ~ 255
  • n비트로 표현할 수 있는 부호있는 정수의 범위 : – 2ⁿˉ¹  ~  2ⁿˉ¹-1       ex) 8bit : -128 ~ 127
  • 각 자료형의 MAX, MIN 값을 가져올 수 있음
System.out.println(Short.MAX_VALUE);
System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
System.out.println(Float.MAX_VALUE);
System.out.println(Float.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);

 

 


실수형의 표현범위

정밀도 : 소수점 몇자리 까지 오차없이 표현할 수 있는가

  • S(부호) : 양수, 음수를 표현
  • E(지수) : 2의 지수를 표현
  • M(가수) : 소수점 이하를 표현

 

float의 M(가수)는 23자리인데 정규화를 통해서 24자리까지 표현이 가능 ( 10⁷ < 2²⁴ < 10 이므로 정밀도는 7자리 )
마찬가지의 이유로 double은 15자리

실수형은 +-M x 2^E 형태로 저장하기 때문에 더 큰 범위의 값을 저장 가능

같은 4byte 크기지만 float이 int 보다 더 큰 범위의 값을 저장

 

 


메모리에 값이 저장되는 과정

 
  • 변수 b에 10진수 3을 저장하면 컴퓨터는 이를 2진수로 변환하여 메모리에 저장
  • 타입 마다 위처럼 값이 저장되는 형식이 있어서 그 형식에 맞게 변환되어 저장됨

 

 


아스키코드

문자를 표현하기 위해 문자와 숫자를 매칭하는 코드 ( 컴퓨터는 아스키 코드표를 기준으로 매칭하여 문자를 저장 )
문자코드는 음수를 사용할 필요가 없기 때문에 char의 범위에는 부호가 없음

 

  • 아스키코드
    128개의 문자조합을 제공하는 7비트 부호
    알파벳, 숫자, 특수기호, 그 외 컴퓨터에 필요한 몇 가지만이 정의
  • 유니코드
    각 나라별 언어를 모두 표현하기 위해 나온 코드 체계
    문자마다 고유한 코드 값을 제공하는 새로운 개념의 코드
    16비트로 표현 - 최대 65,536 자 표현 가능
  • UTF-8
    유니코드를 사용하는 인코딩 방식 중 하나
    영문/숫자/기호는 1바이트로, 한글/한자는 3바이트로 표현
    전세계 모든 글자들을 한꺼번에 표현 가능
    유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지 사용 

 

 


정수형 오버플로우

정수형은 해당 변수타입의 최솟값, 최댓값 범위를 넘어가면 값을 순환

 // 부호있는 경우
short sMin = -32768;
short sMax = 32767;

// short 타입에서 최솟값 범위를 넘었을 때
System.out.println((short)(sMin - 1));	// 32767
// short 타입에서 최댓값 범위를 넘었을 때
System.out.println((short)(sMax + 1));  // -32768

// 부호없는 경우
char cMin = 0;
char cMax = 65535;

// short 타입에서 최솟값 범위를 넘었을 때
System.out.println((int)(--cMin));  // 65535
// short 타입에서 최댓값 범위를 넘었을 때
System.out.println((int)(++cMax));  // 0

 


타입간의 변환방법
  • 문자와 숫자간의 변환
    • 숫자를 문자로  :  숫자 + '0' → 문자
    • 문자를 숫자로  :  문자 - '0' → 숫자
int num = 5;
char ch = '5';

// 숫자 -> 문자
// '0' 이 48이기 때문에 결과값을 char 타입으로 변환 필요
System.out.println("num + '0' = " + (char)(num + '0'));

// 문자 -> 숫자
System.out.println(("ch - '0' = " + ch - '0');

// '5' 에서 숫자 5로 변환되었기 때문에 결과값 6
System.out.println("ch - '0' + 1 = " + ch - '0' + 1);

 

  • 문자열로의 변환
    • 숫자를 문자열로  :  숫자 + "" → 문자열
    • 문자를 문자열로  :  문자 + "" → 문자열
int num = 5;
char ch = '5';

// 숫자 -> 문자열
// num 이 "5" 로 변환되었기 때문에 "5" + "5" 로  결과값은 "55"
System.out.println(num + "" + "5");
        
// 문자 -> 문자열
// ch 이 '5' 에서 "5" 로 변환되었기 때문에 "5" + "8" 로  결과값은 "58"
System.out.println(ch + "" + "8");

 

  • 문자열을 숫자로
    • Integer.parseInt("문자열")
    • Double.parseDouble("문자열")
  • 문자열을 문자로
    • "문자열".charAt(0)
String str1 = "100";
String str2 = "3.14";
String str3 = "8";

// 문자열 -> 숫자
System.out.println(Integer.parseInt(str1));
System.out.println(Double.parseDouble(str2));
// Integer.parseInt() 은 int 타입만 가능
System.out.println(Integer.parseInt(str2)); // Error 발생

// 문자열 -> 문자
System.out.println(str1.charAt(0) + str1.charAt(1) + str1.charAt(2));

 

 


참조형
  • 기본형을 제외한 나머지 타입   ex) String, System
  • 참조형 변수는 null 또는 메모리 주소를 저장함 (null 은 어떤 객체의 주소도 저장되지 않음)
  • 타입에 관계없이 변수의 크기가 항상 4byte (JVM이 64bit일 경우 8byte)
  • 4byte는 2진수로 대략 40억개로, 40억byte(4GB)의 메모리를 다룰 수 있음

문자와 문자열 차이

 char ch1 = 'A'; // 문자
 // char ch2 = 'AB'; // Error 발생
 // char ch3 = ''; // Error 발생, 빈 문자 불가능

 String s1 = "ABC"; // 문자열
 String s2 = ""; // 빈 문자열 가능
 String s3 = "A"; // 문자 한 개도 문자열!

 // 아래 두 표현식 모두 사용 가능하지만 ss2 방식은 거의 사용하지 않음!
 String ss1 = "AB";
 String ss2 = new String("AB");

 

문자열 결합

 // 문자열의 결합
 String s1 = "A" + "B"; // "AB"

// 문자열은 문자열하고만 결합 (숫자는 문자열로 바꾼 다음에 결합)
String s2 = "" + 7;

// 문자열 결합 순서에 의한 차이 확인!
String s3 = "" + 7 + 7; // "77"
String s4 = 7 + 7 + ""; // "14"
728x90

'개발일기 > Java' 카테고리의 다른 글

[Java] 배열  (0) 2023.02.16
[Java] 연산자  (0) 2023.02.16
자바 이해하기  (0) 2023.02.15
자바 버전 변경하기  (0) 2023.02.14
인텔리제이 프로젝트 시작하기  (0) 2023.02.08