☕ Java Syntax 002 - 변수
☕ Java Syntax 002 - 변수
변수
1
2
3
4
5
6
7
8
9
package variable;
public class Var1 {
public static void main(String[] args) {
System.out.println(10); // 변경 10 -> 20
System.out.println(10); // 변경 10 -> 20
System.out.println(10); // 변경 10 -> 20
}
}
- 패키지는 자바 파일을 구분하기 위한 폴더다.
- 자바 파일 첫 줄에
package variable;과 같이 소속된 패키지를 선언해야 한다. - 위의 예제 코드에서 10을 20으로 바꾸려면 어떻게 해야할까?
- 10이라고 적혀 있는 곳을 모두 찾아서 20으로 변경한다.
- 만약 10을 출력하는 부분이 100개라면?
- 결국 어딘가에 값을 보관해두고 필요할 때 값을 꺼내서 읽을 수 있는 저장소가 필요하다.
- 이러한 그릇을 변수라고 한다.
- 변수는 이름 그대로 변할 수 있다는 뜻이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package variable;
public class Var2 {
public static void main(String[] args) {
int a;
a = 20;
System.out.println(a);
System.out.println(a);
System.out.println(a);
}
}
package variable;
public class Var2 {
public static void main(String[] args) {
int a;
a = 10;
System.out.println(a);
a = 50;
System.out.println(a);
}
}
- 변수를 만드는 것을 변수 선언이라 한다.
- 변수를 선언하면 컴퓨터의 메모리 공간을 확보해서 그곳에 데이터를 저장한다.
- 그리고 변수의 이름을 통해 해당 메모리 공간에 접근할 수 있다.
- 변수에 처음으로 값을 대입해서 저장하는 것을 변수 초기화라 한다.
- 변수는 초기화 해야 한다.
- 변수 선언과 변수 초기화는 한 번에 할 수 있다.
- 여러 변수를 한 번에 선언 및 초기화 할 수 있다.
- 자바는 실행 시점에 변수의 값을 읽어서 사용한다.
- 변수의 값은 코드 중간에 변경할 수 있다.
변수를 초기화해야 하는 이유
- 초기화 하지 않은 변수를 읽는다면 다음과 같은 컴파일 에러가 발생한다.
1
java: variable a might not have been initialized
- 컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이다.
- 그래서 어떠한 값들이 계속 저장된다.
- 변수를 선언하면 메모리 상의 어떤 공간을 차지하고 사용한다.
- 그런데 그 공간에 기존에 어떤 값이 있었는지는 아무도 모른다.
- 따라서 초기화를 하지 않으면 이상한 값이 출력될 수 있다.
- 이를 예방하고자 자바는 변수를 초기화하도록 강제한다.
- 변수를 선언했으나 초기화하지 않고, 사용하지도 않는다면 컴파일 단계에서 코드 최적화를 위해 모두 정리된다.
참고
- 지금 학습하는 지역 변수는 개발자가 직접 초기화를 해주어야 한다.
- 나중에 배울 클래스 변수와 인스턴스 변수는 자바가 자동으로 초기화를 진행해준다.
- 컴파일 에러는 자바 문법에 맞지 않았을 때 발생하는 에러이다.
- 오류를 빨리, 그리고 명확하게 찾을 수 있기 때문에 좋은 에러이다.
- 덕분에 빠르게 버그를 찾아서 고칠 수 있다.
- 제일 무서운 에러는 런타임 에러이다.
- 예를 들어 고객이 계좌 이체를 했는데 내 돈은 나갔으나 상대방에게 돈이 안 들어간 경우이다.
- 그렇기 때문에 프로그램을 작성할 때 컴파일 오류가 많이 발생할 수 있도록 작성하는 것이 중요하다.
변수 타입
- 타입, 형식, 형 등으로 일컫는다.
- 정수형
~~byte:-128~127(1byte, 2⁸)~~~~short:-32,768~32,767(2byte, 2¹⁶)~~int:-2,147,483,648~2,147,483,647(약 20억)(4byte, 2³²)long:-9,223,372,036,854,775,808~9,223,372,036,854,775,807(8byte, 2⁶⁴)
- 실수형
~~float: 대략-3.4E38~3.4E38, 7자리 정밀도(4byte, 2³²)~~double: 대략-1.7E308~1.7E308, 15자리 정밀도(8byte, 2⁶⁴)
- 기타
boolean:true,false(1byte)char: 문자 하나(2byte)를 표현한다. 작은 따옴표로 문자를 감싸야 한다.String: 문자열을 표현한다. 큰 따옴표로 문자열을 감싸야 한다. 메모리 사용량은 문자 길이에 따라 동적으로 달라진다. 첫 글자가 대문자로 시작하는 특별한 타입이다.
심화 포인트
- 변수: 지역 변수, 인스턴스(멤버) 변수, 클래스 변수(
static키워드 사용) - 상수:
final을 통해 한 번만 초기화할 수 있는 변수- 대문자와 언더스코어(
_)를 통해 변수명 작성 권장 - 값 변경 불가하여 안정성 향상
- 모든 인스턴스가 동일한 상수를 갖도록 하려면
static final설정해야함
- 대문자와 언더스코어(
- 데이터 타입
- 기본형(
Bytes):boolean(1),int(4),long(8),double(8),char(2)- 잘 안 쓰는 기본형:
byte(1),short(2),float(4) - 크기 순 나열:
byte→short→char→int→long(8) →float(4) →double long이float보다 크지만, 예외적으로 실수형이 정수형보다 크다고 간주함
- 잘 안 쓰는 기본형:
- 참조형
- 숫자형 및 부울대수형 제외하고는 모두 참조형에 해당됨
Class,int[],ArrayList,…Heap Memory상의 객체 레퍼런스(참조)를 저장- 모든 참조 타입의 값(객체)은
Heap Memory에 생성되고 사용됨
- 기본형(
리터럴
- 코드에서 개발자가 직접 적은
100,10.5,‘A’,“Hello Java”와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라 한다. - 정수 리터럴, 실수 리터럴, 불리언 리터럴, 문자 리터럴, 문자열 리터럴 등으로 일컫는다.
- 변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값으로, 변하지 않는다.
- 정수가
int범위인 20억을 넘어가면L을 붙여서 정수 리터럴을long으로 변경해야 한다. - 대문자
L, 소문자l모두 가능하지만 소문자는 숫자 1과 착각할 수 있어서 권장하지 않는다. - 실수 리터럴은 기본이
double형을 사용하므로float형을 사용하려면f를 붙여서float형으로 지정해야 한다. float를 사용하게 되면 소수점 계산에서 오류가 많이 발생하기에 실무에서 사용하는 경우는 거의 없다.
거의 사용하지 않는 타입
byte- 표현 길이가 너무 작다.
- 자바는 기본적으로
4byte(int)를 효율적으로 계산하도록 설계되어 있다. int를 사용하자.- 대신 파일을 바이트 단위로 다루기 때문에 파일 전송, 파일 복사 등에 주로 사용된다.
short- 표현 길이가 너무 작다.
- 자바는 기본적으로
4byte(int)를 효율적으로 계산하도록 설계되어 있다. int를 사용하자.
float- 표현 길이와 정밀도가 낮기까지 하므로 위험하다.
- 실수형은
double을 사용하자.
char- 문자 하나를 표현하는 일은 거의 없다.
- 문자 하나를 표현할 때도 문자열을 사용할 수 있으므로
String을 사용하자.
- 메모리 용량은 매우 저렴하기 때문에 메모리 용량을 약간 절약하기 보다는 개발 속도나 효율에 초점을 맞추는 것이 더 효과적이다.
변수 명명 규칙
- 자바에서 변수의 이름을 짓는데는 규칙과 관례가 있다.
- 규칙은 필수이며, 지키지 않으면 컴파일 에러가 발생한다.
- 관례는 필수는 아니지만 전세계 개발자가 해당 관례를 따르기 때문에 사실상 규칙이라고 생각해도 된다.
규칙
- 변수 이름은 숫자로 시작할 수 없다.
- 이름에는 공백이 들어갈 수 없다.
- 자바의 예약어를 변수 이름으로 사용할 수 없다.
- 변수 이름에는 영문자, 숫자,
$,_만 사용할 수 있다.
관례
- 소문자로 시작하는 낙타 표기법(
Camel Case)을 사용한다.- 변수 이름은 소문자로 시작하는 것이 일반적이다.
- 여러 단어로 이루어진 변수 이름의 경우 첫 번째 단어는 소문자로 시작하고 그 이후의 각 단어는 대문자로 시작하는 낙타 표기법을 사용한다.
- 클래스명은 대문자로 시작, 나머지는 소문자로 시작한다.
- 예외 사항
- 상수는 모두 대문자를 사용하고 언더바(
_)로 구분한다.(USER_LIMIT) - 패키지는 모두 소문자를 사용한다.(
org.spring.boot)
- 상수는 모두 대문자를 사용하고 언더바(
- 예외 사항
- 변수명은 의미있고, 그 용도를 명확하게 설명해야 한다.
a,b등과 같은 이름의 변수는 사용하는 것을 지양해야 한다.
체크 포인트
- 지역 변수 선언 시 스코프 내에서만 유효함
- 업 캐스팅은 자동 형변환이 불가함
- 다운 캐스팅 시 오버플로우 또는 값 손실 발생 가능
long타입 초기화 시L을 숫자 뒤에 붙여야 하며,L이 붙지 않은 정수형 리터럴은int형으로 간주함float타입 초기화 시F를 숫자 뒤에 붙여야 하며, 실수형 리터럴은double형으로 간주함- 메모리 및 디스크 값이 저렴해졌기 때문에 실수형 변수를 다룰 때
float형은 거의 안 쓰고double형을 주로 쓴다. - 캐스팅은 반드시 같은 종류의 데이터 간에만 가능함
DataType클래스에서 참조형은 다음과 같음DataType클래스String[]Systemout", "과 같은 문자형 리터럴
- 참조형 변수는
.을 통해 해당 인스턴스에 접근이 가능하지만 접근 제어자나 해당 객체가null일 경우 접근이 불가 할 수도 있음 - 변수 출력 시
System.out을 통해 스택에서 기본형은 값을, 참조형은 참조 값을 가져옴
This post is licensed under CC BY 4.0 by the author.
