자바에서 변수 선언하기
컴퓨터의 메모리(RAM)는 수많은 주소로 이루어진 데이터 저장 공간입니다. 프로그램은 속도가 빠른 메모리를 통해 데이터 작업이 이루어집니다. 이때 데이터를 어디에 어떤 방식으로 저장할지 정의해 주지 않았다면 데이터관리에 있어서 어려움을 겪게 될 것입니다. 프로그래밍 언어에서는 이러한 문제들을 해결하기 위해서 변수 선언이라는 방식을 사용하고 있습니다.
변수(Variable)는 하나의 값을 저장할 수 있는 메모리 주소에 붙여진 이름입니다. 따라서, 변수는 다음과 같이 정의할 수 있습니다.
변수 = 값을 저장할 수 있는 메모리 주소에 붙여진 이름
자바에서 변수는 선언 과정에서 자료형을 통해 어떠한 데이터를 저장할 것인지, 변수 이름이 무엇인지를 설정합니다. 선언 방법은 다음과 같습니다.
int number; //int를 통해서 정수형의 변수를 선언할 것임을 정함. 이후 number라는 변수의 이름 설정
boolean brain; //boolean을 통해서 논리값을 저장할 변수를 선언. brain이라는 변수의 이름 설정
변수를 선언할 때 변수 이름은 영어로 작성하며, 한글로 작성하지 않습니다. 첫 번째 글자는 문자로 작성합니다. 첫 글자 이후부터는 숫자나 $,_(언더바)를 사용가능합니다. 소문자로 작성하며, 반드시 변수 이름 내에서는 공백을 포함해서는 안됩니다. 변수 이름을 작성할 때 camel style로 작성하는 것이 관례입니다.
camel style 이란?
코드를 작성할 때 여러 단어가 섞여있는 단어를 작성할 경우 대소문자를 구분해서 작성하는 스타일. Java에서는 클래스 이름과 단어가 혼합된 변수 명을 작성할 때 활용합니다. 예시는 다음과 같습니다.
1. 자바 클래스 이름 작명 시 : 첫 글자를 대문자로 작성.
Exam.java
Text.java
Weather.java
2. 변수명 작성 시 : 모두 소문자로 작성하지만, 단어가 혼합된 경우 혼합된 단어의 첫 글자만 대문자로 작성
int scoreSum;
String nameBook;
위와 같이 변수를 선언하고 나면, 동시에 대입 연산자를 활용해 값을 대입해서 저장이 가능합니다. 등호(=) 표시를 활용해서 대입을 해줍니다. 일반적인 프로그래밍 언어에서는 좌측에 있는 변수 안에 우측에 있는 값을 대입을 해줍니다. 예시는 다음과 같습니다.
int number = 1;
String str = "Hello World";
위와 같이 값을 변수에 처음으로 대입하는 과정을 변수 초기화라고 하고, 대입한 값을 초기값이라고 칭합니다.
자바 자료형
자바 내에서는 변수 선언 과정에서 자료형을 어떻게 설정하냐에 따라 어떠한 변수를 저장할 수 있는지가 달라집니다. 기본적으로 8개의 자료형이 생성 가능합니다.
Type | 작성 방법 |
정수형 | byte, char, short, int, long |
실수형 | float, double |
논리형 | boolean |
정수형 변수
먼저 정수형 변수에 대해서 알아보겠습니다. 정수형 변수의 종류는 총 5개로, 메모리 할당 크기에 따라 저장가능한 범위가 달라집니다.
Type | 메모리 크기 | 저장 가능한 수의 범위 | ||
byte | 1byte | 8bit | -128 ~ 127 | |
short | 2byte | 16bit | -32,768 ~ 32,767 | |
char | 2byte | 16bit | 0 ~ 65535(유니코드) 문자하나만 저장 가능 | |
int | 4byte | 32bit | -2,147,483,648 ~ 2,147,483,647 | |
long | 8byte | 64bit | –9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
종류 | byte | short | int | long |
메모리 사용 크기 | 1byte | 2byte | 4byte | 8byte |
정수형 변수를 활용할 때는, int형을 가장 많이 사용합니다. 범위도 어느 정도 넓을뿐더러, CPU 연산 시에 4byte 체계로 진행되기 때문에 int형을 사용할 경우 변환 작업이 일어나지 않아 속도가 빠르다는 장점이 존재합니다.
주의할 점
long 자료형을 사용할 때, 대입하는 값 뒤에 L를 작성하여야 한다.
long longNum = 215498235813123L;
실수형 변수
실수형 변수의 자료형에는 float와 double이 있습니다. 이도 정수형 변수와 마찬가지로 메모리 할당 크기와 저장 가능한 범위가 달라집니다.
Type | 메모리 크기 | 유효한 소수점 이하 자리 | |
float | 4byte | 32bit | 7자리 |
double | 8bye | 64bit | 15자리 |
실수형 변수를 활용할 때, 이때는 double형을 가장 많이 사용합니다. 메모리 크기가 8byte라서 CPU연산 시 변환작업이 일어나서 속도가 느릴 텐데 왜일까요? 바로 정확도를 위해서입니다. 소수점 15자리 까지 표현이 가능한 double을 통해서, 연산 정확도를 올리기 위함입니다. 자료형의 이름이 double인 이유도 float의 범위보다 2배가량의 범위를 가지고 있기 때문입니다.
문자형 변수
문자형 변수에는 char 자료형을 사용합니다. 하나의 문자를 작은따옴표 ' single quotation으로 감싼 값을 문자 리터럴이라고 합니다. char로 문자 리터럴을 값을 변수로 선언할 때는 이 값을 유니코드로 변환해서 저장합니다.
char cr = 'a'; //'a'에 해당하는 유니코드 숫자 : 65로 대입함
char cr1 = '가'; //'가'에 해당하는 유니코드 숫자 : 4403로 대입함.
char cr2 = 65; //65에 해당하는 문자인 'a'를 의미
유니코드가 정수로 저장이 되므로, char 타입도 정수형 변수에 속합니다. 그렇기에 작은따옴표로 감싼 문자 리터럴 값이 아니라 유니코드 숫자로 대입이 가능합니다.
논리형 변수
논리형 변수는 참과 거짓을 의미하는 값인 "true"와 "false"를 저장합니다. 자료형은 boolean 타입을 사용합니다. 논리형 변수는 true와 false 값에 따라 조건문과 제어문의 실행 흐름을 변경하는 데 사용합니다. true와 false 값 자체를 저장할 수도 있지만, 다음과 연산식으로도 저장이 가능합니다.
int a = 1;
boolean result = (a == 2); //변수 a의 값이 2와 같은가? 거짓이므로 false 값을 저장
boolean result1 = (a != 2); //변수 a의 값이 2와 다른가? 참이므로 true 값을 저장
boolean result2 = (a > 2); //변수 a의 값이 2보다 큰가? 거짓이므로 false 값을 저장
boolean result3 = (a < 2 && a > 0); //변수 a의 값이 2보다 작고 0보다 큰가? 참이므로 true 값을 저장
문자열 타입
문자 리터럴 값을 저장할 때는 char 타입을 활용하지만 문자열은 String 타입을 통해서 저장합니다. 문자 리터럴 값은 ' single quotation으로 감싸주지만, String 타입은 큰따옴표 " double quotation으로 감싸주어 저장합니다. 아래의 예시를 들어보겠습니다.
char var = 'a'; //올바른 변수 초기화 방법
char var = "a"; //올바르지 않은 변수 초기화 방법
String var1 = '가'; //올바르지 않은 변수 초기화 방법
String var1 = "가"; //올바른 변수 초기화 방법
문자열이라고 해서 반드시 두 글자 이상만 대입할 수 있는 것은 아니고, 한 글자도 대입이 가능합니다.
문자열을 대입하는 과정에서 " 안에 작성된 문자들 사이에 역슬래쉬(\)를 사용해서 이스케이프 문자를 작성할 수 있습니다. 이스케이프 문자를 활용해서 특정한 문자들을 추가하거나 출력에 변화를 줄 수 있습니다.
이스케이프 문자 | |
\" | " 문자를 작성합니다. |
\' | ' 문자를 작성합니다. |
\\ | \ 문자를 작성합니다. |
\u16진수 | 16진수 유니코드에 해당하는 문자를 포함합니다. |
\t | 출력 시 tab만큼 띄웁니다. |
\n | 출력 시 줄바꿈을 적용합니다. |
\r | 출력 시 캐리지 리턴을 적용 합니다.(다음 줄의 처음으로 보내는 기능) |
형변환
자바에서는 정해져 있는 유형이 서로 다른 값을 대입할 때 타입의 변환이 일어나는 작업입니다. 두 가지의 변환 방법이 있는데 먼저 자동 형 변환에 대해서 알아보도록 하겠습니다.
자동 형 변환
자동 형 변환은 말 그대로 대입 과정에서 자동으로 형 변환이 일어나는 과정을 말합니다. 자동 형 변환은 값의 자료형의 크기가 작은 것에서 큰 것으로 이루어질 때 발생합니다.
기본 타입들의 크기들을 비교하자면 다음과 같습니다.
byte < short, char < int < long < float < double
다음의 코드를 통해 자동 형 변환의 예시를 들어보겠습니다.
int num = 10;
double dNum = num; //int형에서 double형으로 자동 형 변환이 이루어진다.
int 자료형은 크기가 4byte, double은 크기가 8byte 이므로 자동 형 변환이 이루어집니다.
크기가 같은 long과 double사이에서는 범위가 더 넓은 double로 자동 형 변환이 가능합니다.
연산식에서도 자동 형 변환이 이루어질 수 있습니다. 다음과 같은 코드로 예시를 들어보겠습니다.
short sum = 1 + 2; // short sum = 3;
위 같은 경우 컴파일 단계에서 미리 1 + 2의 연산을 진행해서 미리 3의 값을 sum에 저장합니다.
하지만 다음과 같이 변수안에 수가 저장되어 피연산자로 사용될 경우 실행 시에 연산을 진행하고 값을 저장합니다. 이 경우 정수 타입 변수를 연산식에서 피연산자로 사용되게 되면 int타입 보다 작은 byte나 short등의 타입의 변수는 int타입으로 자동 형 변환이 이루어집니다.
따라서 연산식을 수행한 결과는 int타입 변수에 저장 하도록 합니다.
byte x = 10;
byte y = 20;
byte result = x + y; //컴파일 에러 발생. 강제 형변환을 해주거나 자료형을 변경해 주어야 오류 발생 X
int result = x + y;
또한, 연산식 내에서 피연산자들의 자료형이 서로 다를 경우, 결괏값은 크기가 더 큰 자료형으로 변환되어 저장됩니다. 예시는 아래와 같습니다.
float n1 = 3.1;
double n2 = 3.2;
float result = n1 + n2; //오류 발생
double result2 = n1 + n2; //올바른 방법
강제 형 변환
자료형의 크기가 큰 것에서 작은 것으로 이루어질 때는 자동 형 변환이 이루어질 수 없습니다. 이런 경우에는 코드 작성 시에 직접 캐스팅 연산자인 괄호()를 입력해 주어서 강제 형 변환을 진행합니다. 사용 방법은 다음과 같습니다.
int value = 10;
byte byteValue = (byte) value;
문자열을 기본 데이터 타입으로 변환
강제 형 변환 중 과정 중 에서에서 문자열을 숫자로 변환하는 방법에 대해서 알아보겠습니다.
변환 타입 | 사용 예 |
String -> byte | byte value = Byte.parseByte("문자열 값 또는 변수"); |
String -> short | short value = Short.parseShort("문자열 값 또는 변수"); |
String -> int | int value = Int.parseInt("문자열 값 또는 변수"); |
String -> long | long value = Long.parseLong("문자열 값 또는 변수"); |
String -> float | float value = Float.parseFloat("문자열 값 또는 변수"); |
String -> double | double value = Double.parseDouble("문자열 값 또는 변수"); |
String -> boolean | boolean value = Boolean.parseBoolean("문자열 값 또는 변수"); |
변수 사용 범위
자바에서 중괄호{}내에서 선언한 변수는 중괄호 안에서만 사용이 가능합니다. 메서드 내부에서 바로 선언한 변수들을 지역변수(local variable)라고 합니다. 아래의 코드블록을 보고 이해해 보겠습니다.
public static void main(String[] args){
int var = 1; //메소드 블럭에서 선언. 메소드 블럭 전체에서 사용 가능
if (/*조건문*/) {
int var2 = 2; //if 블럭내에서 선언. if 블럭내에서만 사용 가능
}
for (/*...*/) {
int var3 = 3; //for 블럭내에서 선언. for 블럭내에서만 사용 가능
}
}
특정 블록 내에서만 사용되는 변수라면 메서드 블록이 아닌 특정 블록에서만 선언해 주는 것이 좋습니다.
외부 입력 데이터를 변수에 저장
외부 입력 장치를 통해 입력된 값을 받는 방법은 여러 가지가 있지만, 가장 보편적인 방법인 Scanner 객체를 불러와 사용자의 입력을 받는 방법입니다. 방법은 다음과 같습니다.
package org.var;
import java.util.Scanner; //Java API에 저장된 Scanner 클래스를 불러옴.
public class Scanning {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //Scanner 객체 생성을 통해 사용자의 입력값을 받을 수 있음.
String str = scanner.nextLine(); //입력된 값을 str이라는 변수에 저장함.
System.out.println(str); // 사용자가 입력한 값 출력
}
}
'Backend > Java' 카테고리의 다른 글
자바의 클래스(Class) (0) | 2024.02.12 |
---|---|
자바의 메서드(Method) (2) | 2024.02.11 |
자바의 조건문과 반복문 (0) | 2024.02.11 |
자바 연산자에 대해 (2) | 2024.02.07 |
자바 언어의 기초 개념 (2) | 2024.02.05 |
댓글