자바의 정석 독학부터 학원의 스프링 프로젝트까지 모두 Java란 언어로 진행했는 데 정작 중요한 자바에 대해 잊고 살았던 거 같다. 기본을 다시 잡자는 의미로 자바의 정석을 1편부터 정주행할 예정이다. 나만의 공부 정리글이라 중구난방일 수 있으니 참고바란다.
변수(variable)
프로그래밍언어에서의 변수란, 값을 저장할 수 있는 메모리상의 공간을 의미한다.
단 하나의 값을 저장할 수 있는 메모리 공간.
변수의 선언과 초기화
변수를 사용하려면 먼저 변수를 선언해야하는데, 변수의 선언방법은 다음과 같다.
int age; // age라는 이름의 변수를 선언
변수타입
- 변수에 저장될 값이 어떤 '타입'인지를 지정하는 것
- 저장하고자하는 값의 종류에 맞게 변수의 타입을 선택해서 적어주면 된다.
- 정수형, 실수형, 문자형 등 다양한 타입을 제공
변수이름
- 변수에 붙은 이름을 의미
- 메모리 공간에 이름을 붙여주는 것
- 같은 이름의 변수가 여러 개 존재해서는 안된다.
(서로 구별될 수 있어야하기 때문)
변수의 초기화
- 변수를 사용하기 전에 처음으로 값을 저장하는 것을 의미
- 변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 '초기화(initialization)'해야 한다.
- 변수에 값을 저장할 때는 대입 연산자'='을 이용한다.
(오른쪽의 값을 왼쪽에 저장하라는 뜻)
int age = 25; // 변수 age를 선언하고 25로 초기화 한다.
변수의 명명규칙
'변수의 이름'처럼 프로그래밍에서 사용하는 모든 이름을 '식별자(identifier)'라고 하며, 식별자는 같은 영역 내에서 서로 구분될 수 있어야한다.
식별자를 만들 때는 다음과 같은 규칙을 지켜야 한다.
- 대소문자가 구분되며 길이에 제한이 없다.
- True와 true는 서로 다른 것으로 간주된다. - 예약어를 사용해서는 안 된다.
- true는 예약어라서 사용할 수 없지만, True는 가능하다. - 숫자로 시작해서는 안 된다.
- top10은 허용되지만, 7up은 허용되지 않는다. - 특수문자는 '_'와 '$'만을 허용한다.
- $harp은 허용되지만, S#arp은 허용되지 않는다.
여기서 예약어는 키워드 또는 '리져브드 워드'라고 하는데, 프로그래밍언어의 구문에 사용되는 단어를 뜻한다.
그래서 예약어는 클래스나 변수, 메서드의 이름으로 사용할 수 없다.
예) abstract, boolean, break, new, null 등...
변수명 권장하는 규칙
- 클래스 이름의 첫 글자는 항상 대문자로 한다.
- 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다. - 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
lastIndexOf, StringBuffer - 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
- PI, MAX_NUMBER - 용도를 알기 쉽게 '의미있는 이름'으로 하는 것이 바람직하다. 주석으로 정보를 주는 것도 좋은 생각.
- int curPos = 0; // 현재 위치 (current position)
변수의 타입
값의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 '자료형'이다.
'자료형'에는 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 등이 있다.
기본형과 참조형
1. 기본형
- 실제 값을 저장.
- 논리형, 문자형, 정수형, 실수형 계산을 위한 실제 값을 저장한다. 모두 8개
2. 참조형
- 어떤 값이 저장되어 있는 주소(memory address)를 값으로 저장.
- 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입.
- 참조형 변수 선언 예) 클래스이름 변수이름;
기본형(primitive type)
기본형에는 모두 8개의 타입(자료형)이 있으며, 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.
분류 | 타입 |
논리형 | boolean |
true와 false중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다. | |
문자형 | char |
문자를 저장하는 데 사용되며, 변수에 하나의 문자만 저장할 수 있다. | |
정수형 | byte, short, int, long |
정수를 저장하는 데 사용되며, 주로 int가 사용된다. byte는 이진 데이터를 다룰 때 사용되며, short은 C언어와의 호환을 위해서 추가되었다. | |
실수형 | float, double |
실수를 저장하는 데 사용되며, 주로 double이 사용된다. |
※문자형인 char는 문자를 내부적으로 정수로 저장하기 때문에 정수형 또는 실수형과 연산이 가능하다.
반면 boolean은 다른 기본형과의 연산이 불가능하다.
자료형 | 저장 가능한 값의 범위 | 크기 | |
bit | byte | ||
boolean | false, true | 8 | 1 |
char | '\u0000' ~ '\uffff' (0~2^16-1, 0~65535) | 16 | 2 |
byte | -128 ~ 127 (-2^7~2^7-1) | 8 | 1 |
short | -32,768 ~ 32,767 (-2^15~2^15-1) | 16 | 2 |
int | -2,147,483,648 ~ 2,147,483,6473 (약 21억) | 32 | 4 |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 64 | 8 |
float | 1.4E-45 ~ 3.4E38 | 32 | 4 |
double | 4.9E-324 ~ 1.8E308 | 64 | 8 |
(정수형의 경우 '-2^n-1 ~ 2^n-1'로 외우면 편함)
상수와 리터럴
상수
'값을 저장할 수 있는 공간'이지만, 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다.
변수의 타입 앞에 'final'을 붙여주면 된다.
final int MAX_SPEED = 10; // 상수 MAX_SPEED를 선언 & 초기화
상수는 반드시 선언과 동시에 초기화해야 하며, 그 후 부터는 상수의 값을 변경하는 것이 허용되지 않는다.
final int MAX_SPEED; // 에러. 상수는 선언과 동시에 초기화해야함
final int MAX_VALUE = 100; // OK. 선언과 동시에 초기화했음
MAX_VALUE = 200; // 에러. 상수의 값은 변경할 수 없음
※참고 : JDK1.6부터 상수를 선언과 동시에 초기화 하지 않아도 되며, 사용하기 전에만 초기화하면 되도록 바뀌었다.
그래도 상수는 선언과 동시에 초기화하는 습관을 들이는 것이 좋다.
상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이며, 여러 단어로 이루어져있는 경우 '_'로 구분한다.
리터럴
그 자체로 값을 의미하는 것.
상수와 구분하기 위해 만든 용어.
리터럴에 접미사가 붙는 타입은 long, float, double뿐인데, double은 생략가능하므로 long과 float의 리터럴에 접미사를 붙이는 것만 신경쓰면 된다.
문자 리터럴과 문자열 리터럴
1.문자 리터럴
- 작은 따옴표로 문자 하나를 감싼 것을 의미.(char)
char ch = 'J'; // char ch = 'Java'; 이렇게는 불가
char ch = ''; // 에러. ''안에 반드시 하나의 문자가 필요
char ch = ' '; // OK. 공백 문자로 변수 ch를 초기화할 수 있다.
2.문자열 리터럴
- '문자의 연속된 나열'이라는 의미.(String)
- 두 문자 이상은 큰 따옴표로 감싸야 한다.
String str = new String("Java"); // String객체를 생성
String str = "코딩" + "가득"; // 덧셈 연산자를 이용하여 문자열을 결할할 수 있다.
덧셈 연산자(+)는 피연산자가 모두 숫자일 때는 두 수를 더하지만, 피연산자 중 어느 한 쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합한다.
문자열 + any type -> 문자열 + 문자열 -> 문자열
any type + 문자열 -> 문자열 + 문자열 -> 문자열
기본형 타입의 값을 문자열로 변환하고 싶을 때는 빈 문자열("")을 더해주면 된다.
새로 알아간 내용
변수에 저장하려는 정수값의 범위에 따라 4개의 정수형 중에서 하나를 선택하면 되겠지만, byte나 short보다 int 사용을 권장.
- 연산 시에 범위를 넘어서 잘못된 결과를 얻기가 쉽다.
- JVM의 피연산자 스택이 피연산자를 4byte단위로 저장하기 때문에 byte 또는 short 연산 시 비효율적일 수 있다.
(4byte보다 작은 자료형의 값을 계산할 때는 4byte로 변환하여 연산이 수행)
결론적으로 정수형 변수를 선언할 때는 int타입으로 하고, int의 범위(21억)를 넘어서는 수를 다뤄야할 때는 long을 사용하면 된다. (long타입의 범위를 벗어나는 값을 다룰 때는, 실수형 타입이나 BigInteger클래스를 사용)
byte나 short은 성능보다 저장공간을 절약하는 것이 더 중요할 때 사용.
'Java' 카테고리의 다른 글
[Java] String, StringBuilder, StringBuffer의 차이 (2) | 2024.03.14 |
---|