3. 변수란?

지오니모·2022년 6월 30일
0

JavaScript

목록 보기
3/5

1. 변수(Variable)

프로그래밍에서의 변수는 다음의 의미를 가진다.

데이터 또는 자료를 저장하기 위한 메모리 공간

컴퓨터는
키보드나 마우스를 통해 사용자로부터 정보를 입력받아
HDD와 RAM을 통해 기억한 것을 CPU가 처리하는데,
CPU는 HDD와 같은 보조 기억 장치에 직접 연결되지 않는다.
오직 주 기억 장치인 RAM과 연결되어 처리하게 된다.

따라서 프로그램을 처리하려면 들어오는 정보를
저장 또는 기억해두야 하기 때문에
정보를 저장할 수 있는 공간을 마련해야 한다.
이때 공간이 '메모리'에 존재하고,
이를 '변수'라고 한다.

즉 변수는 프로그램을 처리하기 위한 값을
컴퓨터에 기억시키기 위한 것이다.
사용법은 다음과 같다.

DataType 변수명; //선언
변수명 = 값; // 초기화

2.자료형

변수를 선언할 때,
변수명 앞에 DataType을 넣어줬는데, 이를 직역한 것이 자료형이다.
자료형은 말 그대로 우리가 컴퓨터에 입력하는 데이터의 형식을 의미한다.

그렇다면 데이터의 형식은 왜필요할까?

컴퓨터는 1을 입력하면 입력받은 것이 문자인지 숫자인지
구분해주지 않는다면 처리할 수 없다.

이는 자료의 형태에 따라서 메모리 상에 저장되는 영역이 다르고,
그 공간의 크기와 표현할 수 있는 범위가 다르게 설정되어 있기 때문이다.

이러한 자료형은 다음과 같이 정리할 수 있다.

구분/크기1byte (8bit)2byte (16bit)4byte (32bit)8byte (64bit)
기본형byte, booleanshort, sharint, floatlong, double
참조형string

2-1) 값 범위

정수형
byte -128 ~ 127 (256개)
short -32768 ~ 32767 (65536개)
char 'A' (ASCII 65) 0~65535 (65536개)
int 100032 -2^31 ~2^31-1
long 100000000L 20억 이상

실수형
float 3.14f 오차 없는 7자리
double 7.0879977 오차 없는 15자리


기본적으로 '1byte = 8bit'이고,
bit01로 수를 나타낸다.
따라서 n개의 bit가 표현할 수 있는 개수는 2^n개 이다.
여기서 부호의 사용 여부에 따라 표현하는 범위가 반토막이 난다.

한가지 짚고 넘어가야 할 건,
특히 char는 정수형이 아닌 문자형으로 구분하곤 한다.
하지만 char가 나타내는 문자라는 개념 자체가 컴퓨터에게 없다.
즉, 컴퓨터는 하나의 약속으로서 문자모양을 코드로 변환하여 저장하는 것이고
그 규약을 ASCII code라고 한다.
추가로 실수형은 정수형과 달리 숫자의 개수에 관심이 없고,
표현할 수 있는 정밀도에 관심이 있다.
이는 실수형의 bit 분배 형식이 다르기 때문이다.


2-2) 기본형과 참조형의 차이
위 표를 보면 기본형들은 범위가 고정되어 그 안에서만 값을 저장할 수 있다.
또한 메모리 전체에서 8byte는 굉장히 작은 값에 불과하다.

int a = 1;
int b = 2;

하지만 참조형은 사이즈가 고정되지 않고 얼만큼의 데이터를 넣느냐에 따라 바뀐다.
그래서 매우 커질 가능성이 있다.

String a = "aaaaa";
String b = "aaaaaaaaaaaaaa";

이런 기본형과 참조형을 컴퓨터의 관점에서 구분 짓기 위해서는
운영체제(OS)를 알아야 한다.
흔히 운영체제의 핵심을 기본적으로 다음 두가지로 인식한다.

• 인터페이스 제공
• 컴퓨터 부팅(펌웨어~운영체제)

하지만 진짜 핵심은 자원관리(Resource management) 가 핵심이다.

그렇다면 Resourse managemnet는 무엇인가?

CPU, RAM, HDD 를 운영체제가 관리하는 것으로 각 파트에서 다음과 같은 역할을 한다.
CPU : 일처리 순서 배정 (운영체제의 스케줄링 알고리즘)
HDD : 자료를 효율적으로 저장하여 가장 효율적인 loading을 구현한다.
(File System-NTFS)
RAM : 가상 메모리 시스템

여기서 가장 메모리 시스템은 물리적인 형태의 메모리를 논리적으로
Stack, Date, Heap, Text로 나누어 각각의 영역마다 다른 데이터를 저장한다.

Stak : 지역 변수, 매개 변수
Data : Static 변수
Heap : 동적
Text : 기본 명령 코드, 입력 코드

기존 win98까지 서버 컴퓨터에서만 돌아가던 시스템은
XP부터 가져오게 되면서 데이터의 충돌이 줄고, 입출력도 빨라졌다.

이처럼 운영체제는 가상 메모리 시스템을 통해서 메모리를 나누는데,
기본형 변수의 특징은 Stack이라는 자료구조 영역에 적합한 반면,
참조형 변수는 Heap에 저장되기 적합하다.
여기서 참조형 변수 공간은 Stack에 생겨나지만
거기에 들어가 있는 것은 바로 Heap에 있는 데이터의 주소이다


