📖/자바의 정석(~ing)
[자바의 정석] Chapter02 변수
모팔구
2023. 3. 27. 09:49
728x90
반응형
1. 변수(variable)
1.1 변수(variable)란? 수학에서 변수(變數): 변하는 수
- 변수(variable): 단 하나의 값을 저장할 수 있는 메모리상의 공간. 변경될 수 있기 때문에 변수라고 이름 붙여졌음. 하나의 변수에 단 하나의 값만 저장할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.
1.2 변수의 선언과 초기화
- 변수의 선언 방법
// 변수타입 변수이름;
int age; // age라는 이름의 정수형 변수를 선언
- 변수타입: 변수에 저장될 값이 어떤 '타입(type)'인지를 지정한다. 자바는 정수형, 실수형, 문자형 등 다양한 타입을 제공한다.
- 변수이름: 변수에 붙인 이름. 변수는 값을 저장할 수 있는 메모리 공간이므로 변수의 이름은 메모리 공간에 이름을 붙여주는 것.
그 이름을 이용해서 저장공간(변수)에 값을 저장하고, 저장된 값을 읽어오기도 할 수 있는 것이다.
※같은 이름의 변수가 여러 개 존재해서는 안된다. 서로 구별될 수 있어야하기 때문이다.
✔ 즉, 변수를 선언하면 메모리의 빈 공간에 변수타입에 알맞는 크기의 저장공간이 확보되고 앞으로 이 저장공간은 변수이름을 통해 사용할 수 있게 된다. - 변수의 초기화: 변수를 사용하기 전에 처음으로 값을 저장하는 것. 변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 '초기화(initialization)'해야 한다. 메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 알 수 없는 값(쓰레기값, garbage value)이 남아있을 수 있기 때문이다.
int age = 25; // 정수형 변수 age를 선언하고 25로 초기화한다.
- 타입이 같은 경우 콤마','를 구분자로 여러 변수를 한 줄에 선언하기도 한다.
int a;
int b;
int x = 0;
int y = 0;
// 위 아래 코드는 같은 의미
int a, b;
int x = 0; y = 0;
1.3 변수의 명명규칙
- 식별자(identifier): '변수명'처럼 프로그래밍에서 사용되는 모든 이름. 식별자는 같은 영역 내에서 서로 구분(식별)될 수있어야한다.
- 식별자 명명 규칙
- 대소문자가 구분되며 길이에 제한이 없다. - True와 true는 서로 다른 것으로 간주된다.
- 예약어를 사용해서는 안된다. - true는 예약어라서 사용할 수 없지만, True는 가능하다.
- 숫자로 시작해서는 안된다. - top10은 허용하지만, 7up은 허용되지 않는다.
- 특수문자는 '_'와 '$'만을 허용한다. - $harp는 허용되지만, S#harp는 허용되지 않는다.
- 예약어(=keyword=reserved word): 프로그래밍 언어의 구문에 사용되는 단어.
- ✔ 자바 예약어 종류
-
- 그 외 자바 프로그래머들에게 권장하는 규칙
- 클래스 이름의 첫 글자는 항상 대문자 - 변수와 메서드의 이름의 첫 글자는 항상 소문자
- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다. ex) lastIndexOf, StringBuffer
- 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다. ex) PI
- 변수의 이름은 짧을수록 좋지만, 약간 길더라도 용도를 알기 쉽게 '의미있는 이름'으로 하는 것이 바람직하다
2. 변수의 타입
- 우리가 주로 사용하는 값(data)의 종류(type)은 크게 문자와 숫자로, 숫자는 다시 정수와 실수로 나눌 수 있다. 이러한 값의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 자료형(data type)이다.
- 기본형과 참조형
- 기본형(primitive type)
논리형(boolean), 정수형(bit, short, int, long), 실수형(float, double) 4가지 8개로, 계산을 위한 실제 값을 저장한다. - 참조형(reference type)
객체의 주소를 저장. 8개의 기본형을 제외한 나머지 타입
참조형 변수(참조변수)를 선언할 때: 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입연산자'='에 의해서 참조변수 today에 저장되는 것이다.
- 기본형(primitive type)
// 참조변수 선언: 클래스이름 변수이름;
// 참조변수 초기화: 변수이름 = new 인스턴스;
Date today = new Date(); // Date객체를 생성해서 그 주소를 today에 저장
2.1 기본형(primitive type)
- 논리형 boolean: true와 false 중 하나를 값으로 가지며, 조건식과 논리적 계산에 사용된다.
boolean은 다른 기본형과의 연산이 불가능하다. - 문자형 char: 문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다.
char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 별반 다르지 않으며 정수형 또는 실수형과 연산이 가능하다. - 정수형 byte, short, int, long: 정수를 저장하는데 사용되며 주로 int를 사용한다(CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문). byte는 이진 데이터를 다룰 때 사용되며 short는 C언어와의 호환을 위해 추가되었다.
- 실수형 float, double: 실수를 저장하는데 사용되며 주로 double이 사용된다.
- 기본형의 종류와 크기
종류 \ 크기 | 1byte | 2byte | 4byte | 8byte |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
<하략>
2.2 상수와 리터럴(constant & literal)
- 상수(constant): 값을 저장할 수 있는 공간이지만 한 번 값을 저장하면 다른 값으로 변경할 수 없다.상수는 반드시 선언과 동시에 초기화해야 하며, 그 후로 상수의 값을 변경하는 것이 허용되지 않는다. 상수의 이름은 모두 대문자로 하는 것이 관례이며 여러 단어로 이루어진 경우 '_'로 구분한다.
final int MAX_SPEED = 10; // 상수를 선언할 때는 앞에 final을 붙여준다.
- 리터럴(literal): 원래 12, 3.14, 'A' 모두 '상수'인데 프로그래밍에서 상수를 위 의미로 이미 정의했기 때문에 리터럴이라는 용어를 사용한다.
- 리터럴의 타입과 접미사: 변수에 타입이 있는 것처럼 리터럴에도 타입이 있다. 변수의 타입은 저장될 '값의 타입(리터럴의 타입)'에 의해 결정되므로, 만일 리터럴에 타입이 없다면 변수의 타입도 필요없을 것이다.
종류 리터럴 접미사 논리형 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타입의 리터럴에 접미사 'L'을 붙이고, 접미사가 없으면 int타입의 리터럴이다. - 실수형의 경우, float타입의 리터럴에 접미사 'f'를 붙이고 double타입의 리터럴에 'd'를 붙이지만 double이 기본형이라서 'd'는 생략이 가능하다. 즉, 접미사가 없으면 double타입 리터럴인 것이다.
- 2진수 리터럴의 경우 접두사 '0b'를, 8진수 리터럴의 경우 접두사 '0'을, 16진수의 리터럴의 경우 접두사 '0x'을 붙인다.
- 접두사와 접미사는 대소문자를 구분하지 않으므로, 편한 것을 사용하면 된다.
- 이 외에도 10의 제곱을 나타내는 'e', 실수 리터럴을 16진수 형태로 표현하는 'p' 등이 있다.
- 정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여 타입을 구분한다.
- 타입의 불일치: 리터럴의 타입은 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
그러나 리터럴의 값이 변수의 타입의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장범위가 넓으면 컴파일 에러가 발생한다.값의 크기와 상관없이 double타입의 리터럴을 float타입의 변수에 저장할 수 없다. byte와 short타입의 리터럴은 따로 존재하지 않으므로 int타입의 리터럴을 사용한다. 단, 해당 타입의 변수가 저장할 수 있는 범위에 속해야 한다.
- 문자 리터럴과 문자열 리터럴
- 문자 리터럴: 'A'와 같이 작은 따옴표로 문자 하나를 감싼 리터럴. char타입과 사용된다. 반드시 ''안에 하나의 문자가 있어야 한다.
- 문자열 리터럴: "Java"처럼 두 문자 이상을 큰 따옴표로 감싼 리터럴. String타입과 사용된다. ""안에 아무것도 넣지 않는 것을 허용하며 이를 빈 문자열(empty string)이라고 한다.
문자열 리터럴은 덧셈 연산자를 이용하여 문자열을 결합할 수 있다.String name = "Ja" + "va"; // name은 "Java" String str = name + 8.0; // str은 "Java8.0"
- 덧셈 연산자는 피연산자가 모두 숫자일 때는 두 수를 더하지만, 피연산자 중 어느 한쪽이 String이면 나머지 한쪽을 먼저 String으로 변환한 다음 두 String을 결합한다. 기본형과 참조형의 구별 없이 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 되는 것이다.덧셈 연산자는 왼쪽에서 오른쪽의 방향으로 연산을 수행하기 때문에 결합순서에 따라 결과가 달라진다. 그리고 기본형 타입의 값을 문자열로 변환할 때는 아무런 내용도 없는 빈 문자열("")을 더해주면 된다.
- 문자열 + any type -> 문자열 + 문자열 -> 문자열
any type + 문자열 -> 문자열 + 문자열 -> 문자열
2.3 형식화된 출력 - printf()
- println(): 변수의 값을 그대로 출력. 값을 변환하지 않고는 다른 형식으로 출력할 수 없다.
같은 값을 다른 형식으로 출력하고 싶을 땐? printf() - printf(): 지시자(specifier)를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력해준다.
지시자(specifier): 값을 어떻게 출력할 것인지를 지정해주는 역할.
println()과 달리 printf()는 출력 후 줄바꿈을 하지 않으므로 줄바꿈을 해주는 지시자 %n을 따로 넣어줘야 한다. - 지시자의 종류
지시자 설명 %b boolean 형식으로 출력 %d 10진(decimal) 정수의 형식으로 출력, char타입을 출력하려면 int로 형변환을 해야 출력할 수 있다. %o 8진(octal) 정수의 형식으로 출력, #을 붙이면 자동으로 0을 붙여 출력 %x 16진(hexa-decimal) 정수의 형식으로 출력, #을 붙이면 자동으로 0x를 붙여 출력 %f 부동 소수점(floating-point)의 형식으로 출력, 소수점 아래 6자리까지만 출력 %e 지수(enponent) 표현식의 형식으로 출력 %c 문자(character)로 출력 %s 문자열(string)로 출력, 숫자를 추가하여 원하는 만큼의 출력공간을 확보하거나 문자열의 일부만 출력 가능 %g 실수형 값을 간략하게 표현하여 출력 - 예시
int age = 14;
System.out.printf("age: %d", age); // 출력 - age: 14
2.4 화면에서 입력받기 - Scanner
- Scanner: 화면으로부터 입력을 받는 클래스
- nextLine(): 입력대기상태에 있다가 입력을 마치고 '엔터키'를 누르면 입력한 내용이 문자열로 반환된다.
- Integer.parseInt(): 입력받은 문자열을 숫자로 변환할 때 사용하는 메서드. 정수로 변환.
Float.parseFloat(): 입력받은 문자열을 실수로 변환하는 메서드.
※ Scanner에는 nextInt()나 nextFloat()와 같이 변환없이 숫자로 바로 입력받을 수 있는 메서드가 있고 이들을 사용하면 문자열을 숫자로 변환하는 수고는 하지 않아도 된다. 그러나 이 메서드들은 화면에서 연속적으로 값을 입력받아서 사용하기에 까다롭다.
- 예시
Scanner scanner = new Scanner(System.in); // Scanner 클래스의 객체를 생성
String input = scanner.nextLine(); // 입력받은 내용을 input에 저장
int num = Integer.parseInt();
※만일 숫자가 아닌 문자 또는 기호 그리고 공백을 입력하면, 입력받은 문자열을 숫자로 변환하는 과정인 Integer.parseInt()에서 에러가 발생한다.
3. 진법
<생략>
4. 기본형(primitive type)
4.1 논리형 - boolean
- boolean 변수는 true, false 중 하나를 저장할 수 있으며, 기본값은 false이다. 대답(yes/no), 스위치(on/off) 등의 논리구현에 주로 사용된다.
boolean power = true; boolean check = False; // 에러. 대소문자가 구분됨. true/false만 가능
4.2 문자형 - char
- char 변수는 단 하나의 문자만을 저장할 수 있다. 사실 문자가 아닌 문자의 유니코드(정수)가 저장된다.그래서 문자 리터럴 대신 문자의 유니코드를 직접 저장할 수도 있다.
- char ch = 'A'; char ch = 65; // 두 문장은 동일한 결과를 가진다. int code = (int) ch; // 어떤 문자의 유니코드를 알고 싶으면 char 변수에 저장된 값을 정수형(int)로 변환하면 된다
- 특수문자 다루기: 따옴표 안에 아래에 맞게 입력하면 된다
특수문자 문자리터럴 tab \t backspace \b // 컴파일러별로 안될 수 있음 form feed \f new line \n carriage return \r 역슬래쉬() \ 작은따옴표 \' 큰따옴표 \" 유니코드 (16진수)문자 \u유니코드 (ex. char a = '\u0041')
- char타입의 표현방식
<생략> - 인코딩과 디코딩(encoding & decoding)
<이하 생략>
4.3 정수형 - byte, short, int, long
<생략>
4.4 실수형 - float, double
<생략>
5. 형변환
5.1 형변환(캐스팅, casting)이란?
- 형변환(casting): 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
5.2 형변환 방법
- 형변환 방법: (타입)피연산자
형변환 연산자는 그저 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환할 뿐, 피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.double d = 85.4; int score = (int)d;
- 기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다. 그리고 기본형과 참조형간의 형변환은 불가능하다.
※ float타입의 값을 int타입으로 변환할 때 소수점 이하의 값은 반올림이 아닌 버림으로 처리된다.
- 기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다. 그리고 기본형과 참조형간의 형변환은 불가능하다.
5.3 정수형간의 형변환
<생략>
5.4 실수형간의 형변환
<생략>
5.5 정수형과 실수형 간의 형변환
5.6 자동 형변환
<생략>
728x90
반응형