메모리(RAM)에 값을 기록하는 공간
→ 공간에 기록되는 값(Date)이 변할 수 있어서 변수라고 함
변수는 여러 종류 존재함 (저장되는 값의 형태, 크기가 각각 다름)
메모리(RAM)에 값을 기록하기 위한 공간
변수에 기록된 값은 지속적으로 사용 가능
가독성이 좋아짐
재사용성 증가
코드량 감소
유지보수 용이함
package edu.kh.variable.ex1;
public class VariableExample1 {
public static void main(String[] args) {
System.out.println(2 * 3.141592653589793 * 5);
System.out.println(3.141592653589793 * 5 * 5);
System.out.println(3.141592653589793 * 5 * 5 * 20);
System.out.println(4 * 3.141592653589793 * 5 * 5);
}
}
/* 출력 결과
31.41592653589793
78.53981633974483
1570.7963267948967
314.1592653589793
*/
중복되는 값(데이터) 자체를 일일히 입력해야 하는 번거로움이 있음
연산 사이사이 공백을 두는 이유는 가독성을 위해서 삽입한 것
→ 가독성 있는 작성
package edu.kh.variable.ex1;
public class VariableExample1 {
public static void main(String[] args) {
double pi = 3.141592653589793; // 실수형은 double 자료형 이용
int r = 5; // 반지름(radius)
int h = 20; // 높이(height)
System.out.println("==============="); // 변수 사용 전, 후 구분선
System.out.println(2 * pi * r); // 원의 둘레
System.out.println(pi * r * r); // 원의 넓이
System.out.println(pi * r * r * h); // 원기둥의 부피
System.out.println(4 * pi * r * r); // 구의 겉넓이
}
}
/* 출력결과 (동일)
31.41592653589793
78.53981633974483
1570.7963267948967
314.1592653589793
*/
반복적으로 사용되는 값을 변수로 선언하여 간편하게 이용할 수 있음
// 변수 선언과 초기화를 각각 진행하는 경우
double pi; // 변수 선언
pi = 3.141592; // 변수에 값 대입
// 선언과 초기화를 동시에 진행한 경우
double pi = 3.141592;
자료형 변수명;
논리형 변수 선언
boolean isTrue;
정수형 변수 선언
byte bNum; // 1byte
short sNum;
int iNum; // 4byte
long lNum; // 'l' 또는 'L'을 표기하여 long형임을 명시
short
형과 long
형의 기준은 int
임
short
: int
보다 짧다
long
: int
보다 길다
실수형 변수 선언
float fNum;
double dNum;
float
(8개) < double
(16개)
float fNum = 3.14f; // 'f' 또는 'F'를 표기해서 float형임을 명시
double dNum = 3.14; // 실수 기본형이 double이기 때문에 따로 명시하지 않음
float
형에 double
형을 대입하는 건 오류 발생하지만, 반대의 경우 double
(큰 것)에 float
(작은 것)을 대입하는건 오류 발생하지 않음
문자형 변수 선언: 문자 하나만 저장 가능
char ch;
문자열 변수 선언
String str;
대소문자가 구분되며 길이 제한이 없다.
Bus ≠ bus (동일한 이름이 아님)
int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // 길이제한 없음
int Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // 대소문자 구문, 위 변수와 다른 변수
예약어를 사용하면 안 된다.
ex) true
, final
, String
등
float double; // Error
숫자로 시작하면 안 된다.
ex) age1은 가능하지만 1age는 불가능
int 1abc = 4; // Error
int abc1 = 4; // 가능
특수문자는 _
와 $
만을 허용한다.
$
는 내부 클래스에서 사용
_
사용 시 컴파일 에러는 없지만 관례상 사용하지 않는 것이 좋음
ex) sh@rp는 불가능하지만 $harp는 가능
int $intNumber;
int int_number;
변수명에 일부 특수문자 사용이 가능하긴 하나 권장하지 않음
_
의 경우 DB에서 사용
여러 단어 이름은 단어의 첫 글자를 대문자로 한다.
단, 첫 시작 글자는 소문자로 하는 것이 관례이다.
카멜 케이스: 변수명 작성시 여러 단어를 이어서 작성하는 경우, 띄어쓰지 않고 후속 단어의 첫 글자를 대문자로 작성
ex) ageOfVampire, userName
char appleBananaCarrot;
변수명은 언어를 가리지 않는다
→ 영어 이외엔 마찬가지로 권장하지 않음
int 정수; // 사용 가능
컴퓨터는 2진수로 인지하기 때문에 2n(n = 비트 크기)로 범위 할당
프로그램 실행 시 사용할 값(Data)이 있다면 그 값은 먼저 메모리에 기록 되어야 함
HDD, SSD → RAM → CPU 순서로 실행
저장 공간이 제한적이기 때문에 저장 크기에 대한 기준과 CPU가 데이터를 처리할 때 일정한 기준 필요
1byte = 8bit
컴퓨터가 나타내는 데이터의 최소 저장 단위로서 2진수 값 하나(0 또는 1)를 저장할 수 있는 메모리 공간을 의미
8bit = 256개 수 표현 가능
데이터 처리 또는 문자의 최소 단위로서 8개의 비트가 모여 하나의 바이트가 구성됨
// 메모리에 논리 값 (T, F)을 저장할 공간 1byte를 할당하고
// 할당된 공간은 booleanData라는 이름으로 부르겠다는 뜻
boolean booleanData
// = : 대입 연산자 => 우항의 값을 좌항에 대입
booleanData = true;
System.out.println("booleanData = " + booleanData); // booleanData = true
boolean
(1 byte)
논리형은 True / False 값만을 가짐
따라서 1byte로 표현 가능
→ True = 1 / False = 0 이기 때문
// 1. 메모리에 정수값을 저장할 공간 1 byte를 할당하고 할당된 공간을 byteNumber라고 부름
// 2. 선언된 byteNumber 변수에 처음으로 127을 넣음
// --> 초기화 : 처음 변수에 값을 대입
byte byteNumber = 127;
short shortNumber = 32767; // 변수 선언 및 초기화
int intNumber = 2147483647; // 변수 선언 및 초기화
long longNumber = 1234567891238956L; // 변수 선언 및 초기화
byte
(1 byte)
short
(2 byte)
int
(4 byte): 정수 기본형
long
(8 byte): long
을 사용할 땐 뒤에 l
또는 L
을 표기해줘야 함
→ 참고로 short
, byte
는 옛날 코드의 잔재라고 생각하면 됨
float floatNumber = 1.2345F;
double doubleNumber = 3.141592;
float
(4 byte): float
의 경우 숫자 끝에 f
또는 F
를 명시해줘야 함
double
(8byte): 실수 기본형
char ch = 'A'; // 65
char ch2 = 66; // B
System.out.println("ch: " + ch); // ch: A
System.out.println("ch2: " + ch2); // ch2: B
char
(2 byte)
영어권 언어의 경우 1byte로 표현할 수 있는데, 영어권 외의 언어는 2byte가 필요함
→ 유니코드 개념과 연결
char
자료형에 숫자가 대입될 수 있는 이유
컴퓨터에는 문자표가 존재하고 있는데, 숫자에 따라 지정된 문자가 매핑되어있음
'B' 문자 그대로가 대입되면 변수에 숫자 66으로 변환되어 저장됨
반대로 생각해보면, 변수에 애초에 66이란 숫자를 저장하는 것이 가능함
String str = "기차";
String str = new String("기차");
String str = "기차" + "칙칙폭폭";
String str = new String("기차" + "칙칙폭폭");
// "문자열" + 다른 자료형 → 문자열
String str = "기차" + 123 + 45 + "출발";
// 다른 자료형 + "문자열" → 문자열
String str = 123 + 45 + "기차" + "출발";
//자료형 변수명 = 리터럴;
short s = 32767;
int i = 100;
long l = 10000L;
float f = 0.123f;
double d = 3.14;
char c = ‘A’;
String str = “ABC”;
변수에 대입되거나 작성되는 값 자체를 리터럴이라고도 함
자료형에 따라 리터럴 표기법이 다름
문자형 리터럴 표기법: ' '
(홑따옴표) -> 문자 하나만 나타낼 때 사용
char
는 홑따옴표로 표기, String
은 쌍따옴표로 표기하는 것 구분해줘야 함
→ c.f. JavaScript는 구분하지 않고 문자열로 인식
수학에서는 변하지 않는 값 의미
컴퓨터(Java)에서는 한 번만 저장(기록)할 수 있는 메모리 의미
변수의 한 종류임
상수 (= 항상 같은 수)
한번 값이 대입되면 다른 값 불가능함
변하면 안되는, 고정된 값을 저장할 때
특정한 값에 의미를 부여할 때
final int AGE;
final
키워드 이용
상수의 경우 컨벤션으로, 대문자만으로 이름을 지음
띄어쓰기가 필요한 경우 _
사용하여 연결
선언과 동시에 초기화
final int NUM = 100;
선언 후 초기화
final int NUM;
NUM = 100;
변수에 값을 다시 대입하는 경우
int number = 10;
System.out.println("number: " + number);
number = 20;
System.out.println("number: " + number);
/*
number: 10
number: 20
*/
상수에 값을 다시 대입하는 경우
final double PI_VALUE = 3.14;
PI_VALUE = 2.3; // Error
String의 쌍따옴표 안에 몇글자가 올 지 크기를 특정할 수 없음
참조형은 클래스 배우면서 추가로 더 학습할 예정
형변환(casting) : 값의 자료형을 변환하는 것 (boolean 제외)
같은 종류 자료형만 대입 가능
같은 종류 자료형만 계산 가능
계산의 결과도 같은 종류의 값이 나와야 함
→ 이러한 원칙이 지켜지지 않은 경우에 형변환이 필요함
123456789(int) → 123456789.0(double)
'A'(char) → 65(int)
3.14f(float) → 3(int)
형변환 하고자 하는 값과 자료형의 표현 범위 차이에 따라 형변환 방법이 나뉨
→ 자동 형변환, 강제 형변환
값의 범위가 큰 자료형과 값의 범위가 작은 자료형의 연산 시
컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환
정수형과 실수형
int num1 = 10;
double num2 = 3.5;
// 원칙적으로는 에러가 발생해야 하지만, 자동형변환 덕분에 에러 X
System.out.println(num1 + num2); // 13.5
int i1 = 3;
double d1 = i1; // double은 실수만 저장될 수 있는 자료형
// 정수가 대입되는 연산이 수행되면
System.out.println("i1: " + i1); // i1: 3
System.out.println("d1: " + d1); // d1: 3.0
System.out.println(d1 + num2); // 6.5 (double + double)
char 문자형 자료형
char 자료형은 문자형이지만 실제 저장하는 값은 0 부터 6만 5천번 사이에 있는 숫자임
// 알파벳
char ch = 'V';
int i3 = ch; // int 변수 = char 값 => int로 자동형변환
System.out.print("i3 :" + i3); // i3 :86
// 한글
char ch1 = '각';
int i4 = ch1;
System.out.print("i4 :" + i4); // i4 :44033
값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환
강제 형변환 시 데이터 손실이 발생할 수 있음
→ 데이터의 변형, 손실을 감수하고 강제 변환
int → double
char → int
(double)1 / 2 = 0.5
연산 결과를 큰 값의 범위로 표현하고자 할때
값의 범위가 큰 자료형을 작은 자료형으로 변환할 때 사용
출력되는 데이터의 표기법을 변화시키고 싶을 때 사용
자료형을 변환시키고 싶은 값 또는 변수 앞에 (자료형)을 작성
double temp = 3.14;
int num = (int)temp; // double 자료형을 int 자료형으로 강제 형변환
System.out.println("temp :" + temp); // temp :3.14
System.out.println("num :" + num); // num :3
127+1을 하면 범위를 초과한 128이 되고 허용된 범위 이상의 비트를 침범하게 되는데 이를 오버플로우라고 함
반대의 경우를 언더플로우라고 함