변수와 상수는 무엇이며, 어떻게 작성할까?
변수
--
변수는
단일 값을 저장하고 관리하기 위한 이름을 붙인 메모리 공간이다.
변수 기본 형식
[접근 제한자] <타입> <변수명>;
// 변수만 생성 (공간만 생성)
[접근 제한자] <타입> <변수명> = <값>;
// 변수 생성과 동시에 값 할당
public double a = 3.14;
// double타입인 변수 a를 생성과 동시에 3.14값을 할당 (접근 제한자는 public으로 지정)
int b = 5;
// int타입인 변수 b를 생성과 동시에 5값을 할당 (접근 제한자는 생략하였으므로 기본값인 private로 지정
int c;
// int타입인 변수 c를 생성
변수 규칙
- 변수를 사용하기 전에 반드시 초기화
- 변수명 대소문자 구분
- 변수명은 예약어와 동일한 명칭 사용 불가
- 변수명의 시작은 무조건 영문 작성
- 변수명에 숫자 사용 가능, 특수 문자는 _와 $만 사용 가능
- 변수명 길이 제한 없음
변수 생성 위치에 따른 종류 3가지
- 인스턴스 변수 : 클래스 내부(메서드 or 생성자 외부)에 선언되는 변수
- 클래스 변수 : 클래스 내부(메서드 or 생성자 외부)에 static 키워드와 같이 선언되는 변수
- 지역 변수 : 메서드나 생성자 내부에 선언되는 변수
public class Hello {
int number1; // 인스턴스 변수
int number2; // 인스턴스 변수
static int test = 50; // 클래스 변수
public Hello(int num) {
number1 = num;
number2 = num * test;
}
public void sum() {
int speed = 100; // 지역 변수
number1 += speed;
}
}
인스턴스 변수는
해당 클래스를 가지고 객체를 생성할 때마다 해당 객체에 독립적으로 생성되는 변수를 의미한다.
(클래스의 각 인스턴스(객체)마다 고유(개별적인)의 값을 가진 변수)
해당 변수는 객체가 생성될 때 메모리 할당이 이루어지며,
객체가 메모리에서 사라질 때까지 유지된다.
이때 선언한 인스턴스 변수에 값을 할당(초기화) 하지 않으면
해당 변수의 타입에서 지정한 기본값이 자동으로 할당된다.
각 타입에 따른 기본값
- byte, short, int, long : 0
- float : 0.0f
- double : 0.0d
- char : \u0000 (null 문자)
- boolean : false
- 참조타입 : null
클래스 변수는
모든 객체가 공유하는 변수를 의미한다.
(어느 곳에서든 클래스 변수를 사용할 수 있으며, 누군가 해당 클래스 변수의 값을 변경하면 다른 곳에서도 변경된 값으로 사용하게 된다.)
해당 클래스 변수가 존재하는 클래스가 처음으로 참조(로드)될 때 메모리에 할당이 이루어지며,
(즉, 클래스 변수에 처음 접근할 때 메모리 할당 시작)
프로그램이 종료될 때까지 유지된다.
그리고 인스턴스 변수처럼 클래스 변수에 값을 할당(초기화)하지 않으면 기본값이 자동으로 할당된다.
지역 변수는
특정 블록 안에서 실행될 때만 존재하는 변수를 의미한다.
(메서드나 블록 내에서 선언된 변수로 그 안에서만 사용이 가능하며, 그 외의 범위에서는 해당 변수에 접근 불가능)
메서드나 블록이 호출될 때 처음으로 메모리에 할당이 이루어지며,
메서드나 블록의 실행이 종료되면 메모리에서 사라진다.
--
변수 타입
--
변수 타입은
해당 변수에 저장할 수 있는 데이터의 형태를 의미한다.
변수 타입 종류
- 기본형 : 실제 값을 저장
- 참조형 : 해당 값이 저장되어 있는 메모리 주소를 값으로 저장 (객체 주소 저장)
기본형 종류 (총 8개)
- 정수형 (byte, short, int, long)
- 실수형 (float, double)
- 논리형 (boolean)
- 문자형 (char)
참조형은 기본형을 제외한 나머지 타입을 의미한다.
기본형의 각 데이터 사용 범위
- byte : 2^8 ( -128 ~ 127 )
- shrot : 2^16 ( - 32,768 ~ 32,767 )
- int : 2^32 ( 대략 -21억 ~ 21억 )
- long : 2^64 ( 대략 -922경 ~ 922경 )
- float : 2^32 ( 양수 범위 1.4E-45 ~ 3.4028235E+38 / 음수 범위 -1.4E-45 ~ -3.4028235E+38)
- double : 2^64
float과 double은 부동소수점 타입으로, 소수점 이하의 정밀도 범위가 제한되어 있다.
float은 소수점 이하로 약 7자리를 정확하게 표현 가능
doubled은 소수점 이하로 약 15자리를 정확하게 표현 가능
각 타입에 알맞는 값 작성 방법
boolean value = true;
// boolean 타입은 false, true를 값으로 사용
int value = 35;
// byte, short, int 타입은 정수를 값으로 사용
long value = 35L;
// long 타입은 byte, short, int 타입과 동일하지만 할당하는 값에 'l' 또는 'L'이라는 접미사를 붙인다.
// 할당 값이 int 범위 내에 있다면 접미사를 생략해도 자바가 알아서 int 값을 long 값으로 변환
// 다만 int 범위를 벋어나는 값을 할당할 때에는 꼭 접미사를 붙여야 한다.
// (정수로 된 값은 기본적으로 int 타입으로 인식하기 때문이다.)
double value = 3.14;
// double 타입도 할당하는 값에 'd' 또는 'D' 라는 접미사를 사용하지만,
// 실수 타입의 기본 타입이 double형이므로 해당 접미사는 생략해도 된다.
float value = 3.14f;
// float 타입은 할당하는 값에 'f' 또는 'F' 라는 접미사를 붙여야 한다.
// (실수로 된 값은 기본적으로 double 타입으로 인식하기 때문이다.)
char value = 'a';
// char 타입은 하나의 문자만을 값으로 할당할 수 있으며 해당 값은 '(작음 따옴표)로 묶는다.
String value = "abc";
// Stirng 타입(참조형)은 하나 이상의 문자로 이루어진 문자열을 값으로 할당할 수 있으며,
// 해당 값은 "(큰 따옴표)로 묶는다.
문자형인 char 타입은 문자를 저장하는 것처럼 보이지만
사실 문자가 아닌 해당 문자의 유니코드(정수)가 저장된다.
즉, 'A' 문자는 유니코드로 65를 의미하므로 65가 저장된다.
저장 과정
value 변수에 'A' 할당 -> 유니코드를 통해 65로 변환 -> 65 저장
사용 과정
value 변수를 사용 -> 유니코드를 통해 저장된 65를 'A'로 변환 -> 'A' 가져와서 사용
정수형 변수의 값에는 큰 숫자를 한눈에 파악하기 위해 사용하는 ',' 대신 '_'를 구분자로 사용가능하다.
long num = 100_000_000L;
// 100000000L과 동일
--
상수
--
상수는
한번 값을 할당(저장)하면 변경이 불가능한 변수를 의미한다.
상수 기본 형식
[접근 제한자] final <상수명> = <값>;
final 키워드와 [접근 제한자]는 작성 순서 상관없다.
변수, 상수의 값을 "리터럴"이라고 부른다.
(일상에서는 값을 "상수"라고 부르지만 이미 상수라는 용어를 사용하고 있어 "리터럴"이라고 부른다.)
상수 규칙
- 변수와 달리 상수 선언과 동시에 값 할당(초기화)을 해줘야 함
- 변경 불가능한 변수라고 정의하는 final 키워드 사용
- 암묵적으로 상수명을 모두 대문자로 작성 (여러 단어 사용 시 _(언더바)로 구분)
--
2진수, 8진수, 16진수
--
평소 정수형 타입에 사용하는 값은 10진수를 사용한다.
다만 2진수, 8진수, 16진수로도 값을 할당할 수 있다.
각 진법을 표현하는 접미사 (다른 접미사와 다르게 값 앞에 작성한다.)
- 2진수 : 0b 또는 0B
- 8진수 : 0
- 16진수 : 0x 또는 0X
// 10진수의 10을 각각 2진수, 8진수, 16진수로 저장하기
int number = 0b1010;
int number = 012;
int number = 0xA;
--
형 변환
--
형 변환은
특정 타입의 값(또는 변수)을 다른 타입으로 변환하는 것이다.
형변환 기본 형식
(변환할 타입)피연산자
double d = 88.8;
int score = (int)d; // double 타입을 int타입으로 변환하여 사용 (88.8 -> 88)
사용하지 않을 소수점은 반올림, 올림, 내림 없이 그냥 버려진다.
만약 형변환을 할 때 자료형 범위가 작은 쪽에서 큰 쪽으로 변환하는 것이라면
직접 형변환을 할 필요 없이 자동으로 형변환이 된다.
(예시 int(4byte) -> double(8byte)로 변환하는 과정에서는 자동으로 형변환이 된다.)
int i = 30;
double d = 1.0 + i; // int 타입인 i가 자동으로 double 타입으로 변환 후 계산
사실 자동 형변환의 규칙은
타입의 크기뿐만 아니라 타입의 표현 방식(정수형, 실수형)과 저장할 수 있는 값의 범위도 따져야 한다.
int와 float의 경우 (4byte vs 4byte)를 예시로 들면
둘 다 4byte의 크기를 사용하여 서로 자동 형변환이 불가능할 것처럼 보인다.
float은 부동소수점 방식으로 실수를 표현하므로,
int 값을 float로 형변환할 때 정밀도 손실이 발생할 수 있다. ( 8 -> 8.000000012 )
다만 값의 범위는 int타입보다 float타입이 표현할 수 있는 값의 범위가 훨씬 더 크므로
int타입에서 float타입으로 자동 형변환은 가능하지만 반대로는 불가능하다.
자동 형변환 정리
int -> float
long -> double
은 자동 형변환이 가능하지만
반대로는 불가능
char -> short와 short -> char는 불가능
(short은 음수도 표현 가능하지만 char은 음수 표현 불가능)
형변환 규칙 정리
- 기존의 값을 최대한 보존할 수 있는 타입으로는 자동 형변환 가능
- 표현 범위가 더 넓은 쪽으로 형변환 가능
- 기본형과 참조형은 서로 형변환 불가능
- boolean을 제외한 나머지 7개의 기본형은 서로 형변환 가능
--
'Language > Java' 카테고리의 다른 글
조건문, 반복문 (+ break, continue, label) (0) | 2024.10.06 |
---|---|
[연산자] 비교, 논리, 그 외의 연산자 (+ instanceof) (0) | 2024.10.05 |
자바 기본 규칙 (0) | 2024.09.21 |
Java 빌드 (+ Maven, Gradle) (0) | 2024.09.18 |
Java라는 언어에 대해서 (+ JDK, JRE, JVM, 바이트코드, jar) (0) | 2024.09.16 |