변수는 값을 저장할 수 있는 메모리 공간입니다. 변수는 메모리의 특정 번지를 참조하고 있습니다. 하지만 우리가 메모리의 주소값을 외워서 Data를 입/출력 하기가 매우 힘들기 때문에 우리는 쉽게 기억할 수 있는 변수를 만들어서 사용합니다.
변수를 사용하려면 먼저 변수를 선언해야합니다. 변수를 선언할 때는 저장하고자 하는 Data값의 데이터 타입과 변수명을 함께 작성해야합니다.
예를 들어 나이를 변수로 선언하고자 하면 다음과 같습니다.
public class Exam {
public static void main(String[] args) {
int age; // age라는 이름의 변수를 선언
}
}
age는 무슨 뜻인지 알겠지만 int가 뭔지 궁금하신 분들도 있을 것입니다.
int는 아직 설명하지 않은 데이터 타입입니다. 이는 '변수 타입'이라고도 하는데 변수에 어떤 type의 data값을 저장할지를 지정하는 것입니다.
변수를 선언하면 메모리의 빈 공간에 변수 타입에 알맞은 크기의 저장공간이 확보되고, 이 저장공간에 변수 이름을 통해서 우리는 데이터를 관리할 수 있게 됩니다.
변수를 선언하고 나서는 반드시 변수를 초기화(initialization)해야합니다. 메모리는 여러 프로그램이 공유해서 사용하는 자원이기 때문에 다른 프로그램에 의해 내가 저장하지 않은 알 수 없는 값. 일명 쓰레기값(garbage value)가 저장될 수 있기 때문입니다.
변수에 값을 저장할 때는 대입 연산자 =를 사용하는데 반드시 변수명의 오른쪽에 위치해야 합니다.
int age = 24; // 변수 age를 선언하고 24로 초기화.
String name = "홍길동" // 변수 name을 선언하고 "홍길동"으로 초기화.
위의 예시처럼 변수는 [변수타입] [변수명] = Data값의 형태로 값을 초기화 할 수 있습니다. 변수의 값은 언제든지 변경할 수 있습니다. 이미 선언된 변수의 Data값을 변경할 때는 변수타입을 생략하고 작성하면 됩니다.
int age = 24;
String name = "홍길동"
age = 90; // 위에서 선언한 age변수의 값을 90으로 변경
name = "이순신"; // 위에서 선언한 name변수의 값을 "이순신"으로 변경
위의 예시처럼 처음 변수를 선언할 때는 '변수 타입'이 필요하지만 선언된 변수를 사용할 때는 변수 타입을 생략합니다.
이제 변수를 선언하고 초기화한 후 변수에 저장된 Data값을 변경하는 방법을 알았습니다. 하지만 아직 선언한 변수에 저장한 값이 제대로 저장됐는지 확인하지 못했습니다. 변수에 저장된 값을 확인하기 위해서는 print를 사용하여 출력하는 기능을 사용해야 합니다.
class Exam {
public static void main(String[] args) {
int year = 2023;
String name = "홍길동";
int age = 24;
System.out.print(변수명);
System.out.println("Hello World!");
System.out.print(year);
System.out.println(name);
System.out.print(age);
}
}
보이듯이 System.out.print()를 사용해서 변수의 값을 출력할 수 있습니다. 그러나 위의 값을 출력해보면
변수명Hello World!
2023홍길동
24
이렇게 출력되는 것을 볼 수있습니다. 이렇게 출력되는 이유는 System.out.print()는 출력 후줄바꿈을 실행하지 않고, System.out.println()은 줄바꿈 기능을 제공하기 때문입니다.
print()에 바로 Data값을 넣어서 출력할 수도 있고 변수명을 넣어서 변수에 저장된 값을 출력하는 것도 가능합니다.
또한 변수 값을 종합하여 한번에 출력할 수도 있습니다.
class Exam {
public static void main(String[] args) {
int year = 2023;
String name = "홍길동";
int age = 24;
System.out.println(year + "년에 " + name + "님의 나이는 " + age + "세 입니다.");
}
}
위의 방식처럼 +를 사용하여 변수와 문자열을 조합하여 조합된 값을 출력할 수 있습니다. 출력결과는 다음과 같습니다.
2023년에 홍길동님의 나이는 24세 입니다.
'변수의 이름'처럼 프로그래밍에서 사용되는 모든 이름은 '식별자(identifier)'라고하며, 식별자는 서로 구분될 수 있어야 합니다.
그리고 변수명을 지정할 때 지켜야할 규칙도 존재합니다.
_와 $만을 허용한다._로 구분한다.(Ex. PI, MAX_NUMBER)💡 상수(Constant)
- 프로그램이 실행되면서 고정된 값이 필요한 경우
- 코드 가독성을 높이고 싶은 경우
- 코드 유지관리를 손쉽게 하고자 하는 경우
final int MAX_SPEED = 100;
final double PI = 3.141592....
자바에서 자료형(데이터 타입, Data Type)은 값의 종류에 따라 값이 저장될 공간의 크기와 형식을 정의한 것입니다. 자료형은 크게 기본형과 참조형이 있습니다.
| 분류 | 종류 |
|---|---|
| 논리형 | boolean |
| 문자형 | char |
| 정수형 | byte, short, int, long |
| 실수형 | float, double |
| 자료형(타입) | 메모리 사용 크기(Bit) | 메모리 사용 크기(Byte) | 저장 가능한 값의 범위 |
|---|---|---|---|
| byte | 8bit | 1byte | -128 ~ 127 |
| short | 16bit | 2byte | -32,768 ~ 32,767 |
int(default) | 32bit | 4byte | -2,147,483,648 ~ 2,147,483,647 |
| long | 64bit | 8byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
정수형의 경우 저장할 수 있는 값의 범위가-2^(n-1) ~ 2^(n-1)-1입니다.
n에 bit값을 대입하면 됩니다.
long타입은 선언할 때 변수값(리터럴, literal)뒤에 L을 붙여야합니다.
long num1 = 3000000000; (X)
long num2 = 3000000000L; (O)
| 자료형(타입) | 메모리 사용 크기(Bit) | 메모리 사용 크기(Byte) | 저장 가능한 값의 범위 | 정밀도(소수점 이하 자리) |
|---|---|---|---|---|
| float | 32bit | 4byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) | 7자리 |
double(default) | 64bit | 8byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) | 15자리 |
실수형 float와 double의 메모리 사용 크기는 각각 정수형 int, long과 같지만, 부동 소수점 방식으로 저장되어 더 큰 범위의 값을 저장할 수 있습니다.
현재 대부분의 시스템에서는 IEEE 754 표준의 부동 소수점 방식으로 실수를 표현하고 있습니다.
자바의 실수혀으이 기본처리는 double타입으로 해석해서 실수형 float로 리터럴을 저장하고 싶다면 리터럴 뒤에 f를 붙여주면 됩니다.
float pi = 3.14; (X)
float pi = 3.14f; (O)
float pi = 3.14F; (O)
| 자료형(타입) | 메모리 사용 크기(Bit) | 메모리 사용 크기(Byte) | 저장 가능한 값의 범위 |
|---|---|---|---|
| boolean | 8bit | 1byte | false, true |
boolean형 변수에는 true와 false중 하나를 저장할 수 있으며 기본값(default)은 false다.
boolean turnOn = true; (O)
boolean turnOn = false; (O)
boolean turnOn = "true"; (X) // ""로 감싸면 문자열 String으로 인식
boolean turnOn = "false"; (X) // ""로 감싸면 문자열 String으로 인식
boolean turnOn = False; (X) // 대소문자 구분됨.
| 자료형(타입) | 메모리 사용 크기(Bit) | 메모리 사용 크기(Byte) | 저장 가능한 값의 범위 |
|---|---|---|---|
| char | 16bit | 2byte | '\u0000' ~ '\uffff' (0 ~ 65,535) |
문자형은 문자를 저장하기 위한 변수를 선언할 때 사용됩니다. 문자 리터럴은 유니코드로 변환되어 저장됩니다. 이 내용은 추후 '형 변환'에 관하여 작성할 때 자세히 다루겠습니다.
char ch = 'A'; // ch = 'A'
int num = (int) ch; // num = 65
문자열 String은 사실 기본형은 아니지만 특이점이 있어 여기서 간단하게만 다루겠습니다.
public class Exam {
public static void main(String[] args) {
String a = "hello";
String b = new String("Hi");
System.out.println(a);
System.out.println(b);
}
}
기본형처럼 바로 객체의 주소에서 불러오지 않는 형식으로도 저장할 수 있어보이고 new String으로 아래의 참조형 처럼 선언도 가능합니다.
Date today = new Date();
참조형은 간단하게만 아랑보고 추후 더 자세히 알아보도록 하겠습니다.
앞서 소개한 여러가지 타입들 중 boolean형을 제외한 나머지 타입은 서로 타입변환을 할 수 있습니다. 참조형의 형 변환은 추후 내용을 다시 다룰 때가 되면 다루도록 하겠습니다.
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
작은 타입에서 큰 타입(낮은 정밀도 -> 큰 정밀도)으로 저장될 때는 자동으로 형 변환이 이루어 집니다.
큰 타입에서 작은 타입으로 형 변환을 하기 위해서는 수동으로 타입 변환을 해줘야합니다.
(변환할 타입)피연산자
의 형태로 형 변환을 할 수 있습니다. 이를 캐스팅(casting)이라고 합니다.
double dNum = 12.345;
int num = (int)dNum; // 정수 부분인 12만 저장
int num = 5 + 15; // 20
String str1 = "5" + 15; // "515"
String str2 = 1 + 2 + "3"; // "33"
// 문자열 -> 기본 타입
String str = "11";
byte num1 = Byte.parseByte(str);
short num2 = Short.parseShort(str);
int num3 = Integer.parseInt(str);
// 기본 타입 -> 문자열
String strCasting = String.valueOf(기본타입값);