오늘은 어제에 이어 변수를 배웠다.
자바의 기본 자료형은 8가지가 있고 추가로 문자열 String (참조형)이 있다.
표현식 (메모리 크기)
논리형 : boolean (1byte)
정수형 : byte (1byte) , short (2byte) , int (4byte) , long (8byte)
실수형 : float (4byte) , double (8byte)
문자형 : char (2byte , 유니코드 사용)
표현식 | 1byte | 2byte | 4byte | 8byte |
---|---|---|---|---|
논리형 | boolean | |||
정수형 | byte | short | int | long |
실수형 | float | double | ||
문자형 | char |
변수 선언이란 메모리에 값을 저장할 공간을 할당하는 것을 뜻하며 변수 값 대입은 변수에 값을 집어 넣는 것이다.
또한 자료형에 따라 리터럴 표기법이 다른데 밑에 코딩을 보면서 설명하겠다.
int intNumber = 1234567890;
int는 자료형 / intNumber은 변수명 / 1234567890은 리터럴
long과 같은 자료형의 경우
long longNumber = 10000000000;
이렇게 코드를 작성하면 long이라는 자료형을 사용했음에도 int로 인식해 에러가 뜨는데
long longNumber = 10000000000L;
값의 마지막에 L 또는 l 이라는 리터럴을 붙여주면 long의 자료형으로 인식해서 에러가 사라진다.
위와 같은 예로 float도 코딩을 하면
float floatNumber = 1.2345;
로만 하면 에러가 뜨고 F 나 f를 위처럼 마지막에 붙여서 코딩을 하면 제대로 인식한다.
float floatNumber = 1.2345f;
정수형과 실수형을 알아봤는데 이제 문자형(char)을 알아보자
char의 경우 문자형 리터럴 표기법은 ''(홑따옴표)를 해주고 문자는 하나만 사용 가능하다.
char ch ='A'
char ch2 = '66'
System.out.println("ch : " + ch );
System.out.println("ch2 : " + ch2 );
이렇게 코딩하면 콘솔창엔
ch : A
ch2 : B
라고 나오는데 char 자료형에 숫자가 대입될 수 있는 이유는 컴퓨터엔 문자표가 존재하고 숫자에 따라 정해져 있는 문자가 매핑되어 있으므로 '66'이라는 숫자는 B로 변환되어 출력이 된다.
상수란 JAVA에서는 한번만 저장(기록)할 수 있는 메모리를 의미하는데 쉽게 풀이하면 변하지 않고 항상 같은 수를 뜻한다.
형변환이란 값의 자료형을 변환하는 것! (boolean은 제외한다.)
위와 같은 이유로 형변환을 해서 같은 자료형으로 만든 뒤 연산을 한다.
형변환은 자동 형변환, 강제 형변환이 존재하는데 예시코드와 함께 자동 형변환부터 알아보자.
int num1 = 10;
double num2 = 3.5;
System.out.println("자동 형변환 결과 : " + (num1 + num2));
결과 값은 ( 자동 형변환 결과 : 13.5 )라고 나온다. 원래라면 정수 + 실수로 에러가 발생해야 하지만 실수 + 실수로 자동 형변환이 이루어진 덕분에 발생하지 않고 원하는 결과가 나온것을 볼 수 있다.
강제 형변환은 기존 자료형을 원하는 자료형으로 강제 변환 시키는 것으로 값의 범위가 큰 자료형을 작은 자료형으로 변환하거나 출력되는 데이터의 표기법을 변환시키고 싶을때 사용한다.
강제 형변환 방법
double temp = 3.14;
int num = (int)temp;
단, 강제 형변환 시 데이터의 손실이 발생 할 수 있으므로 데이터의 변형, 손실을 감수하고 강제 변환을 진행해야 한다.
int iNum = 290;
byte bNum = (byte) iNum;
System.out.println(iNum); // 290
System.out.println(bNum); // 34
같은 정수형 끼리의 변환이라도 값의 범위 차이 때문에 데이터 손실이 발생한다.
오버플로우란 결과값이 자료형의 최대값을 벗어나 생기는 오류로 코딩상의 에러는 아니지만 원하는 결과값이 나오지 않는 것으로 컴퓨터는 이 현상을 미리 예측이 불가능하고 개발자가 미리 예측 해야한다.
int i6 = 2147483647; // int의 최대값
int result6 = i6 + 1 ;
System.out.println(result6);
위 코드에서 i6 + 1 은 i6 값이 7에서 8로 올라간다고 생각되지만 주석 뒤 설명대로 이미 int의 값이 양수의 최대값이라 수식이 진행 되었을때 -2147483648 음수로 나타나기 때문에 원하는 결과값을 얻지 못하기에 신경을 써서 코딩을 해야한다.
System.out.print();
위 코드는 단순 출력 (출력 후 줄바꿈 없음)
System.out.println();
print 구문과 동일하게 출력해주지만 출력 후 줄바꿈을 해주는 메소드
줄바꿈이라는 차이는 있지만 괄호안에 내용이 그대로 출력되는 것은 공통점.
System.out.printf();
출력될 문자열 형식을 패턴으로 지정하는 출력구문 (print 구문과 동일하게 출력 후 줄바꿈 없음)
%d -> 정수형
%o -> 8진수
%x -> 16진수
%c -> 문자
%s -> 문자열
%f -> 실수(소수점 아래 6자리)
%e -> 지수형태표현
%g -> 대입값 그대로
%A -> 16진수 실수
%b -> 논리형
System.out.printf("패턴" , 패턴에 들어갈 값);
예를 들어 10 + 5 = 15 라는 출력값을 원한다면
int iNum1 = 10;
int iNum2 = 5;
System.out.printf("%d + %d = %d\n", iNum1 , iNum2 , iNum1+iNum2);
이렇게 코딩하면 출력값이 원하는 대로 나온다.
boolean(%b), 문자(%c), 문자열(%s)으로 사용해보면
boolean isTrue = false;
char ch = '조';
String str = "안녕하세요";
System.out.printf("%b / %c / %s\n" , isTrue , ch , str);
false / 조 / 안녕하세요 라는 출력값이 나온다.
이스케이프 문자는 일반 문자가 아닌 특수문자 표현이다.
System.out.println("\\"); //백슬래시(역슬래시) 출력방법
System.out.println("a\tb\tc\t"); // \t (tab출력) : 한공간씩 표현 X , 한번에 공간차지
System.out.println("\u0041"); //유니코드 이스케이프 , 유니코드 (16진수) , 65 나누기 16은 몫 4 나머지 1
출력값
\
a b c d
A