3. 형변환 : Promotion, Casting

기본형 자료 안에는 대소 관계가 존재한다.

byte(1)short(2),char(2)int(4)long(8)float(4)double(8)
long(8)보다 float(4)이 표현할 수 있는 값의 범위가 더 넓기 때문에
크기가 더 크다고 볼 수 있다. 그러므로 자동 타입 변환이 가능하다.

대소 관계라는 것은
특정 자료형이 다른 자료형을 전부 포함할 수 있을 때 '크다'라고 한다.
이를 단순 자료의 크기 차이로 생각해서는 안된다.
컴퓨터는 안정적인 연산을 하기 위해서 '형변환'을 일으킨다.
그리고 형변환은 관점의 차이에서 Promotion, Casting으로 구분된다.


3-1) Data type Promotion
Promotion은 작은 것이 큰 것으로 바뀌는 건 자동적인 현상이다.
기본적인 자바는 들어가는 데이터 값에 맞게 설계가 되어 있어
타입에 맞게 데이터를 넣어야 한다.
그러나 서로 다른 자료형이라고 무조건 오류가 나지 않는다.

이때 Promotion
"좁은 범위의 자료형이 넓은 범위의 자료형에 연산될 때"
일어난다.

구체적으로 컴퓨터가 연산이 되려면 피연산자의 데이터 타입에 맞아야 한다.

서로의 bit가 맞아야 연산이 가능하다는 것이다.

byte a = 10;
int b = a;

일 때,
변수 a 는 byte 타입이므로 1byte 크기를 가진다.
그리고 변수 b 는 int 타입 이므로 4byte 크기를 가진다.
따라서 byte 타입 변수 a 는 int 타입 변수 b로 자동 타입 변경 된다.

작은 것이 큰 것에 들어가려면
서로 배정된 bit의 수가 안 맞기 때문에
모자란 비트를 자동으로 추가해주는 것이다.
Promotion이 발생하면 변환이전 값과 이후 값은 동일하다.(손실없이 보존된다)


3-2) Data type Casting(강제 형변환 연산자)
반대로 Casting이란
사용자가 타입 캐스트 연산자( )를 사용하여 강제적으로 수행하는 타입 변환을 가리킨다.
큰 크기의 타입을 작은 크기의 타입으로 강제로 쪼개어서 저장하는것이므로,
값의 손실이 발생할 수 있다.
큰 크기의 타입이 작은 크기의 타입으로 강제 타입 변환 되는 경우
끝에서부터 작은크기의 타입만큼만 저장되고 나머지는 버려진다.
int 와 byte 간의 강제 타입 변환의 경우,
int 타입의 4byte 중 byte 타입의 1byte 만큼만 끝에서 남겨지고 나머지는 다 버려진다.

  • 다른 예로 long타입 변수에 300이 저장되어 있을경우,
    8byte중 끝의 4byte로 300을 충분히 표현할 수 있으므로,
    이것을 int 타입으로 강제 타입변환 해도, 값의 손실이 발생하지않는다.
long a = 300;
int b = (int) b; // 300이 그대로 저장된다.
  • 실수타입이 정수타입으로 강제 타입변환 될 경우, 소수점 아래부분은 버려지고 정수부분만 저장된다.
double a = 3.14;
int b = (int) a ; // 결과값은 3이 된다.

주의할 점은
범위가 수용 가능하더라도 타입이 다르면 절대 되지 않는다는 것이다.
즉, 지금 가진 값이 아닌 데이터 타입이 더욱 중요하다.

또한,
작은 타입에 강제로 표현 불가능한 것을 대입하면
오버플로우가 발생하기 때문에 데이터가 깨진다.


4. 연산자

연산자는 기본적인 상식을 벗어나지 않기 때문에 몇 가지 주의 사항만 보자.
• 대입 연산자 : =
대입 연산자는 우항에서 좌항으로 대입이 된다.
int a = 10;
여기서 좌항은 값을 저장할 수 있는 공간이어야만 한다.
애초에 대입 자체가 공간에 저장하는 것이다.
때문에 공간이 아닌 곳은 절대로 대입연산자의 좌항에 올 수 없다.
• 증감 연산자 : ++ --
증감 연산자는 다음과 같은 의미를 가진다.
++ : A = A+1(1씩 증가)
-- : A = A-1(1씩 감소)

막상 코드를 풀어서 보면 대입 연산자와 별반 다른 것이 없지만,
우리가 자주 헷갈리는 것은 '연산 타이밍'이 다르다는 것이다.

구체적으로 전위형과 후위형으로 나뉘는데 그 의미는 다음과 같다

-전위형 : 증가 후 참조
-후위형 : 참조 후 증가

int A = 10;
System.out.print(A++); // 10, A+1
System.out.print(A); // 11

위 코드에서 변수 A에 저장된 값은 10이다.
그리고 출력문에 A++를 했지만, 정작 나온 값은 10이고
다음 출력문에 1이 더해진 11이 나왔다.
이를 볼 때,
증감연산자의 타이밍이란 본인이 속한 라인에서 값이 증감하는 우선순위를 의미한다.





출처 : https://velog.io/@ho_c

profile
프론트엔드 지망생

0개의 댓글