Notice
Recent Posts
Recent Comments
05-21 07:17
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

Variable 변수 본문

Programming Language/Java

Variable 변수

알 수 없는 사용자 2022. 9. 5. 23:05

변수 : 하나의 값을 저장할 수 있는 메모리 공간을 의미한다.

 메모리에 자기가 원하는 데이터를 저장할 수 있도록 컴퓨터에게 명령을 할 때, 자바는 다음과 같이 선언을 하게 된다.

// 선언할 데이터의 형태에 따라 다음과 같이 선언한다.
int age;
double value;

 int는 정수(음수, 0, 양수)의 데이터를 저장하고 싶을때, double은 실수의 데이터를 저장하고 싶을때 사용한다.

 (데이터형) (변수이름) 으로 코드 파일에 넣으면 된다. 이때, 변수 이름을 명명하는데에는 아무런 규약이 없지만, 프로그래머들이 서로서로 잘 알아 볼 수 있도록 다음과 같이 어떤 규칙하에 적자고 약속한다.

작성 규칙 설명
첫 번째 글자는 문자이거나 '$', '_'이어야 하고 숫자로 시작할 수 없다. 안되는 것 : 0value, @spam, $hihi, ...
영어 대소문자가 구분된다. 다음은 서로 다른 변수이다.
value, Value
time_table, time_Table
첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다. (관례 : 예로부터 이어져오는 관습) maxSpeed(O), max_speed(▲) => 써도 되지만, 자바에 한해서는 전자를 많이 쓴다.
문자 수(길이)의 제한은 없다.  
자바 예약어는 사용할 수 없다. 안되는 것 : boolean, public, implements, new, void, if, switch, do, while, break, try, finally, throw, throws, true, false, transient, volatile, package, import, synchronized, native, final, static, strictfp, assert, ...

ex) int assert; (X)

 그리고 변수 이름은 해당 변수가 어떤 데이터가 저장되어 있는지 다른 개발자가 봤을때 명확하게 와닿을 수 있을 정도의 이름이 가장 좋은 명명법이다.

 변수를 선언했다면, 해당 공간에 데이터를 삽입하는 작업을 또 선언해주어야한다. 공간만 만들어서는 아무런 데이터가 들어가지 않는다. 값을 저장하는데에는 연산자 =을 쓴다.

int mathScore; // 변수 공간 만들기
mathScore = 100; // 공간에 데이터 넣기

 초기값은 변수를 선언함과 동시에 줄 수도 있다. 즉 선언하는 그 줄에 바로 넣을 수 있다는 것이다. 다음 예제를 보면 된다.

int englishScore = 90; // (변수타입) (변수명) = (정수 리터럴 표기법);

 변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 직접 입력된 값을 리터럴(literal)이라고 부른다.

 리터럴은 값의 종류에 따라 정수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴로 구분된다. ( ➕ 리터럴은 상수Constant 와 같은 의미지만, 프로그램에서는 상수를 "값을 한 번 저장하면 변경할 수 없는 변수"로 정의하기 때문에 이와 구분하기 위해 리터럴 이라는 용어를 사용한다고 한다. )

 아래는 리터럴 표기법 표이다.

리터럴 표기법 예제
정수 리터럴 (10진법) 0, 75, -100
정수 리터럴 (8진법) 02, -04, 02022
정수 리터럴 (16진법) 0x5, 0X19, 0xB3, 0XFF
정수 리터럴 (long 형 전용 - l은 잘 안보이기에 L을 적는다) 10382750L, -283741927l
실수 리터럴 0.25, -0.3141592
실수 리터럴 (지수 표기법) 5E10, 0.314E-10
실수 리터럴 (float 형 전용) 3.14F, 3e10f
문자 리터럴 (문자 하나) 'A', 'a', ';', '\n', '한', '글'
문자열 리터럴 (문자 여러개) "훈민정음", "Korean is 최고", "\t탭입니다."
논리 리터럴 true, false
더보기

이스케이프 문자 : 역슬래쉬(\)가 붙은 문자 리터럴은 이스케이프(escape) 문자 라고도 한다. \t, \n, \r. \", \', \\, \u16진수 등이 있다.

 

변수의 가용 범위(Available Range)

 변수는  중괄호 블록내에서 선언되고 사용된다. 따라서 그 밖을 벗어나면 그 변수는 사용을 하지 못하게 된다. 중괄호 문법을 쓰는 곳은 클래스, 생성자, 메소드, 제어문인데 특히, 메소드 내에서 생성된 변수를 로컬 변수(local variable)이라고 하고, 로컬 변수는 메소드가 실행이 끝나면 메모리에서 자동으로 삭제가 된다. 다음은 제어문에서 선언한 변수를 가지고 오려고 할 때, 잘못된 예제이다.

public class Example {
	public static void main(String[] args) {
    	int value = 10;
        int sum = value + 20;
        
        if(sum > 20) {
        	int var1 = 10;
        }
        
        System.out.println(var1); // <-- 오류 구문
    }
}

 

데이터 타입

데이터 타입에는 기본(primitive) 타입이라는게 있다. primitive type은 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다.

