- 변수는 사전적 의미로는 변하는 값
- 변수는 값을 저장해놓는 공간(메모리 공간)
- int result = 1 + 2; System.out.println(result); result는 계산하는 프로그램의 결과 값을 담는 변수
- 변수는 선언과 초기화(값을 대입)로 나눠진다.
- 자료형 변수명; ex) int result; long currentTime; char text;
- 변수명 정하는 규칙
- 변수명은 영문자(대문자, 소문자), 숫자, 특수기호($, _)만 사용 가능
- 변수명은 숫자로 시작할 수 없다.
- 자바에서 사용중인 예약어(함수,명령어)는 사용할 수 없다. (if, while, else, int, long, string ...) ex) int 1(x), long if(x), String 1aser(x), int_num, $num, num1(o)
- 변수명을 선언할 때는 변수가 어디에 사용되는 지 명확하게 알 수 있는 변수명을 짓도록 한다.
(유지보수 관점에서 다른 개발자가 코드를 봤을 때도 변수를 어디에 사용하는지 명확하게 알 수 있도록)
- CamelCase, SnakeCase 등 여러가지 종류의 표기법이 존재하지만 대부분 CamelCase 표기법을 많이 사용한다.
- CamelCase 표기법은 변수명의 첫단어는 모두 소문자로 두번째 단어의 첫글자만 대문자로 선언하는 표기법 ex)덧셈 결과 변수명은 int addResult;
- 자료형은 메모리에 값을 직접 저장하는 형태
- 자바의 메모리 구조는 heap, stack, static 분류
- 자료형 stack 메모리에 저장됨
- 자료형의 종류 : 정수형, 문자형, 실수형, 논리형
- 정수형 : byte, short, int, long
- 문자형 : char
- 실수형 : floatm double
- 논리형 : boolean
- 정수형 원시타입(자료형)은 음수, 0, 양수를 표현하는 데 사용되는 자료형
- byte는 1byte의 메모리 공간을 차지
- byte의 표현 범위 : -128 ~ 127
- short은 2byte의 메모리 공간을 차지
- short의 표현 범위 : -32768 ~ 32767
- int는 4byte의 메모리 공간을 차지
- int의 표현 범위는 -21억 ~ 21억
- long은 8byte의 메모리 공간을 차지
- long의 표현 범위 : -100경 ~ 100경
- long 변수형의 초기화시 뒤에 L(l)을 붙여야함 ex) long lNum = 1000000000L(l);
- 자바에서 정수형 연산이 일어날 경우 int를 기본형태로 사용함으로 long을 제외한 정수형 연산은 int형으로 변환 ex) short num1 = 1; short num2 =2; System.out.println(num1 + num2); => int형으로 치환된 결과값
- 문자형 원시타입(자료형)은 ASCII 코드라는 코드집합에 정의되어 있는 값을 통해 문자로 치환하여 표출 (각 언어에 맞춰 용량이 2바이트를 넘어가는 아스키코드를 유니코드라고 함) ex) char txt = 'A'; //실제로는 A에 해당하는 10진수 값 65가 저장됨
- 문자형 변수를 int형으로 변환하면 Ascii 코드 값을 확인할 수 있다. ex) char txt = 'A'; System.out.println(txt); -> A를 출력 System.out.println((int)txt); -> A에 해당하는 Ascii 코드 값 출력
- char는 2byte의 메모리 공간 차지
- char의 표현 범위 : 0x00 ~ 0x7F까지의 문자형 데이터 표출('\u0000' ~ '\uFFFF'까지의 문자형(유니코드))
- 실수형 원시타입(자료형)은 실수 값이 데이터를 표출하기 위해 사용(소수점을 포함하는 실수 값)
- float는 4byte의 메모리 공간을 차지
- float의 표현 범위 : 1.4E-45 ~ 3.4028235E8
- double은 8byte의 메모리 공간 차지
- double의 표현 범위 : 4.9E-324 ~ 1.7976...E308
- float으로 선언된 변수에 값을 대입(초기화)할 때 값뒤에 f(F)를 붙여준다. ex) float fNum = 3.14F(f);
- 실제 개발 환경에서는 float보다는 double을 많이 사용. float보다 큰 단위의 값이 들어왔을 때 에러가 발생하는 것을 방지하기 위해 double을 주로 사용.
- 논리형 원시타입(자료형)은 true, false 두 가지 값만 존재.
- true = 1, false = 0; 자바에서 메모리의 기본단위가 1byte이기 때문에 논리형 boolean도 1byte를 사용한다.
- 프로그래밍에서는 변수를 선언한 후 변수에 값을 대입하는 작업을 초기화라고 표현
- 변수의 선언과 초기화를 분리 ex) int result; //변수를 먼저 선언 result = 100; // 변수의 선언과 분리하여 초기화
- 변수의 선언과 동시에 초기화 ex) int result = 100; //변수의 선언과 동시에 초기화
- 자바는 프로그램이 구동될 때 가상메모리를 할당 받아서 사용
- JVM이 프로그램을 실행하면서 운영체제(windows, macOS, Linux...)에 필요한 가상메모리를 요청. 운영체제는 요청받은 가상메모리를 물리적 메모리(RAM)에서 할당해서 넘겨줌.
- 가상메모리는 Heap, Stack, Static 영역으로 구분.
- Heap 영역에는 참조타입의 값이 저장됨
- Stack 영역에는 원시타입의 값이 저장됨
- Stactic 영역에는 Static으로 선언된 정적 변수나 정적 메소드와 전역변수가 저장
- Static의 영역의 변수 값이나 메소드는 프로그램 시작부터 끝까지 계속 존재. Garbage Collector의 영향을 받지 않음.
- JVM의 가상메모리 공간은 한 칸에 1Byte씩 차지
- int 변수 선언 시 메모리 공간을 4칸을 차지
- 차지한 메모리 공간에 변수를 저장
- 4칸에 대한 별칭을 변수명으로 지정
- int a = 100; 변수를 선언과 초기화 했을 때
- JVM은 가상메모리(stack영역)에서 자료형의 크기만큼의 메모리 공간을 확보(4칸)
- 확보된 공간에 초기화된 값(100)을 저장
- 확보된 공간의 이름(별칭)을 선언된 변수명으로 지정
- System.out.println(a); 등 a를 사용하면 메모리 공간에서 a라는 이름을 찾아서 그 공간에 있는 값을 사용
- 원시타입 변수는 메모리의 스택영역에 저장된 변수명을 통해 스택영역의 값을 참조해서 사용한다.
- var라는 키워드를 사용하면 자료형 지정을 하지않고 변수선언이 가능하다.
- 변수 자료형 추론이라는 기능을 통해서 초기화(값 대입)되는 값의 자료형을 추론함.
- var 변수는 선언과 동시에 초기화가 되어야함. ex) var str = "hello"; -> JVM에서 "로 묶인 것을 인식하여 var타입을 String 타입으로 컴파일하게 됨. var num = 10; -> JVM에서 숫자로 인식하여 int로 컴파일하게 됨
- 자료형이 추론된 상태에서 다른 자료형의 값을 대입할 수 없다. ex) var str = "java"; -> string으로 추론된 상태 str = 10; -> string으로 이미 추론된 변수이기에 int값이 대입되면 컴파일오류가 발생함.
- 상수는 변하지 않는 값. 한 번 초기화 된 상태의 상수는 값을 변경할 수 없다.
- 상수는 정해진 값들으 지정할 때 사용 ex) 1년이 12개월인 것은 변하지 않는 법칙이기 때문에 이런 경우 상수 사용 final int COUNT_MONTHS = 12; 1주일이 7일 => final int COUNT_DAYS_WEEK = 7; 원주율 3.14 => final double PI = 3.14;
- 상수의 선언에는 final키워드를 사용. 상수의 변수명은 대문자로 지정해야함.
- 변수명이 모두 대문자임으로 Camel case 대신 _를 단어의 연결부에 사용한다.
- 코드내에서 반복적으로 사용될 값을 상수로 지정해놓으면 편리하게 사용할 수 있다.