프로그래밍의 기본원리와 자바의 부족했던 문법들을 공부하고자 자바의 정석이라는 책을 구매했다.
평소에 알고있었던 부분은 다시 복습하고, 모르는 것들은 공부하여 발전하고자 책을 구매했으며,
앞으로 공부한 내용들을 JAVA-basic부분에 정리하고자 한다.
오늘은 프로그래밍의 가장기본인 변수와 상수에 대해서 공부해보자.
변수
변수란?
수학에서는 '변하는 수' 라고 정의하지만 프로그래밍언어에서 값을 저장할 수 있는 메모리상의 공간을 의미한다.
변수를 선언하게 되면, 메모리의 빈 공간에 '변수타입'에 알맞은 크기의 저장공간이 확보되고,
앞으로 이 저장공간은 '변수이름'을 통해 사용할 수 있게 된다.
이러한 변수의 명명규칙이 존재한다.
프로그래밍에서 사용하는 모든 이름을 식별자라고하며,
식별자를 만들 때는 다음과 같은 규칙을 지켜야 한다.
- 대소문자가 구분되며 길이에 제한이 없다.
- 예약어를 사용해서는 안 된다.
- 숫자로 싲가해서는 안 된다.
- 특수문자는 '_'와 '$'만을 허용한다.
변수의 타입
변수의 자료형은 크게 기본형과 참조형 두 가지로 나눌 수 있다.
기본형 변수는 실제 값을 저장하는 반면,
참조형 변수는 어떤 값이 저장되어 있는 주소를 값으로 갖는다.
기본형
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 계산을 위한 실제 값을 저장한다.
기본 자료형의 종류와 크기는 다음과 같다.
1 byte | 2 byte | 4 byte | 8 byte | |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
참조형
- 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입
참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로
클래스의 이름이 참조변수의 타입이 된다.
상수와 리터럴
상수는 변수와 마찬가지로 값을 저장할 수 있는 공간이지만,
변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없다.
상수는 다음과 같이 반드시 선언과 동시에 초기화해야 하며, 그 후 부터는 변경이 허용되지 않는다.
final int MAX_NUM = 100;
상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이다.
원래 12, 123과 같은 값들이 '상수'인데, 프로그래밍에서는 값을 한 번 저장하면 변경할 수 없는 저장공간
으로 정의하였기 때문에 이와 구분하기 위해 리터럴이라는 용어를 사용한다.
리터럴은 단지 우리가 알고 있던 '상수'의 다른 이름일 뿐인 것이다.
다음 예시를 보면 이해가 될 것이다.
int year(변수) = 2014(리터럴);
fianl int MAX_NUM(상수) = 100(리터럴);
리터럴의 타입과 접미사
변수에 타입이 있는 것처럼 리터럴에도 타입이 있다.
리터럴의 타입은 다음 표와 같다.
종류 | 리터럴 | 접미사 |
논리형 | false, true | 없음 |
정수형 | 123, 0b0101, 077, 0xFF, 100L | L |
문자형 | 'A', '1' | 없음 |
실수형 | 3.14, 3.0e8, 1.4f | f, d |
문자열 | "ABC", "123", "A" | 없음 |
정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여서 타입을 구분한다.
정수형의 경우, long타입의 리터럴에 접미사 l또는 L을 붙이고, 접미사가 없으면 int타입의 리터럴이다.
실수형에는 float타입의 리터럴에 접미사 'f'또는 'F'를 붙이고
double타입의 리터럴에는 접미사 'd'또는 'D'를 붙인다.
정수형에서는 int가 기본 자료형인 것처럼 실수형에서는 double이 기본자료형이라 'd'는 생략가능하다.
float a = 3.14; //에러발생. float타입 변수에 double타입 리터럴 저장 불가.
double b = 1.5142; //이것은 가능. 접미사 d는 생략가능.
리터럴의 타입과 접미사
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만,
타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
int i = 'A'; //문자 'A'의 유니코드인 65가 변수 i에 저장된다.
long l = 123; //int보다 long타입이 더 범위가 넓다.
double d = 3.14f //float보다 double타입이 더 범위가 넓다.
문자 리터럴과 문자열 리터럴
'A'와 같은 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴'이라고 한다.
두 문자 이상은 큰 따옴표로 감싸야 하며 '문자열 리터럴'이라고 한다.
char ch = 'H';
String name = "HELLO";
char타입의 변수는 단 하나의 문자만 저장할 수 있으므로, 여러 문자를 저장하기 위해서는 String을 선택해야 한다.
형식화된 출력 printf()
변수의 값을 그대로 출력하는 것이 아닌, 다른 형식으로 출력하고 싶을 때가 있을 것이다.
예를 들면, 소수점 둘째자리까지만 출력을 한다던가, 정수를 다른 진수로 표현하고 싶을 때
printf() 를 사용하면 된다.
int age = 14;
int year = 2021;
System.out.printf("age=%d year=%d", age, year);
위의 선언문을 예시로 들면, age=14 year=2021이 화면에 출력된다.
하지만 printf는 println과 달리 줄바꿈을 해주지 않기 때문에,
줄바꿈을 하려면 지시자 '%n'을 따로 넣어줘야한다.
printf()의 지시자의 종류는 다음과 같다.
지시자 | 설명 |
%b | 불리언(boolean)형식으로 출력 |
%d | 10진 정수의 형식으로 출력 |
%o | 8진 정수의 형식으로 출력 |
%x, %X | 16진 정수의 형식으로 출력 |
%f | 부동 소수점의 형식으로 출력 |
%e, %E | 지수 표현식의 형식으로 출력 |
%c | 문자로 출력 |
%s | 문자열로 출력 |
다음 실습프로그램을 살펴보자.
위의 그림을 보면 %5d는 5칸을 기준으로 오른쪽 정렬해서 출력한다는 것을 알 수 있다.
%-5d는 5칸을 기준으로 왼쪽 정렬해서 출력한다.
%05d는 5칸을 기준으로 빈칸을 0으로 채워서 출력한다.
마지막 문장을 보면, 10진수를 2진수로 출력해주는 지시자는 없기 때문에,
정수를 2진 문자열로 반환해주는 Integer.toBinaryString(int i)을 사용해야 한다.
이 메소드는 정수를 2진수로 변환해서 문자열로 반환하므로 지시자 %s를 사용했다.
또한, System.out.printf("c=%c, %d %n", c, (int)c)
c는 'A'이므로 %d라는 지시자와는 맞지 않는다. 따라서 c를 int로 변환시키는 형변환이 꼭 필요하다.
'JAVA > Basic' 카테고리의 다른 글
[JAVA-basic] 다차원 배열 (0) | 2021.08.09 |
---|---|
[JAVA-basic] String배열 (0) | 2021.08.06 |
[JAVA-basic] 배열 (0) | 2021.08.04 |
[JAVA-basic] 형변환 (0) | 2021.07.28 |
[JAVA-basic] 진법 (0) | 2021.07.27 |