728x90
반응형
변수의 타입
우리가 주로 사용하는 값의 종류는 크게 문자와 숫자로 나눌 수 있다. 그리고 숫자는 다시 정수와 실수로 나눌 수 있다. 이러한 값(data)의 종류(type)에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 자료형(data type)이다.
자료형에는 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 등이 있으며, 변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면 된다.
자료형은 크게 기본형과 참조형 두 가지로 나눌 수 있다. 기본형 변수는 실제 값(data)을 저장한다. 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다. 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
1. 기본형(primitive type)
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
계산을 위한 실제 값을 저장한다. 모두 8개
2. 참조형(reference type)
- 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입.
참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성하다는 것은 새로운 참조형을 추가하는 셈이다. 참조변수를 선언하는 방법은 기본형 변수와 같이 변수 이름 앞에 타입을 적어주는데 참조변수의 타입은 클래스의 이름이다.
클래스이름 변수이름; // 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다. Date today = new Date(); // Date객체를 생성해서, 그 주소를 today에 저장
참조변수는 null 또는 객체의 주소를 값으로 갖으며 참조변수의 초기화는 위의 Date today = new Date(); 처럼 한다. 객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입연산자에 의해서 참조변수 today에 저장되는 것이다. 이제 참조변수 today를 통해서 생성된 객체를 사용할 수 있게 된다.
1. 기본형(primitive type)
기본형에는 모두 8개의 타입이 있다. 이는 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.
문자형인 char는 문자를 내부적으로 정수로 저장하기 때문에 정수형과 별반 다르지 않다. 또한 정수형 또는 실수형과 연산도 가능하다. 반면에 boolean은 다른 기본형과의 연산이 불가능하다. 즉 boolean을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능하다.
분류 타입 논리형 boolean true와 false중 하나를 값으로 가진다. 조건식과 논리적 계산에 사용된다. 문자형 char 문자를 저장하는데 사용된다. 변수에 하나의 문자만 저장할 수 있다. 정수형 byte, short, int, long 정수를 저장하는데 사용되며, 주로 int가 사용된다. byte는 이진 데이터를 다룰 때 사용되며 short는 C언어와의 호환을 위해서 추가되었다. 실수형 float, double 실수를 저장하는데 사용되며, 주로 double이 사용된다.
정수는 가장 많이 사용되므로 타입을 4가지나 제공한다. 각 타입마다 저장할 수 있는 값의 범위가 다르므로 저장할 값의 범위에 맞는 타입을 선택하면 된다. 일반적으로는 int를 많이 사용한다. int는 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문이다. 효율적인 실행보다 메모리를 절약하려면 byte나 short를 선택하자.
그리고 각 타입의 변수가 저장할 수 있는 값의 범위는 다음과 같다.
1 byte 2 byte 4 byte 8 byte 논리형 boolean 문자형 char 정수형 byte short int long 실수형 float double
※ float과 double은 양의 범위만 적은 것이다. 음의 범위는 양의 범위에 음수 부호를 붙이면 된다.
자료형 저장 가능한 값의 범위 크기 bit byte boolean false, true 8 1 char \u0000 ~ \uffff (0 ~ 2¹⁶ - 1, 0 ~ 65535) 16 2 byte -128 ~ 127 (-2⁷ ~ 2⁷ - 1) 8 1 short -32,768 ~ 32,767 (-2 ~ 2¹⁵ - 1) 16 2 int -2,147,483,648 ~ 2,147,483,647 (-2³¹ ~ 2³¹ - 1) 32 4 long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (-2⁶³ ~ 2⁶³ - 1) 64 8 float 1.4E-45 ~ 3.4E38(1.4×10⁻⁴⁵ ~ 3.4×10³⁸) 32 4 double 4.9E-324 ~ 1.8E308(4.9×10⁻³²⁴ ~ 1.8×10³⁰⁸) 64 8
각 자료형이 가질 수 있는 값의 범위를 정확히 외울 필요는 없다. 정수형(byte, short, int, long)의 경우 -2ⁿ⁻¹ ~ 2ⁿ⁻¹ - 1(n은 bit 수)이라는 정도만 기억하자.
연산중에 저장범위를 넘어서게 되면 원하지 않는 값을 결과로 얻게 될 수 있기 때문에 자료형을 잘 선택하여 변수를 선언하자.
실수형은 정수형과 저장형식이 달라서 같은 크기라도 훨씬 큰 값을 표현할 수 있으나 오차가 발생할 수 있는 단점이 있다. 그래서 정밀도(precision)가 중요하다. 정밀도가 높을수록 발생할 수 있는 오차의 범위가 줄어든다. float의 정밀도는 7자리 이다. 이 말은 10진수로 7자리의 수를 오차없이 저장할 수 있다는 뜻이다.
이처럼 실수형에서는 저장 가능한 값의 범위 뿐만 아니라 정밀도도 타입 선택의 중요한 기준이 된다.
자료형 저장 가능한 값의 범위 정밀도 크기 bit byte float 1.4E-45 ~ 3.4E38(1.4×10⁻⁴⁵ ~ 3.4×10³⁸) 7 자리 32 4 double 4.9E-324 ~ 1.8E308(4.9×10⁻³²⁴ ~ 1.8×10³⁰⁸) 15 자리 64 8
2. 상수와 리터럴(constant & literal)
상수(constant)는 변수와 마찬가지로 값을 저장할 수 있는 공간이지만 변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없다. 상수를 선언하는 방법은 변수와 동일하며 단지 변수의 타입 앞에 final 키워드를 붙여주기만 하면 된다.
final int MAX_SPEED = 10; // 상수 MAX_SPEED를 선언 & 초기화
그리고 상수는 반드시 선언과 동시에 초기화해야 한다. 그 후 부터는 상수의 값을 변경하는 것이 허용되지 않는다. 상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이다. 여러 단어로 이루어져 있을 경우에는 _로 구분한다.
원래 12, 123, 3.14, 'A'와 같은 값들이 상수이다. 그러나 프로그래밍에서는 상수를 값을 한번 저장하면 변경할 수 없는 저장공간으로 정의하였다. 때문에 이와 구분하기 위해 상수를 다른 이름으로 불러야 했다. 그래서 상수 대신 리터럴이라는 용어를 사용한다. 리터럴은 단지 우리가 기존에 알고 있던 상수의 다른 이름일 뿐이다.
변수(variable) : 하나의 값을 저장하기 위한 공간
상수(constant) : 값을 한번만 저장할 수 있는 공간
리터럴(literal) : 그 자체로 값을 의미하는 것
상수는 리터럴에 의미있는 이름을 붙여서 코드의 이해와 수정을 쉽게 만든다.
리터럴의 타입과 접미사
변수에 타입이 있는 것처럼 리터럴에도 타입이 있다. 변수의 타입은 저장될 값의 타입에 의해 결정되므로, 만일 리터럴에 타입이 없다면 변수의 타입도 필요 없을 것이다.
정수형과 실수형에는 여러 타입이 존재하므로 리터럴에 접미사를 붙여서 타입을 구분한다. 정수형의 경우 long타입의 리터럴에 접미사 l 또는 L을 붙인다. 접미사가 없으면 int타입의 리터럴이다. byte와 short타입의 리터럴은 별도로 존재하지 않는다. 10진수 외에도 2, 8, 16진수로 표현된 리터럴을 변수에 저장할 수 있다. 16진수는 리터럴 앞에 접두사 0x, 8진수의 경우 리터럴 앞에 접두사 0을 붙인다. 실수형에서는 float타입의 리터럴에 접미사 f 또는 F를 붙이고 double 타입의 리터럴에는 접미사 d 또는 D를 붙인다. 정수형에서 int가 기본 자료형인 것 처럼 실수형에서는 double이 기본 자료형이라서 접미사 d는 생략이 가능하다. 리터럴의 접두사와 접미사는 대소문자를 구별하지 않으므로 대문자와 소문자 중에서 어떤 것을 사용해도 상관없다. 하지만 소문자 l 의 경우는 숫자 1과 헷갈리기 쉬워 대문자인 L을 사용하는 것이 좋다.
종류 리터럴 접미사 논리형 false, true 없음 정수형 123, 0b0101, 077, 0xFF, 100L L 실수형 3.14, 3.0e8, 1.4f, 0x1.0p-1 f, d 문자형 'A', '1', '\n' 없음 문자열 "ABC", "123", "A", "true" 없음
※ 리터럴에 접미사가 붙는 타입은 long, float, double뿐인데 double은 생략이 가능하므로 long과 float의 리터럴에 접미사를 붙이는 것만 신경쓰면 된다.
리터럴에 소수점이나 10의 제곱을 나타내는 기호 E 또는 e, 그리고 접미사 f, F, d, D를 포함하고 있으면 실수형 리터럴로 간주된다.
타입의 불일치
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
int i = 'A'; // 문자 A의 유니코드인 65가 변수 i에 저장된다. long l = 123; // int보다 long타입이 더 범위가 넓다. double d = 3.14f; // float보다 double 타입이 더 범위가 넓다.
그러나 리터럴의 값이 변수의 타입의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장범위가 넓으면 컴파일 에러가 발생한다.
문자 리터럴과 문자열 리터럴
'A'와 같이 작은 따옴표로 문자 하나를 감싼 것을 문자 리터럴 이라고 한다. 두 문자 이상은 큰 따옴표로 감싸야 하며 문자열 리터럴이라고 한다. char 타입의 변수는 단 하나의 문자만 저장할 수 있다. 여러 문자를 저장하기 위해서는 String타입을 사용해야 한다. 문자열 리터럴은 안에 아무런 문자도 넣지 않은 빈 문자열을 넣을 수 있다. 그러나 문자 리터럴은 반드시 안에 하나의 문자가 있어야 한다.
String str = ""; String name = new String("Java");
원래 String은 클래스이므로 아래와 같이 객체를 생성하는 new 연산자를 사용해야 하지만 특별히 위와 같은 표현도 허용한다. 그리고 덧셈 연산자를 이용하여 문자열 결합이 가능하다.String name = "Ja" + "va"; // name = "Java" String str = name + 8.0; // str = "Java8.0"
덧셈 연산자는 피연산자가 모두 숫자일 때는 두 수를 더하지만 피연산자중 어느 한쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합한다. 다만 덧셈 연산자는 왼쪽에서 오른쪽방향으로 연산을 수행하기 때문에 결합순서에 따라 결과가 달라질 수 있다는 것에 주의하자.
형식화된 출력 printf(), 화면에서 입력받기 scanner() 이 두가지는 그냥 읽기만 하고 넘어가도록 하겠다.
728x90
반응형
'Study > JAVA' 카테고리의 다른 글
[Java] 3-2. 단항 연산자 (0) | 2022.08.30 |
---|---|
[Java] 3-1. 연산자 (0) | 2022.08.30 |
[Java] 2-5. 형변환 (0) | 2022.08.03 |
[Java] 2-1. 변수(variable) (0) | 2022.08.02 |
[Java] Java의 정석 (0) | 2022.08.01 |
댓글