1.변수(variable)
1.1 변수(variable)란?
프로그래밍 언어에서 변수란, 단 하나의 값을 저장할 수 있는 메모리상의 공간을 의미한다.
1.2 변수의 선언와 초기화
//age라는 이름의 변수 선언
int age // 변수타입 변수이름
변수타입은 변수에 저장될 값이 어떤 타입인지를 지정하는 것이다. 자바는 정수형, 실수형, 문자형 등이 있다.
변수이름은 말 그대로 변수에 붙인 이름이다. 변수는 값을 저장할 수 있는 메모리 공간이므로 변수의 이름은 메모리 공간에 이름을 붙여주는 것이다. 그래야 이름을 이용해 저장공간(변수)에 값을 저장하고 , 저장된 값을 읽어오기도 할 수 있는 것이다.
변수의 초기화
변수를 선언한 이후부터는 변수를 사용할 수 있으나 그 전에 반드시 변수를 초기화(Initiallization)해야 한다. 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 알수없는 값 (= garbage value)가 남아있을 수 있기 때문이다. 즉 변수의 초기화란 변수를 사용하기 전에 처음으로 값을 저장하는 것이다.
int age= 15; //변수 age를 선언하고 25호 초기화한다.
1.3 변수의 명명규칙
‘변수의 이름’처럼 프로그래밍에서 사용하는 모든 이름을 ‘식별자(identifier )’이라고 하며, 식별자는 같은 영역 내에서 서로 구분될 수 있어야한다.
- 대소문자가 구분되며 길이에 제한이 없다
- True와 true는 서로 다른 것으로 간주된다.
- 예약어를 사용해서는 안 된다. 예약어는 키워드 또는 reserved word라고 하는데 프로그래밍 언어의 구문에 사용되는 단어를 뜻한다.
- e.g. acstract, assert, byte, do 등
- 숫자로 시작해서는 안 된다.
- 특수문자는 _ 과 $만 허용한다.
이 외에 권장하는 규칙들이 존재한다.
- 클래스 이름의 첫 글자는 항상 대문자로 한다
- 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다
- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다
- e.g. lastIndexOf, StringBuffer
- 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우는 _ 로 구분한다.
- e.g. PI, MAX_NUMBER
2.변수의 타입
우리가 주로 사용하는 값(data)의 종류는 문자와 숫자로 나눌 수 있으며, 숫자는 다시 정수와 실수로 나눌 수 있다.
이러한 값(data)의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 자료형이다.
기본형과 참조형
자바의 자료형에는 기본형과 참조형이 있다.
- 기본형 변수는 실제 값(data)을 저장한다.
- 기본형 자료형에는 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
- 참조형 변수는 어떤 값이 저장되어 있는 주소 (memory address)를 저장한다.
- 8개의 기본형을 제외한 모든 나머지 타입이 참조변수
Date today = new Date(); //Date 객체를 생성하는 new 연산자를 통해 생성된 객체 주소를 today에 저장
2.1 기본형(Primitive Type)
자바의 기본형은 8가지 타입이 있다.
문자형인 char은 내부적으로 정수로 저장하기 때문에 정수형과 별반 다르지 않으며, 정수형 또는 실수형과 연산이 가능하다. 반면에 boolean은 다른 기본형과의 연산이 불가능하다. 즉 boolen을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능하다.
각 자료형이 가질 수있는 값의 범위를 정확히 외울 필요는 없고, 정수형(byte, short, int, long) 의 경우 -2^(n-1) ~ 2^(n-1) -1 이라고 생각하면된다. 여기서 n은 bit의 수를 말한다. 예를들어 int의 경우 4byte = 32bit이므로 -2^31 ~ 2^31 -1 의 범위를 갖는다. 따라서 int 타입의 변수는 대략 10자리 수 값을 저장할 수 있다. 7~ 9 자리의 숫자를 계산할때는 넉넉히 long 타입 (약 19자리) 변수를 선언하는 것이 좋다. 연산중에 저장범위를 넘으면 원하지 않는 값을 결과로 얻게 될수 있기 때문이다. (= 정수 오버플로우)
실수형은 정수형과 저장형식이 달라서 같은 크기라도 훨씬 큰 값을 표현할 수 있으나 오차가 발생할 수 있다는 단점이 있다. 그래서 정밀도(precision)이 중요한데, 정밀도가 높을수록 발생할 수 있는 오차의 범위가 줄어든다. float형은 정밀도가 7자리로 10진수로 7자리의 수를 오차없이 저장할수 있다는 뜻이다. , double은 정밀도가 15자리로 double이 정밀도가 더 높다.
상수와 리터럴
상수(constant)는 ‘값을 저장할 수 있는 공간’이지만 , 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다. 변수의 타입 앞에 키워드 final 만 붙이면 된다. 반드시 선언과 동시에 초기화해야하며 그 후에는 값을 변경할 수 없다. 이름은 모두 대문자로 하는 것이 관례이며, 여러단어의 경우 _로 구분한다.
(JDK 1.6 부터 동시에 초기화하지 않아도 사용전에만 초기화해도 가능하다.)
final int MAX_SPEED = 10; //상수를 선언 및 초기화
리터럴(literal)
프로그래밍에서 상수를 ‘값을 한번 저장하면 변경할 수 없는 저장공간’ 으로 정의했기때문에, 이와 구분하기 위해 리터럴이러는 용어를 만들었다.
- 변수 : 하나의 값을 저장하기 위한 공간
- 상수 : 값을 한번만 저장할 수 있는 공간
- 리터럴 : 그 자체로 값을 의미하는것
int year = 2014; // year이 변수 2014가 리터럴
final int MAX_VALUE = 100; //MAX_VALUE 가 상수, 100이 리터럴
리터럴의 타입과 접미사
리터럴에서 타입이 있다. 변수의 타입은 저장될 리터럴의 타입(값의 타입)에 의해 결정된다.
정수형의 경우 long타입에 접미사 l 또는 L 을 붙이고, 접미사가 없으면 int 타입의 리터럴이다.
byte와 short 타입의 리터럴은 별도로 존재하지 않는다.
10진수 외에도 16진수라는 것을 표한하기 위해 접두사 0X, 8진수의 경우 0을 붙인며, 2진수의 경우 0b 라고 붙인다.
int octNum = 010; //8진수 10, 2진수 8
int hexNum = 0x10; // 16진수 10, 10진수 16
int binNum = 0b10; // 2진수 10, 10진수 2
float pu = 3.14F;
double rate = 1.618; //d 생략함
long big = 100_000_00_00L;
실수형의 경우 float 타입의 리터럴에 접미사 f , F를 붙이고, double타입의 리터럴에는 d , D를 붙이나 실수형의 기본 자료형이 double이기 때문에 생략가능하다. 또한 리터럴에 소수점이나 10의 제곱을 나타내는 기호 E,e 그리고 접미사 F, f, d, D 를 포함하면 모두 실수형 리터럴이다.
JDK 1.7부터 정수형 리터럴의 중간에 구분자 _를 넣을 수 있어 큰숫자를 편하게 읽을 수 있다.
타입의 불일치
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
그러나 리터럴의 타입이 변수의 타입보다 저장범위가 넓으면 컴파일 에러가 발생한다.
int i = 'A'; // 문자 'A'의 유니코드인 65가 변수 i에 저장된다. 4byte > 2byte (char)
long l = 123; // int보다 long타입이 더 범위가 넓다. 8byte > 4byte
double d = 3.14f; //float보다 double이 더 범위가 넒다. 8byte > 4byte
//컴파일 에러
int i = 0x123456789; //int타입의 범위를 넘음
float f = 3.14; // 리터럴이 double형임
byte와 short 는 따로 리터럴이 존재하지 않으므로 int 리터럴을 사용한다. 단 shot타입의 변수가 저장할 수 있는 범위에 속한 것이어야 한다.
byte b = 65; //byte타입 ~128 ~ 127에 저장 가능한 범위의 int타입 리터럴
short s = 0x1234;
문자 리터럴과 문자열 리터럴
‘A’ 와같이 작은따옴표로 문자 하나를 감싼 것을 문자 리터럴, 두 문자 이상은 큰 따옴표로 감싸야하며 문자열 리터럴이라고 한다. 문자열 리터럴은 안에 아무런 문자를 넣지 않아도 괜찮으며 이를 빈 문자열 이라고 하지만 , 문자 리터럴은 반드시 안에 하나의 문자가 있어야한다.
원래 String은 클래스이므로 아래와 같이 객체를 생성하는 연산자 (new) 를 사용해야 하지만 특별히 제외해도 괜찮다.
char ch = 'C';
String name = "java";
그리고 덧셈 연사를 이용해 문자열끼리 결합할 수 있다. 피연산자 중 어느 한쪽이 String이면 나머지 한쪽을 먼저 String 으로 변환한 다음 두 String을 결합한다. 기본형과 참조형의 구분없이 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 된다.
2.3 형식회된 출력 printf()
printf는 지시자를 통해 변수의 값을 여러가지 형식으로 변환해 출력해준다. println()은 불가능하다. %n는 줄바꿈을 말한다.
System.out.printf("age : %d", age);
System.out.printf("age : %d", 14);
boolean hi = true;
System.out.printf("BOOL=%b%n",hi);
//정수 출력시 출력될 값이 차지할 공간을 숫자로 지정가능
//5는 출력형식이 차지할 자리의 수를 -는 왼쪽정렬. 그리고 0이 존재하는 경우 나머지 부분을 0으로 채운다.
int finger = 8;
System.out.printf("finger=[%5d]%n",finger); //finger=[ 8]
System.out.printf("finger=[%-5d]%n",finger); //finger=[8 ]
System.out.printf("finger=[%05d]%n",finger); //finger=[00008]
//#를 사용하면 접두사 0x와 0이 각각 붙는다.
long hex= 0xFFFF_FFFF_FFFF_FFFFL;
System.out.printf("hex= %x%n", hex); //hex= ffffffffffffffff
System.out.printf("hex= %#x%n", hex); //hex= 0xffffffffffffffff
System.out.printf("hex= %#X%n", hex); //hex= 0XFFFFFFFFFFFFFFFF대문자, %X는 대문자로 출력
//%전체자리.소수점아래자리f
double d = 1.12345678;
System.out.printf("d=%14.10f%n", d); //전체 14자리 중 소수점 아래자리 10자리
//문자열도 가능
String url = "www.hello.world";
System.out.printf("[%s]%n", url);
System.out.printf("[%20s]%n", url); //최소 20글자 출력공간 확보. 우측정렬 , [ www.hello.world]
System.out.printf("[%-20s]%n", url); //최소 20글자 출력공간 확보. 좌측정렬 , [www.hello.world ]
System.out.printf("[%.8s]%n", url); //왼쪽에서 8글자만 출력 , [www.hell]
실수형 값에 출력에 사용되는 지시자는 %f가 주로 쓰이고, %e는 지수를 형태로 출력할때, %g는 값을 간략하게 표현할 떄 사용한다.
그리고 %f는 소수점 아래 6자리까지만 출력하기 때문에 소수점 아래 7자리에서 반올림한다. 그리고 전체 자리수와 소수점 아래의 자리수를 지정할 수도 있다. 소수점 아래의 빈자리는 0으로 채우고 정수의 빈자리는 공백으로 채워서 전체 자리수를 맞춘다. 즉 %전체자리.소수점아래자리f 이다.
지시자 %s에도 숫자를 추가하면 원하는 만큼의 출력공간을 확보하거나 문자열의 일부만 출력할 수 있다.
출처 : 자바의 정석
'Java' 카테고리의 다른 글
[JAVA] 기본형 변수(primitive type) (0) | 2023.12.15 |
---|---|
[JAVA] 진법과 2의 보수법 (1) | 2023.12.07 |
[JAVA] TreeMap (1) | 2023.12.07 |
[JAVA] HashMap과 Hashtable (0) | 2023.12.07 |
[JAVA] TreeSet (0) | 2023.12.07 |