변수 정리
변수 선언
변수 선언은 이렇게
type variableName;
앞에 자료형을 써주고 뒤에 변수 이름을 써주면 된다.
정수형을 담을 변수 a, 문자열을 담을 변수 s를 선언하기 위해서는 이렇게 써주면 된다.
int a;
String s;
변수 이름 규칙
변수의 이름을 지어줄 때 알아야할 규칙이 몇 가지 있다.
- 대소문자를 구분 합니다. codeit과 codeIt은 서로 다른 변수입니다.
- 숫자로 시작할 수 없습니다.
- 밑줄(_)과 달러 표시($)를 사용할 수는 있지만, 사용하지 않는 것이 좋습니다. $는 주로 자동 생성되는 변수명으로 쓰이고, _는 보통 상수 이름에 쓰입니다.
- class, public과 같은 자바의 예약어는 변수명으로 쓸 수 없습니다.
- 자바의 변수명은 '카멜 케이스(camelCase)'라는 기법으로 작성하는게 좋습니다. 카멜 케이스에서 첫 번째 글자는 소문자고, 그 후에 새로운 단어의 첫 번째 글자는 대문자입니다(myName, someRidiculouslyLongName).
값 넣어주기
변수를 선언하고 값을 넣어주기 위해서는 이렇게 하면 된다.
int age;
age = 27;
오른쪽에 있는 27을 왼쪽의 변수 age에 넣어준 것이다.
선언과 초기값 설정을 같이 할 수도 있다.
int age = 27;
자바에서는 변수의 자료형을 지정하기 때문에, 적합하지 않은 값을 넣어주면 오류가 나온다.
int age = "Thirty"; // 오류
변수 사용
변수의 사용은 다른 언어와 똑같다. 변수에 값을 대입 할 수도 있고, 연산을 할 수도 있다.
int age = 27;
int num = 13;
System.out.println(num + age); // 27 + 13 출력
age = num; // 13을 age에 지정
System.out.println(num + age); // 13 + 13 출력
age = age + 1; // 13 + 1을 age에 지정
System.out.println(num + age); // 13 + 14 출력
꿀팁: 출력 메소드
int age = 27;
System.out.println("Hello, I'm ");
System.out.println(age);
System.out.println(".");
Hello, I'm
27
.
이렇게 println 메소드를 쓰면 저절로 줄 바꿈이 된다. 만약에 줄 바꿈을 원하지 않으면 println 대신 print를 써주면 된다.
int age = 27;
System.out.print("Hello, I'm ");
System.out.print(age);
System.out.println(".");
Hello, I'm 27.
자료형 정리
기본 자료형
자바에는 '기본 자료형(Primitive Types)'이 있다. 가장 기본이 되는 자료형들이다.
Type | Bits | Range of Values |
byte | 8bits | -2^7 ~ 2^7-1 (-128 ~ 127) |
short | 16bits | -2^15 ~ 2^15-1 (-32768 ~ 32767) |
int | 32bits | -2^31 ~ 2^31-1 (-2147483648 ~ 2147483647) |
long | 64bits | -2^63 ~ 2^63-1 (-9223372036854775808 ~ 9223372036854775807) |
float | 32bits | *single-precision 32-bit IEEE 754 floating point |
double | 64bits | *double-precision 64-bit IEEE 754 floating point |
char | 16bits | \u0000 ~ \uffff (0 ~ 2^15-1) |
boolean | *VMD | true, false |
각 자료형의 기본 값은 다음과 같다.
Type | 기본 값 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | '\u0000' |
boolean | false |
숫자형
숫자를 담는 자료형은 정수형 byte, short, int, long, 그리고 소수형 float과 double이 있다.
정수형
자바에서는 int를 정수형의 메인으로 사용한다. 즉, 정수를 입력하면 기본적으로 int로 간주한다.
byte a = 127;
하지만 이렇게 127을 byte 변수에 지정해주면, 127은 byte의 범위 내에 있기 때문에 컴파일러가 알아서 127을 byte로 바꿔준다.
long x = 12345678910; // 오류 (정수 범위를 벗어남)
만약 int의 범위에서 벗어나는 값을 써주면 오류가 나온다. 고치기 위해서는 L을 붙여주면 된다.
long을 표현하기 위한 리터럴은 뒤에 l(소문자 엘) 또는 L(대문자 엘)을 붙여준다. 소문자 l(엘)의 경우 숫자 1(일)과 혼동될 수 있으니 대문자 L(엘)을 적는 것이 권장사항이다.
long x = 12345678910l; // 소문자 l은 1과 헷갈릴 수 있음
long x = 12345678910L; // 권장사항
소수형
자바에는 두 가지 소수형 자료형이 있다: float과 double.
float과 double은 둘다 소수형을 담지만 정밀도 혹은 정확도에 차이가 있다. double이 더 정밀하게 값을 보관할 수 있다. 이러한 이유로 자바에서는 double을 소수형의 기본으로 사용한다. 정수를 입력하면 기본적으로 int로 인식되듯이, 소수를 입력하면 기본적으로 double로 인식되는 것이다.
만약 float를 쓰고 싶으면 소수를 쓰고, 뒤에 f를 붙여주면 된다.
float f = 3.14f;
글자
char a1 = 'a';
char a2 = 97;
char a3 = '\u0061';
char a4 = '가';
글자(Character) 하나를 담는 자료형 char도 있다. char은 딱 글자 하나만 넣어줄 수 있고, 작은 따옴표로 글자를 둘러싸야 한다. 글자 여러 개를 담고 싶으면 큰 따옴표로 둘러싸고 아래에서 배울 String이라는 자료형을 사용하면 된다.
a1에는 글자 'a'를 담았고, a2에는 글자 'a'에 해당하는 ASCII값인 97을 담았다. 사실 a1과 a2는 같은 셈이다.
a3는 유니코드 값이다. '가'도 유니코드 중 하나라 자바의 char에 담을 수 있다.
불린
boolean myBoolean = true;
myBoolean = false;
참(true), 거짓(false)을 담는 boolean 이다. 값으로는 true와 false가 가능하다.
나중에 '제어문' 섹션에서 보시면 용도를 더 쉽게 이해하실 수 있을 것이다.
문자열
이제 조금 특별한 자료형을 살펴보도록 한다. String은 제일 위의 기본 자료형에 없다. String은 기본 자료형이 아니라 클래스이다. 클래스를 변수의 형으로 쓰고 변수를 선언하면 그 변수는 클래스의 인스턴스를 담을 수 있다.
String 클래스에 대해서는 이후에 제대로 배우니까, 일단은 이해가 안 되도 그냥 넘어가도 된다.
먼저 String은 큰 따옴표(")로 둘러싸인 글자들을 적어 만들 수 있다.
String a = "Hello, I'm ";
String b = ".";
System.out.print(a);
System.out.print(26);
System.out.println(b);
Hello, I'm 26.
다양한 활용법은 차차 알아보도록 한다!
연산자 정리
문자열 연산
이렇게 문자열 사이에 덧셈(+) 연산자를 사용하면 문자열을 연결해줄 수 있다.
String myString = "Hello " + "Codeit!";
System.out.println(myString);
Hello Codeit!
문자열과 숫자를 더하면 숫자가 저절로 문자열로 바뀌고, 문자열과 불린을 더하면 불린이 저절로 문자열로 바뀐다.
System.out.println("I am " + 27 + " years old.");
System.out.println("The result is " + false + ".");
I am 27 years old.
The result is false.
문자열 사이에 특수한 문자를 표현하고 싶을 수 있다. 예를 들어서 큰 따옴표(")로 둘러싸인 문자열 내에 큰 따옴표(")를 넣는 경우가 있다. 이런 경우에 맥에서는 역슬래쉬(\), 윈도우즈에서는 원화 표시(₩)를 사용하면 된다.
System.out.println("데카르트는 \"나는 생각한다. 고로 존재한다.\"라고 말했다.");
데카르트는 "나는 생각한다. 고로 존재한다."라고 말했다.
이렇게 \ 또는 ₩를 이용하여 문자열 안에 확장된 표현을 하는 문자를 이스케이프 문자(Escape Character)라고 한다.
이스케이프 문자에는 이런 것들이 있는데, 사실 우리는 "\n", "\"", "\'" 정도만 자주 쓸 것이다.
Escape Sequence | Description |
\t | 탭 |
\b | 백스페이스 |
\n | 줄 바꿈(new line) |
\r | 줄 바꿈(carriage return) |
\f | 폼 피드(form feed) |
' | 작은 따옴표 |
" | 큰 따옴표 |
\ | 역슬래쉬 |
줄 바꿈을 위해서 맥에서는 "\n", 윈도우즈에서는 "\r\n"을 사용해야 한다.
숫자 연산
이제 숫자 연산들을 보자. 이런 연산자들이 있다.
연산자 | 설명 |
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 |
정수형과 정수형 간의 연산은 같은 자료형의 결과값을 갖는다.
System.out.println(9 / 5);
1
서로 다른 자료형의 연산은 랭크가 더 높은 자료형의 결과값을 갖는다. 랭크에 대하여는 '형 변환' 강의에서 배울 예정이다.
소수형은 정수형보다 랭크가 높기 때문에 소수형과 정수형 간의 연산의 결과값으로는 소수형이 나온다.
System.out.println(9.0 / 5);
1.8
단항 연산자
자바에는 단항 연산자도 있다. 몇 가지만 간단하게 소개하자면:
int a = 3;
System.out.println(-a); // 양, 음 부호가 바뀜
System.out.println(++a); // a에 1을 추가
System.out.println(--a); // a에 1을 감소
-3
4
3
불린 연산
비교 연산자
두 숫자형 값을 비교하고 싶으면 비교 연산자를 쓰면 된다.
int a = 3;
int b = 5;
System.out.println(a > b); // a가 b보다 크다
System.out.println(a >= b); // a가 b보다 크거나 같다
System.out.println(a < b); // a가 b보다 작다
System.out.println(a <= b); // a가 b보다 작거나 같다
System.out.println(a == b); // a는 b와 같다
System.out.println(a != b); // a는 b와 같지 않다
false
false
true
true
false
true
불린 연산자
불린 연산도 어느 정도 익숙할 것이다. AND(&&)의 경우 양쪽 다 true이어야만 true가 나오고, 한쪽이라도 false면 false가 나온다.
System.out.println(true && true);
System.out.println(true && false);
System.out.println(false && true);
System.out.println(false && false);
true
false
false
false
OR(||)의 경우 양쪽 다 false이어야만 false가 나오고, 한쪽이라도 true면 true가 나온다.
System.out.println(true || true);
System.out.println(true || false);
System.out.println(false || true);
System.out.println(false || false);
true
true
true
false
마지막으로 NOT(!) 연산은 불린값을 뒤집어준다.
System.out.println(!true);
System.out.println(!false);
false
true
숫자 연산처럼 섞을 수도 있다.
System.out.println(!(false && (true || false)));
true
형 변환 정리
Literal
리터럴이란 소스코드의 고정된 값을 대표하는 용어이다. 예제를 통해서 보자.
int myInt = 123;
byte myByte = 38;
short myShort = 2;
여기서 123, 38, 2는 '정수 리터럴'이다. 기본적으로는 int 자료형이지만 byte나 short 변수의 초기값으로 설정하면 아무 문제 없이 값이 들어간다.
영상 강의에서 다룬 적 있는 long에 대해서도 보자.
long myLong = 12345678910; // 오류: 정수 값이 너무 크다
여기서도 오른쪽 12345678910은 int 리터럴인데, int가 담을 수 있는 범위를 넘어섰기 때문에 오류가 나는 것이다. 이 문제를 해결하기 위해서는 뒤에 L을 붙여주면 된다.
long myLong = 12345678910L;
위에서 12345678910L은 정수 리터럴이 아니라 '롱 리터럴'이다.
여러 예시를 통해 숫자형 리터럴에 익숙해져 보자.
long e = 123;
long f = 123L; // long의 리터럴 표현방법
float g = 3.14; // 오류: 형이 맞지 않음. 필요한 값: float, 발견된 값: double
float h = 3.14f; // float의 리터럴 표현방법
float i = 314f; // float의 리터럴 표현방법
double j = 3.14;
double k = 314d; // double의 리터럴 표현 방법
아무런 표기가 없는 소수형은 double이라는 것을 알고 있다. 물론 double을 명시하는 리터럴로 d를 붙여주는 방법도 있다.
랭크
Type | Size | Range |
byte | 1byte | -128 ... 127 |
short | 2byte | -32,768 ... 32,767 |
int | 4byte | -2,147,483,648 ... 2,147,483,647 |
long | 8byte | -9,223,372,036,854,775,808 ... 9,223,372,036,854,775,807 |
float | 4byte | 1.4023985 x 10^-45 ... 3.4028235 x 10^38 |
double | 8byte | 4.940656458412465 x 10^-324 ... 1.797693134862316 x 10^308 |
예전에 소수형이 정수형보다 강하기 때문에(랭크가 높기 때문에) 소수형과 정수형 간의 연산에는 소수형 결과값이 나온다고 했었다. 표의 위에서 부터 아래로 갈수록 랭크가 높은 자료형이다. 기준은 각 자료형이 가질 수 있는 값의 범위다.
형 변환
자바의 숫자 자료형들은 위에서 배운 랭크에 따라 형 변환이 가능하다.
to / from | byte | short | int | long | float | double |
byte | - | X | X | X | X | X |
short | O | - | X | X | X | X |
int | O | O | - | X | X | X |
long | O | O | O | - | X | X |
float | O | O | O | O | - | X |
double | O | O | O | O | O | - |
바꾸고자 하는 형(to)이 기존의 형(from)보다 넓은 데이터를 담을 수 있는 자료형일 경우 특별한 처리 없이 형을 변환할 수 있다.
int a = 36;
double b = a; // int to double
short c = 17;
long d = c; // short to long
float e = 3.14f;
double f = e; // float to double
타입 캐스팅(Type Casting)
값(혹은 변수) 앞에 (자료형) (예: (int) x)을 적어주면 강제적으로 형을 변환시킬 수 있다. 물론 형 변환이 가능한 경우에 대해서만 가능하다. 숫자 자료형들 사이에서는 모두 가능하다.
int a = 3;
double b = (double) a;
long c = (long) a;
System.out.println(b);
System.out.println(c);
3.0
3
더 큰 랭크의 값을 더 작을 랭크의 변수에 담는 것도 가능하지만, 데이터의 손실이 있다는 걸 주의해야 한다.
double pi = 3.14;
int myInt = (int) pi; // 데이터 손실 (소수 부분)
System.out.println(myInt);
3
또 다른 예시를 보자.
int a = 9, b = 5;
System.out.println(a / b);
1
이렇게 정수값 a와 b가 주어졌을 때, 9 / 5를 하면 1이 나온다. 여기서 1.8이 나오게 하고 싶으면 타입 캐스팅을 해서 9를 9.0으로 바꿔주고, 9.0 / 5를 계산하면 된다.
int a = 9, b = 5;
System.out.println((double) a / b);
1.8
형 변환은 나중에 배울 클래스, 상속 등의 개념에서도 등장한다. 그 때도 숫자형의 형 변환 처럼 방향성이 중요한 역할을 하니, 형 변환은 잘 기억해두자!
'~2023.02 > Java' 카테고리의 다른 글
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 설계하기 (0) | 2021.12.30 |
---|---|
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 만들기 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 배열 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 조건문과 반복문 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ Hello, Java! (0) | 2021.12.25 |