변수
프로그래밍 언어에서의 변수는 값을 저장할 수 있는 메모리 상의 공간
변수와 상수
변수의 초기화
변수는 사용하기 전에 반드시 초기화해야함, 클래스 변수와 인스턴스 변수는 초기화를 생략할 수 있지만, 지역 변수는 안됨
// 선언 케이스1
int a;
int b;
int x = 0;
int y = 0;
// 선언 케이스 2
int a, b;
int x = 0, y = 0;
변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것
변수의 명명 규칙
- 대소문자가 구분되며 길이에 제한이 없다.
- 예약어를 사용해서는 안된다.
- 숫자로 시작해서는 안된다.
- 특수문자는 _ $ 만 허용한다.
추가 권장 규칙
- 클래스 이름의 첫 글자는 항상 대문자
- 카멜 케이스 사용
- 상수가 여러 단어로 이루어질 경우 _ 사용
변수의 타입
값의 종류는 크게 문자, 숫자로 나눌 수 있음. 자료형이란, 값의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것
- 문자형(char)
- 정수형(byte, short, int, long)
- 실수(float, double)
기본형과 참조형
기본형(Primitive) 변수
- 실제 값을 저장 (직접 주소 레지스터 지정 방식)
참조형(Reference) 변수
- 주소를 저장 (간접 주소 레지스터 지정 방식)
참조 변수 선언
클래스 이름 변수이름; // 변수 타입이 클래스 이름인 것들은 모두 참조변수
자료형 vs 타입
- 자료형은 primitive 변수에서 사용
- 타입은 reference 변수에서 사용
기본형(primitive type)
- 논리형 boolean
- 문자형 char
- 문자형인 char은 문자를 내부적으로 정수(유니코드)로 저장하기 때문에, 정수형과 별반 다르지않다. 정수형 or 실수형과 연산도 가능하다.
- 정수형 byte, short, int, long
- 각 타입마다 저장할 수 있는 값의 범위가 다르므로 값의 범위에 맞는 타입을 선택해야한다.
- 일반적으로 int를 많이 사용한다. 정수형의 default 이다.
- byte는 이진 데이터, short는 C언어의 호환을 위해서 추가되었다.
- 실수형 float, double
- double을 주로 사용하고 실수형의 default 이다.
종류 | 크기 | 1byte | 2byte | 4byte | 8byte |
논리형 | boolean | ||||
문자형 | char | ||||
정수형 | byte | short | int | long | |
실수형 | float | double |
1byte → 8bit
- boolean은 true와 false 두 가지 값만 표현할 수 있으면 되므로, 자바에서 데이터를 다루는 최소단위인 1byte 사용 → $2^8$
- char는 유니코드(2byte 문자체계)를 사용하므로 2byte → $2^{16}$
- byte는 크기가 1byte라서 byte → $2^8$
- int(4byte) 를 기준으로 짧아서 short(2byte), 길어서 long(8byte)
- float는 실수값을 부동소수점(floating-point) 방식으로 저장하기 때문에 float 4byte
- float의 정밀도는 7자리
1 8 23 - double은 float보다 두 배의 크기를 가지고 있기 때문에 double 8byte
- double의 정밀도는 15자리
1 11 52
✏️ 정밀도 : 오차가 발생하지 않는 자릿수
출력 printf
기본적으로 println()은 출력 값에 대해서 default로 형변환이 이루어져서 출력이 되고, 소수점 몇번 째 짜리 혹은 몇 자리 수 까지 출력하는 등에 대한 조건을 걸 수가 없다.
System.out.println(10 / 3) == 3
System.out.println(10.0 / 3) == 3.333333333334 // double 타입의 정밀도 이후 반올림
과 같이 개발자가 실수를 할 수 있는 상황이 발생할 수 있다. 물론 이를 방지하기 위해 Math 라는 Java API를 사용해서 해결이 가능하지만 이는 다음에 확인하자.
이러한 부분을 막기 위해 형식화 된 출력인 printf를 사용하게 되는데 사용하는 방법은 C언어와 비슷하다.
System.out.printf("%d", 3);
System.out.printf("%d, %d", 3, 4);
System.out.printf("%.2f, 10.0 / 3); // 3.33 .2는 소수점 아래 두 자리수까지 출력한다는 말이다.
위와 같은 형식으로 출력이 된다. 그럼 형식화 된 출력인 printf에서 사용되는 지시자를 살펴보자.
지시자 설명
%b (boolean) | boolean 형식으로 출력 |
%d (decimal) | 10진 정수의 형식으로 출력 |
%o (octal) | 8진 정수의 형식으로 출력 |
%x, %X (hexa) | 16진 정수의 형식으로 출력 |
%f | floating-point 형식으로 출력 |
%e, %E | exponential 형식으로 출력 |
%c | 문자 형식으로 출력 |
%s | 문자열 형식으로 출력 |
// 1. 정수를 10진수 8진수 16진수 2진수로 출력
System.out.printf("%d", 15); // 15
System.out.printf("%o", 15); // 17
System.out.printf("%x", 15); // f
System.out.printf("%X", 15); // F
System.out.printf("%s", Integer.toBinaryString(15)); // 1111
// 2. 진수 출력에 접두사 표시하기
System.out.printf("%#o", 15); // 017
System.out.printf("%#x", 15); // 0xf -> 접두사도 소문자
System.out.printf("%#X", 15); // 0XF -> 접두사도 대문자가 포인트
// 3. 특수 지시자
// 1. 정수
System.out.printf("[%5d]", 10); // [ 10] -> 5자리 포함 오른쪽 정렬
System.out.printf("[%-5d]", 10); // [10 ] -> 5자리 포함 왼쪽 정렬
System.out.printf("[%05d]", 10); // [00010] -> 오른쪽 정렬 후 나머지는 0으로 채움
// 2. 소수
System.out.printf("[%14.10f]", 1.23456789); // [ 1.2345678900]
// -> 소수부터 10자리를 먼저 채우는데 부족한건 0으로 채우고 전체 숫자 14자리를 채운다. 이때 정수 부분이 부족하면 공백으로 남긴다.
// 3. 문자열
// 문자열을 정수와 똑같으나 하나 다른것이 있다.
System.out.printf("%.8s", "abcdefghijklmn"); // abcdefgh -> 앞에서 부터 8자리만 출력한다.
상수와 리터럴
프로그래밍 상에서의 상수는 변수와 마찬가지로 값을 저장할 수 있지만, 한 번 저장하면 변경할 수 없는 저장공간이다. 12, 123, ‘A’, 3.14 같은 값들은 상수인데, 프로그래밍에서의 상수와 겹치기 때문에 구분하기 위해 리터럴이라는 용어를 사용한다. 상수의 가장 큰 장점은 리터럴에 의미있는 이름을 붙여서 코드의 이해와 수정을 쉽게 만든다.
타입의 불일치
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다. 그러나 저장범위가 좁은 타입에 넓은 타입의 값을 저장하는건 안된다.
// 되는 경우
int i = 'A'; // 문자 'A'의 유니코드인 65저장
long l = 123; int보다 long타입의 범위가 더 넓음.
double d = 3.14f; float보다 double타입이 더 범위가 넓음
// 안되는 경우
float f = 3.14 float보다 double 타입의 범위가 더 넓음.
문자 리터럴과 문자열 리터럴
‘A’와 같이 작은 따옴표로 문자 하나를 감싼 것을 ‘문자 리터럴’, 두 문자 이상은 큰 따옴표로 감싸고 이를 ‘문자열 리터럴’ 이라고 한다.
String str = ""; // 내용이 없는 빈 문자열 저장 가능
char ch = ''; // 반드시 하나의 문자가 필요 에러발생
char ch = ' '; // 공백 문자로 초기화함 가능
String name = new String("java"); // String은 클래스여서 생성자로 생성가능
덧셈 연산자를 이용한 문자열의 결합
문자열 + any type → 문자열 + 문자열 → 문자열
any type + 문자열 → 문자열 + 문자열 → 문자열
"" + 7 -> "" + "7" -> "7"
7 + 7 + "" -> 14 + "" -> "14" + "" -> "14"
"" + 7 + 7 -> "" + "7" + 7 -> "7" + 7 -> "7" + "7" -> "77"
true + "" -> "true" + "" -> "true"
null + "" -> "null" + "" -> "null"
덧셈 연산자라서 왼쪽부터 되는 것에 유의
https://product.kyobobook.co.kr/detail/S000001550352
'Language > Java' 카테고리의 다른 글
7-2 참조변수 super, 생성자 super() (0) | 2023.03.22 |
---|---|
7-1 상속과 오버라이딩 (0) | 2023.03.22 |
6. 객체지향언어 1 (0) | 2023.03.22 |
3. 연산자 (0) | 2023.03.21 |
1. 자바 (0) | 2023.03.21 |