Java 기초 - 2
변수와 타입
변수
값을 저장할 수 있는 메모리상의 공간
: 변수는 단 하나의 값을 저장할 수 있으며, 새로운 값을 저장하면 기존의 값은 사라짐
변수의 선언 방법
변수를 사용하려면 먼저 변수를 선언해야 함
class Exam {
public static void main(String[] args) {
int num; // num이란 이름의 변수를 선언
// 변수타입 + 변수이름
}
}
변수의 초기화
변수의 초기화(할당)란 변수를 사용하기 전에 처음으로 값을 저장하는 것
class Exam {
public static void main(String[] args) {
int num; // 변수를 선언
num = 1; // 변수의 초기화
}
}
변수 네이밍 룰
- 대소문자가 구분되며 길이의 제한이 없다
- Num과 num은 서로 다른 것으로 간주됨
- 예약어를 사용해서는 안된다
- byte는 프로그래밍 언어의 구문에 사용되는 예약어로 사용할 수 없음
- 숫자로 시작해서는 안된다
- nine1은 허용하지만 8num은 허용하지 않음
- 특수문자는 '_'와 '$'만을 허용한다
- dollar$는 허용되지만 sarp#은 허용되지 않음
상수 : 변하지 말아야 할 데이터를 저장하는 공간
: 변수와 같이 선언과 초기화하여 사용할 수 있지만 값은 변경할 수 없음]
상수의 선언과 초기화
상수를 선언하는 방법은 변수와 동일하며 변수의 타입 앞에 'final'을 붙여주면 된다. 이름은 모두 대문자로 하는 것이 암묵적인 관례이며 여러 단어로 이루어져 있는 경우 '_'로 구분한다
final int MAX_AGE = 134;
타입
어떤 값의 유형 및 종류를 의미하고, 타입에 따라 값이 차지하는 메모리 공간의 크기와 값이 저장되는 방식이 결정된다
자바의 타입은 기본 타입과 참조 타입으로 나눌 수 있다
- 기본 타입 (Primitive Type)
- 값을 저장할 때, 데이터의 실제 값을 저장
- 정수형(byte, short, int, long)
- 실수형(float, double)
- 문자형(char)
- 논리형(boolean)
- 참조 타입 (Reference Type)
- 객체의 주소를 저장하며 8개의 기본형을 제외한 나머지 타입
- 리터럴 (Literal) : '문자 그대로의'라는 뜻으로 프로그래밍에선 문자가 가리키는 값 그 자체를 의미하며, 리터럴을 사용할 때는 두 가지 사항을 주의해야 함
- float 타입의 변수에 실수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 f를 붙여야 한다
- long 타입의 변수에 정수형 리터럴을 할당할 때, 리터럴 튀에 접미사 L을 붙여야 한다
정수타입의 크기와 범위
정수타입은 숫자를 나타내는 타입으로 btye, short, int, long까지 총 4개의 타입으로 분류된다
일반적으로 int 타입을 사용하며 타입별로 차지하는 메모리 공간의 크기와 표현할 수 있는 범위가 다르다
각 타입의 표현 범위를 넘어설 경우 오버플로우와 언더플로우가 발생한다
타입 | 메모리 | 표현 범위 |
---|---|---|
byte | 1byte | -128(-27) ~ 127(27 - 1) |
short | 2byte | -32,768(-215) ~ 32,767(215 - 1) |
int | 4byte | -2,147,483,648(-231) ~ 2,147,483,647(231 - 1) |
long | 8byte | -9,223,372,036,854,775,808(-263) ~ 9,223,372,036,854,775,807(263 - 1) |
- 정수형의 오버클로우
- 자료형이 표현할 수 있는 범위 중 최대값 이상의 값을 표현할 경우 발생
- 최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환
- Ex) byte형의 최대값인 127에 1을 더하면 최소값인 -127이 됨
- 정수형의 언더플로우
- 자료형이 표현할 수 있는 범위 중 최소값 이하의 값을 표현할 경우 발생
- 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환
- Ex) byte형의 최소값인 -128에 1을 빼면 최대값인 127이 됨
실수타입의 크기와 범위
실수타입은 소수점을 가지는 값을 의미하며 float, double으로 분류된다
타입 | 메모리 | 표현 범위 | 정밀도 |
---|---|---|---|
float | 4byte | 음수 : -3.4 x 1038 ~ -1.4 x 10-45 양수 : 1.4 x 10-45 ~ 3.4 x 1038 | 7자리 |
double | 8byte | 음수 : -1.8 x 10308 ~ -4.9 x 10-324 양수 : 4.9 x 10-324 ~ 1.8 x 10308 | 15자리 |
- 실수형의 오버플로우
- 값이 음의 최소 범위 또는 양의 최대 범위를 넘어서면 값은 무한대가 됨
- 실수형의 언저플로우
- 값이 음의 최대 범위 또는 양의 최소 범위를 넘어서면 값은 0이 됨
논리타입의 종류와 크기
논리타입의 종류는 boolean형 한가지로 참(true) 또는 거짓(false)을 저장할 수 있는 데이터 타입이다
단순히 참과 거짓을 표현하기 위해선 1bit가 필요하지만 JVM이 다룰 수 있는 데이터의 최소 단위가 1byte이기 떄문에 boolean형은 1byte의 크기를 가진다
문자타입의 종류와 크기
문자타입은 2byte 크기의 char형 하나만 존재하며 문자타입 변수를 선언하면 해당 변수에 오직 하나의 문자형 리터럴을 저장할 수 있다
문자형 리터럴을 작성할 떄는 반드시 작은 따옴표를 사용해야한다
자바의 문자타입과 유니코드
자바는 유니코드로 문자를 저장한다. 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 다루기 위한 국제 표준으로 각 문자에 숫자 코드 번호를 부여한 것이다. 따라서 문자형 리터럴을 문자형 변수에 할당하면 유니코드 숫자값이 저장된다
이를 응용하여 숫자를 문자형 변수에 할당할 수 있다. 숫자가 저장된 변수를 참조할 때 해당 변수가 저장하고 있는 숫자값을 유니코드로 인식하여 해당 숫자와 일치하는 코드를 가진 문자로 변환해준다
char exam = 65;
Syetem.out.println(exam); // 출력 결과 : A
변수의 타입 변환
변수는 타입을 변환할 수 있으며 자동 또는 수동으로 변환하는 경우가 다르다
- 자동 타입 변환
- 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때 (Ex. int -> long)
- 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 떄 (Ex. 정수 -> 실수)
- 수동 타입 변환
- 수동으로 타입을 변환할 때는 캐스팅 연산자 () 를 사용
- 캐스팅 연산자의 괄호 안에 변환할 타입을 적어줌
// int 타입으로 선언된 변수 intNum을 더 작은 단위인 byte로 변환한다
int intNum = 128;
byte byteNum = (byte)intNum;
System.out.println(byteNum); // -128
// 타입이 변환되며 byte형의 표현 범위를 벗어나게 되어 오버플로우가 발생
문자열
자바는 String 클래스 타입을 사용하여 문자열을 다루며 문자열과 관련된 메서드들을 가지고 있다
String 타입은 기본적으로 큰따옴표로 감싸진 문자열을 의미한다
// 문자열 리터럴을 String 타입의 변수에 할당하는 방법
String myName = "Mason";
// String 클래스의 인스턴스를 생성하는 방법
String myName2 = new String("Mason");