데이터 종류 primitive type 메모리 사용 크기 ( 부호가 있다면 1비트는 빠져서 부호를 나타내게 된다. 부호비트는 맨 앞 비트 = Most Signnificant Bit MSB) 저장되는 값의 범위
정수 byte 1 byte 8 bit -2^7 ~ 2^7 -1
char 2 byte 16 bit 0 ~ 2^16 -1
short 2 byte 16 bit -2^7 ~ 2^15 -1
int 4 byte 32 bit -2^31 ~ 2^31 -1
long 8 byte 64 bit -2^63 ~ 2^63 -1
실수 float 4 byte 32 bit
1 bit - 부호
8 bit - 지수 exponent
23 bit - 가수 (0<=~<1)
(+/-) 1.4E-45 ~ (+/-) 3.4028235E38
double 8 byte 64 bit
1 bit - 부호
11 bit - 지수 exponent
52 bit - 가수 mantissa
(+/-) 4.9E-324 ~ (+/-) 1.7976931348623157E308
논리 boolean 1 byte 8 bit true, false

 

자동 타입 변환(Promotion)

타입 변환은 타입이 다른 타입으로 변하는 것을 말한다. 보통 큰 크기의 타입 = 작은 크기의 타입 으로 바꾸려는 타입이 기존 타입의 메모리크기보다 더 크거나 같아야한다.

byte < short < int < long 순으로 크므로 byte에선 어디로든 변환 가능하다. ( 단, char은 음수가 없으므로 변환이 안된다. )

public class Example {
	public static void main(String[] args) {
    	byte byteValue = 10;
        int intValue = byteValue;
        System.out.println(intValue);
        
        char charValue = '가';
       	intValue = charValue;
        System.out.println(intValue);
        
        intValue = 500;
        long longValue = intValue;
        System.out.println(longValue);
        
        intValue = 200;
        double doubleValue = intValue;
        System.out.println(doubleValue);
        
    }
}

 

강제 타입 변환 (Casting)

메모리에서 값을 복사할때, 큰 값을 작은 값으로 변환시키고 싶을때가 있다. 이때, 4바이트의 int형 데이터를 1바이트의 byte로 가져가고 싶을때, 뒤의 1byte만 복사가 되고, 나머지 3byte는 전부 버려진다. 강제 타입 변환은 다음과 같이 쓰인다.

int value1 = 102948392;
byte value2 = (byte) value1; // 캐스팅

 

더보기

캐스팅을 할 때에는 손실되는 데이터가 우려되므로 다음과 같은 검사를 통해 올바르게 타입을 변환시키도록 한다.

public class CheckValueBeforeCasting {
	public static void main(String[] args) {
    
    	int i = 128;
    
    	if ((i<Byte.MIN_VALUE) || (i>Byte.MAX_VALUE) {
        	System.out.println("byte 타입으로 변환이 불가능 합니다.");
            
        } else {
        	byte b = (byte) i;
            System.out.println(b);
        }
    }
}

자료형들의 최솟값과 최댓값을 호출하고 싶을때는 다음 표를 참고하자.

type Maximum Minimum
byte Byte.MAX_VALUE Byte.MIN_VALUE
short Short.MAX_VALUE Short.MIN_VALUE
int Int.MAX_VALUE Int.MIN_VALUE
long Long.MAX_VALUE Long.MIN_VALUE
float Float.MAX_VALUE Float.MIN_VALUE
double Double.MAX_VALUE Double.MIN_VALUE

또한 정수 타입을 실수 타입으로 변환할 때에도 정밀도 손실을 피하기 위해 최대한 높은 비트 수로 변환하여야 한다.

public class FaultExample {
	public static void main(String[] args) {
    	int num1 = 123456780;
        int num2 = 123456780;
        
        float num3 = num2;
        num2 = (int) num3;
        
        int result = num1 - num2;
        System.out.println(result); // -4
    }
}

// ==============================================

public class ValidExample {
	public static void main(String[] args) {
		int num1 = 123456780;
        int num2 = 123456780;
        
        double num3 = num2;
        num2 = (int) num3;
        
        int result = num1 - num2;
        System.out.println(result); // 0
    }
}

해당 문제점은 int는 32비트의 숫자(정확히는 31비트)를 표현하는 123456780의 정수 리터럴이 들어가 있는데, 해당 가수에는 23비트의 공간에 123456780의 값을 저장할 수 없기 때문이다. 따라서 double이 52비트의 가수를 저장할 수 있으므로 double로 바꿔줘야 데이터 손실이 나지 않는다.

 

연산식에서의 자동 타입 변환

 기본적으로 같은 타입의 피연산자 간에만 수행되기 때문에 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중에 크기가 큰 타입으로 자동 변환된 후에 계산된다. 또한 자바는 정수 연산일 경우 int 타입을 기본으로 하는데, 그 이유는 피연산자를 4byte 단위로 저장하기 때문이다. 4byte 보다 크기가 작은 타입인 byte, char, short 등은 전부 int 타입으로 변환된 후에 연산이 수행된다.

'Programming Language > Java' 카테고리의 다른 글

조건문과 반복문  (0) 2022.09.14
자바 연산자  (2) 2022.09.08
자바 제어자  (0) 2022.08.30
표준 입출력  (0) 2022.08.30
자료구조 - Arrays  (0) 2022.08.30
Comments