[Java] 변수란 무엇인가?

2024. 7. 31. 19:03Java/변수

변수란?

변수는 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름이다. 자바에서는 메모리 관리를 위해 다양한 타입의 값을 저장할 수 있다. 변수를 사용하려면 '변수 선언'을 통해 어떤 타입의 데이터를 저장할 것인지, 변수의 이름을 결정하여야 한다. 

int age;
double value;

 

변수가 선언되면 대입연산자(=)를 이용하여 값을 저장한다. 대입연산자는 우측 값을 좌측 변수에 대입한다는 의미이다. 값이 대입될 때 비로서 메모리에 할당된다. 최초로 값을 대입하는 행위를 '변수 초기화'라고 한다. 따라서 초기화하지 않은 변수는 메모리 값을 읽을 수 없다(컴파일 에러 발생).

 

*단, 인스턴스 변수는 초기값이 존재한다. (출처: <<헤드퍼스트 자바>>)

int score;
score = 90;

 

변수는 또 다른 변수에 대입되어 메모리 간에 값을 복사할 수 있다. 

int x = 10;
int y = x;

 

정수 타입

자바는 정수, 실수, 논리값을 저장할 수 있는 기본 타입 8개를 제공한다.

 

*기본 타입이 동일한지 비교할 때에는 ==을 사용한다. 

정수 byte,char,short,int,long
실수 float,double
논리(true/false) boolean 

 

아래는 각 타입의 메모리 할당 크기와 저장되는 값의 범위이다. 

 

*이진수 표현 방식은 다음을 참조(<<혼자 공부하는 컴퓨터 구조 + 운영체제>>, p.54)

 

타입 변수의 허용 범위를 넘어서면 컴파일 오류가 발생한다. 예를 들어, int 타입의 범위를 넘어서는 경우에는 리터럴 뒤에 'l'이나 'L'을 붙여야 한다

long number = 10000000000000000; //컴파일 에러
long number = 10000000000000000L; //정상 작동

 

문자 타입

하나의 문자를 작은 따옴표(')로 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드(0~65535) 숫자로 변환되어 저장된다. 따라서 숫자를 대입하는 것도 가능하다. 빈문자는 허용하지 않는다. 만약, 공백이 필요하면 공백(유니코드:32)으로 초기화하여야 한다. 

 

char var1 = 'A'; //'A' = 65
char var2 = '가'; //'가' = 44032

 

실수 타입

실수 타입은 float과 double 두 가지가 있으며, 아래와 같다. 

double이 float보다 더 큰 실수를 저장할 수 있고, 정밀도 또한 높다. float에 대입하고 싶다면 long과 마찬가지로 리터럴 뒤에 'f'나 'F'를 붙여야 한다. double은 2배의 유효 소수점을 가지기 때문에 정확한 데이터 저장이 가능하다. 

 

논리 타입

참과 거짓을 의미하는 논리 리터럴에는 true와 false가 있다. 주로 조건문과 실행문의 실행 흐름을 변경하는데 사용된다. 

문자열 타입

큰 따옴표(")로 감싼 여러 개의 문자를 말한다. 이를 '문자열'이라고 하고, 변수에 저장하고 싶으면 String을 사용해야 한다. 다만, String은 자바 기본 타입에 속하지 않는다.

 

char과 달리 유니코드로 변환되지 않는다.

*String값이 동일한지 비교할 때에는 equals()를 이용한다. 

 

문자열 내부에 역슬래쉬가 붙은 문자를 사용할 수 있다. 이를 '이스케이프 문자'라고 한다. 특정 문자를 포함하거나 출력에 영향을 끼칠 때 사용한다. 

 

*Java13부터는 큰 따옴표 3개(""")를 사용할 수 있다. 

String str = """
	{
    	"id":"winter",
        "name":"눈송이"ㅣ;
    }
""";

실행 결과

 

자동 타입 변환 

값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다. char 타입은 int로 자동 변환되면 유니코드 값이 int값에 대입된다. 

 

byte byteValue = 10;
int intValue = byteValue; //강제 타입 변환됨

 

예외적으로 byte는 char 타입으로 변환될 수 없다. char과 달리 byte는 음수를 포함하기 때문이다. 

강제 타입 변환

큰 허용 범위 타입은 작은 허용 범위로 자동 변환될 수 없다. 하지만, 괄호()를 사용하여 큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어 저장하는 것은 가능하다. 이를 '강제 타입 변환'이라고 한다. 

 

연산식에서 자동 타입 변환

+ 연산자는 피연산자가 모두 숫자일 경우에는 덧셈, 하나라도 문자열일 경우에는 문자열로 자동 변환되어 결합 연산을 수행한다. 

int value = 3 + 7; //10
String str = "3" + 7; //"37"

 

문자열을 기본 타입으로 변환

문자열을 기본 타입으로 바꾸려면 타입에 맞게 쓰면 된다. 

String -> byte Byte.parseByte("문자열")
String -> short Short.parseShort("문자열")
String -> int Integer.parseInt("문자열")
String -> long Long.parseLong("문자열")
String -> float Float.parseFloat("문자열")
String -> double Double.parseDouble("문자열")
String -> boolean Boolean.parseBoolean("문자열")

 

반대로 기본 타입을 문자열로 바꾸는 것은 쉽다. 

String str = String.valueOf(기본타입값);

 

변수 사용 범위

 

main()메소드 블록에는 다른 중괄호가 작성될 수 있다. 일반적으로 중괄호 내부에 선언된 변수는 해당 중괄호 내부에서만 사용이 가능하고 밖에서는 사용할 수 없다. 블록 전체에서 사용하고 싶으면 메소드 블록 첫머리에 선언하는 것이 좋다. 

 

콘솔로 변수값 출력

출력 방법은 다음과 같다. 

println() 괄호 안의 내용을 출력하고 행 변경
print() 괄호 안의 내용을 출력하고 행 변경 없음
printf("형식 문자열", 값1, 값2) 형식 문자열에 맞추어 뒤의 값을 출력하라

 

형식 문자열로는 d(정수), f(실수), s(문자열)이 제공된다. 

 

%[argument_index$][flags][width][.precision]conversion

	값의 순서   -,0  전체자리수  소수자리수 변환 문자

 

보통은 앞에 다 생략하고 변환 문자만 사용한다. 

 

값이 두 개 이상인 경우에는 값의 순번을 포함시켜야 한다.(ex) $d) flags는 빈 공간을 채우는 방법이다. 생략시 왼쪽 공백, -는 오른쪽 공백, 0은 공백 대신 0으로 채운다. 

자주 사용되는 방법

 

키보드 입력 데이터를 변수에 저장

Scanner scanner = new Scanner(System.in);

String inputData = scanner.nextLine();

 

scanner.nextLine()은 엔터가 입력되기 전까지 블로킹(대기) 상태가 되며, 입력된 값을 문자열로 읽는다. 

 

-출저 : <<이것이 자바다>>

'Java > 변수' 카테고리의 다른 글

[Java] 상수와 리터럴  (0) 2024.07.31