자바 언어의 특징
- 운영체제 독립적인 언어이다.
- Java 소스코드는 컴파일러를 통해 Java bytecode로 변환 후 JVM(Java Virtual Machine)이라는 가상 머신을 통해 각 OS에 맞게 기계어로 변환시켜준다.
- 객체지향 언어이다.
- 카비지 컬렉터(Garbage Collector : GC)
- 더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제함.
변수와 자료형
변수
변수란 변하는 값을 저장할 수 있는 메모리의 공간을 의미한다.
음식을 담기 전에 그릇을 준비하는 것처럼 값을 저장하기 위해서는 미리 변수 즉, 메모리의 공간을 준비해야 한다.
이것을 변수의 선언이라고 한다.
변수의 선언
변수의 선언은 변수 타입과 변수 이름으로 구성된다.
public class Declaration{
public static void main(String[] args){
byte age; //단순 변수 선언
doulbe height = 180.5; //선언과 동시에 값의 할당
int number, count; //동일한 타입의 변수를 한꺼번에 선언
char c1 = 'a', c2 = 'b'; //동일한 타입의 변수에 대한 선언과 할당
//int price, double weight; //다른 타입의 변수는 같이 선언 불가능
}
}
JVM은 위 코드를 읽으면서 byte 타입을 인지하고 이에 적합한 공간을 메모리에 할당한다.
할당된 메모리는 특정 주소값을 갖게 되며, 이 주소를 나타내는 변수명으로 age를 이용하게 된다.
이제 age라는 변수명으로 1byte의 메모리 공간에 접근할 수 있다.
자료형
구분 | 1byte | 2byte | 4byte | 8byte |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
정수형
정수형 숫자는 byte, short, int, long으로 구성되며 기본형은 int 타입이다.
정수를 byte나 int 등 int보다 작은 타입의 변수에 할당할 경우는 자동으로 해당 타입으로 변경된다.
이를 묵시적 형변환이라고 한다. 따라서 타입의 범위를 넘어가는 값은 할당할 수 없다.
byte b = 10;
//byte b2 = 128; //Type mismatch cannot convert from int to byte
long long1 = 10;
//long long2 = 100_000_000;
//The literal 100000000 of type int is out of range
long long3 = 100_000_000L;
int 타입으로표현 가능한 값의 범위는 -2^31 ~ 2^31 -1이다.
따라서 이 범위보다 큰 수는 사용할 수 없고 만약 범위를 벗어나는 숫자를 사용하려면 long 타입을 사용해야 한다.
long 타입임을 표시하기 위해서는 숫자 뒤네 L 또는 l을 붙여주면 된다.
실수형
실수형을 나타내는 타입은 float과 double이 있다.
기본형은 double이므로 아무 표현 없이 실수를 사용했다면 double 타입의 자료를 사용한 것이다.
float 타입 변수에 실수를 할당할 떄에는 실수값 뒤에 별도로 f 또는 F를 추가해야 한다.
float height = 180.5f;
double income = 3.0e2; //3.0 * 100 = 300
float과 double의 차이는 물론 값의 표현 범위도 있지만 정확도에 있다.
float는 소수점 이하 9번째 자리에서 반올림해서 8자리까지 표현한다. 반면 double은 소수점 이하 18번째 자리에서 반올림해서 17자리까지 표현한다.
double은 float보다 두 배 정도 더 정밀한 값을 표현할 수 있다.
형변환(Type casting)
형변환이란 값의 형을 다른 형으로 변환하는 것을 말한다.
일반적으로 형변환을 기본형은 기본형끼리, 참조형은 참조형끼리 가능하다.
기본형과 참조형 사이의 형변환을 위해서는 Wrapper 클래스가 사용되는데, Wrapper 클래스에 대해서는 11장에서 다룬다.
형변환 연산자
값의 형을 바꾸기 위해서는 형변환 연산자를 사용한다. 형변환 연산자는 소괄호를 사용하며 소괄호 내부에 변환하려는 자료형을 입력하면 된다.
double d = 100.5;
int res = (int)d;
d는 실수형이므로 소숫점과 소수점 이하의 숫자를 포함하고 있다.
하지만 int는 정수이므로 소수점과 소수점 이하의 숫자를 표현할 수 없다. 이때 변수 d를 형변환 연산자 (int)를 잉해 int 타입으로 변경하면 형변환 연산 과정에서 소수점 이하가 손실되고 변수 res에 할당된 값은 100이 된다.
형변환의 종류
형변환은 묵시적 형변환과 명시적 형변환으로 나뉜다.
묵시적 형변환은 별도의 형변환 연산자를 사용하지 않아도 자동으로 이뤄진다. 반면 명시적 형변환은 반드시 형변환 연산자를 사용해야 한다.
이 두방식의 차이는 값의 이동 방향에 따른 표현 가능 범위의 변화에 있다. 변환하려는 자료형이 감당할 수 있는 범위에 있다면 묵시적 형변환을 사용할 수 있다.
byte b = 10;
//둘 다 가능하다.
int i1 = (int)b;
int i2 = b;
int i1 = 10;
//byte b1 = i1; //Type mismatch: cannot convert from int to byte
byte b2 = (byte)i1;
long l1= 100;
float f1 = l1;
long l2 = (long)f1;
byte b1 = 10;
char c1 = (char)b1;
다만, char형의 묵시적 형변환은 고려할 문제가 있는데 바로 부호이다.
char는 2byte의 크기를 갖지만, 부호가 없기 떄문에 양수만 존재한다. 따라서 음수의 측면에서 byte보다 표현 할 수 있는 범위가 작다.
따라서 byte나 short가 비록 bit 수는 작거나 같지만 char로 묵시적 형변환은 진행 될 수 없다.
자료형에 따른 출력과 입력
자바에서는 입력과 추렭을 위해서는 스트립(stream)을 사용하는데 스트림은 데이터 흐르는 관이라고 볼 수 있다.
키보드에서 입력한 값을 프로그램으로 가져오는 스트림을 입력 스트림이라고 한다. 입력 스트림을 사용하기 위해서는 System.in을 사용한다.
프로그램에서 콘솔로 출력하기 위해서는 출력 스트림이 사용되며, 대표적인 출력 스트림으로는 System.out이 사용된다.
포맷 문자열을 이용한 문자열과 기본형 출력
PrintStream의 출력 관련 메서드
메서드 명 | 선언부와 설명 |
print() | public void print(Object obj) |
obj를 콘솔에 출력한다. | |
println() | public void println(Object x) |
x를 콘솔에 출력하고 줄바꿈을 한다. | |
printf() | public PrintStream printf(String format, Object ... args) |
지시자로 구성된 format에 의거해서 args를 콘솔에 출력한다. |
포맷 문자열을 구성하는 지시자
지시자 | 설명 |
%b | 논리값(boolean) |
%d | 10진수 정수(decimal integer) |
%o | 8진수(octal) |
%x, %X | 16진수(hexadecimal) |
%f | 10진수 실수(decimal float) |
%e, %E | 지수형태 표현(exponent) |
%c | 문자(character) |
%s | 문자열(string) |
%n | 줄 바꿈(개행 문자) |
Scanner을 이용한 입력
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
'java' 카테고리의 다른 글
Java_Chapter08_객체 지향 4대 요소 (0) | 2022.10.09 |
---|---|
Java_Chapter?_builder pattern (0) | 2022.10.06 |
Java_Chapter07_클래스의 관계 (0) | 2022.09.15 |
Java_Chapter06_클래스와 객체 (0) | 2022.09.14 |
Java_Chapter05_배열 (0) | 2022.09.06 |