Java 변수, 아스키코드

jooyeongmee·2023년 2월 13일
0

TIL2023/2

목록 보기
3/8

TIL(2023.2.13)


변수

변수: 단 하나의 값을 저장할 수 있는 메모리 공간

메모리 공간은 정보처리의 기초 단위인 1 Byte로 구성되어 있다. (1 byte = 8 bits)

메모리에 값을 저장하거나 읽을 때 해당 메모리 주소를 사용해야 하는데 사람이 사용하기에는 불편하기 때문에 특정 메모리 영역에 이름을 붙이고 주소 대신에 이름을 사용해서 메모리 값을 저장하고 읽을 수 있게 한 것이 변수이다. 변수 선언을 하면 메모리에 값을 저장하기 위한 공간을 마련한다.

변수 생성 규칙:
1. 대소문자가 구분되며 길이에 제한이 없다.
2. 예약어(ex. true) 사용 불가
3. 숫자로 시작 불가
4. 특수문자 _와 $만 허용

변수의 여러가지 형태:
Camel case: varTest
Snake case: var_test
Pascal case: VarTest (자바에서는 클래스명만 대문자로 시작하자는 암묵적인 규칙이 있어서 X)
Kebab case: var-test (자바에서는 변수이름에 "-" 안됨.)

변수의 초기화:
char 타입은 빈 캐릭터로 초기화가 안됨. 공백으로 초기화 해야 함. String 타입은 다 가능.

char c = ''  //에러
char c = ' ' //초기화 성공!

String s = "" //초기화 성공!

변수의 종류

  1. 상수: 한번 저장하면 값을 못 바꾸는 변수 (변수 타입 앞에 final 붙임) --> 코드 자체의 가독성을 늘리기 위해 사용.
  2. 리터럴: value를 말함.
// score: 변수
// finalScore: 상수
// 100, 1000: 리터럴
class Variable2_2 {
    public static void main(String[] args) {
        int score = 100;
        final int finalScore = 1000;
    }
}

리터럴의 접두사와 접미사

  • long type 접미사 L
  • float type 접미사 f
  • double type 접미사 d 이지만 생략 가능(실수형의 default 접미사이기 때문)

변수와 리터럴의 타입 불일치

  • 범위가 '변수 > 리터럴'인 경우: 가능!

    ex.)
    int i = 'A'; int > char, 'A' = 65
    long l = 123; long > int
    double l = 3.14f; double > float

  • 범위가 '변수 < 리터럴'인 경우: Error!

    ex.)
    int i = 30_0000_0000; int의 범위(대략 20억)를 넘습니다.
    long l = 3.14f; long < float
    long(8bye), float(4byte)라 가능할 것 같지만
    실수형은 정수형 보다 저장 범위가 훨씬 넓기 때문에 Error가 발생합니다.
    float f = 3.14; float < double;

    이럴 경우 타입 캐스팅을 하면 에러가 안 난다. 하지만 데이터의 손실이 생길 순 있다.


기본형 타입

기본형 타입은 크게 논리, 문자, 정수, 실수 형으로 나뉜다. (String 타입은 기본형이 아님!)

  • 논리형 : boolean
  • 문자형 : char
  • 정수형 : byte, short, int, long
  • 실수형 : float, double
  • n bits로 표현할 수 있는 값의 개수: 2^n
  • n bits로 표현할 수 있는 부호없는 정수의 범위: 0 ~ 2^n - 1
  • n bits로 표현할 수 있는 부호있는 정수의 범위: -2^(n-1) ~ 2^(n-1) - 1
  • 그래서 byte 타입(1B, 8bits)의 범위가 -128 ~ 127

실수형 표현 범위

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

저장방식: IEEE 754


S: 부호, 즉 양수인지 음수인지 판단
E: 지수, 즉 2의 지수
M: 가수, 즉 소수점 이하
실수형은 정수형과는 저장방식이 다르기에 오차가 있다. 그래서 정밀도를 알아야 한다.

  • float의 M 즉, 가수는 23자리인데 정규화를 통해서 24자리까지 표현 가능하다.
  • 따라서 2^24 까지 표현이 가능한데 2^24는 10^7 < 2^24 < 10^8 임으로 정밀도는 7자리이다.
  • 마찬가지의 이유로 double은 15자리이다.

아스키코드 (7bits)

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

정수형 오버플로우

해당 변수타입의 최솟값, 최대값 범위를 넘어가면 값을 순환한다.

타입간의 변환방법:

  1. 숫자 --> 문자: 숫자 + '0'
  2. 문자 --> 숫자: 문자 - '0'
  3. 숫자 --> 문자열: 숫자 + ""
  4. 문자 --> 문자열: 문자 + ""
  5. 문자열 --> 숫자: Integer.parseInt("문자열"), Integer.parseInt("문자열")
  6. 문자열 --> 문자: "문자열".charAt(0)

참조형 타입 - String, System

참조형 변수는 null 또는 메모리 주소를 저장. 항상 4 byte(64bit -> 8 byte).
4byte는 2진수로 대략 40억개로, 40억byte(4GB)의 메모리를 다룰 수 있습니다.

class Variable3_5 {
    public static void main(String[] args) {
        // Date import 필요!
        Date date; // 참조형 변수 date 를 선언
        date = new Date(); // date 에 객체의 주소를 저장 , new 는 객체를 생성하는 명령어

        System.out.println(date); // Wed Jan 11 20:54:45 KST 2023
    }
}
profile
부지런하면서도 게으른 공순이

0개의 댓글