Java 정리 02
14 Nov 2018
Reading time ~6 minutes
Java 정리 02 - 데이터형, 연산자
데이터형 (Data Type)
- 값을 저장하기 위해 미리 예약해놓은 공간들
- 변수를 선언할 때 사용
- 기본형 데이터형, 참조형 데이터형 2가지
- 기본현 데이터형 (Primitive Data Type)
- 변수에 값 자체를 저장하는 데이터형
- 참조형 데이터형 (Reference Data Type)
- 변수에 객체의 주소를 저장하는 데이터형
- 기본현 데이터형 (Primitive Data Type)
기본형 데이터형 (Primitive Data Type)
- 변수에 값이 저장되는 데이터형
- Signed - 수의 범위가 음수, 양수를 가짐
- Unsigned - 수의 범위가 양수만 가짐 (char, boolean)
- 정수는 주로 int 사용
- 실수는 주로 double 사용
- 아스키코드 영소문자 시작 코드값은 알아야함
- ‘A’ - 65
- ‘a’ - 97
- ‘0’ - 48
- 좌측 alt + 우측 키패드로 코드값입력하면 아스키코드 문자입력됨
- Literal
- long에 30억을 할당할 때 30억이란 값은 정수 상수
- 할당안되고 에러발생
- 리터럴 크기를 변경하는 형명시를 하면 할당 됨
- 상수가 메모리에 저장될 때 그 저장 공간을 literal 이라고 함
- 리터럴은 정해진 크기가 있다.
- 정수 - 4byte
- 실수 - 8byte
- 리터럴의 크기를 변경하고 싶을 때 형명시를 사용
- long에 30억을 할당할 때 30억이란 값은 정수 상수
// 30억의 정수 리터럴은 4byte
// => 30억 정수상수를 담기위해선 8byte 리터럴이 필요
// 정수상수 뒤에 l, L을 붙임
long l = 3000000000l;
// 0.5란 실수 리터럴은 8byte
// => float은 4byte이므로 8byte를 4byte로 줄여야 함
// 실수상수 뒤에 f, F를 붙임
float f = 0.5f;
/*
기본형 데이터형(Primitive DataType)
정수형 : byte, short, int, long
실수형 : float, double
문자형 : char
논리형 : boolean
*/
class PrimitiveDataType {
public static void main(String[] args) {
// 정수형
byte b = 10;
short s = 20;
int i = 30;
// 할당되는 값이 4byte내 이므로 literal을 변환할 필요가 없다.
long l = 40;
b = -128; // byte : -128 ~ +127
// 정수 literal은 4byte
// 저장하려는 값은 8byte가 필요한 값이므로
// literal의 크기를 변경(형명시),
// 정수상수 뒤에 l이나 L을 붙인다
long l2 = 2147483648L;
System.out.println("byte : " + b + ", short : "
+ s + ", int : " + i + ", long : " + l +
", long2 : " + l2);
/*
0 - 정수상수
'0' - 문자상수
"0" - 문자열상수
*/
// 문자형 : unicode 값 : \u0000
// 할당은 unicode가 됨
// char c = 'A';
// char c2 = '0';
// char c3 = '가';
// 유니코드값을 바로 할당해도 같은 결과 출력
char c = 65;
char c2 = 48;
char c3 = 44032;
// 출력은 unicode에 대한 문자가 출력됨
System.out.println("char : " + c +", " + c2 + ", " + c3);
// 실수형
// float형은 4byte, 3.14란 실수 리터럴은 8byte
// float형에 8byte 실수 리터럴을 담기위해
// f 또는 F를 실수리터럴 뒤에 붙여 형명시
float f = 3.14F;
// double은 literal과 datatype의 크기가 같으므로
// 형명시를 생략할 수 있다. (d, D)
double d = 3.14;
double d2 = 3.14D;
System.out.println("float : " + f + ", double : "
+ d + ", double2 : " + d2);
// 불린형
boolean tu = true;
boolean fa = false;
// tu = 0; boolean은 true, false만 담을 수 있다.
// c처럼 1, 0을 사용하지 않는다.
System.out.println("boolean : " + tu + ", boolean : " + fa);
}// main
}// class
자동형변환
byte b = 10; // byte 타입은 1byte를 넣을 수 있고 정수 literal은 4byte.
// 할당 안돼야 정상인데??
short s = 10; // short 타입은 2byte 얘한테도 할당안돼야 하는데??
// but, 자동형변환 때문에 가능
byte b1 = 10, b2 = 20, result = 0;
// error! - 자동형변환 때문에 에러발생
result = b1 + b2;
// byte와 byte 연산되고선 결과가 int로 발생
// result를 int형 변수로 선언해서 해결
- int의 하위 데이터형 (byte, short, char)이 연산되면 결과가 int로 발생되는 것
- int의 하위 데이터형에 값이 할당되면 값이 하위 데이터형의 크기에 맞게 변환되는 것
byte b = 10;
short s = 20;
// b가 short타입으로 자동형변환 후 연산, 연산결과는 int
int i = b + c;
// 작은바이트타입과 큰바이트타입이 연산되면 작은바이트타입이
// 큰바이트타입으로 형변환 후 연산
// byte + byte = int
// byte + short = int , byte가 short으로 형변환된 후 연산
// int + int = int
// int + long = long , int가 long으로 형변환된 후 연산
// char + char = int
강제형변환 (Casting)
- 개발자가 변수의 데이터형을 원하는 형으로 변환하는 것
- 기본형 -> 기본형, 참조형 -> 참조형
- 형이 다르면 강제형변환 할 수 없다
- boolean은 동일데이터형으로만 강제형변환가능
- 값 손실이 발생할 수 있다.
// (변환할데이터형)변수명;
double d = 3.14;
// float f = dl; error!
float f = (float)d;
float f = 23;
int i = (int)f;
// 강제형변환 하면 literal 크기를 변경하는 형명시 안해도 됨
float f2 = (float)3.1415;
/*
강제형변환 (Casting)
- 변수의 데이터형을 일시적으로 변환하여 사용하는 것
*/
class UseCasting{
public static void main(String[] args) {
byte b1=10, b2=20; // 자동형변환
// 연산의 결과를 int로 자동형변환, error!
// byte result = b1+b2;
// 강제형변환!
// 가로는 +보다 연산의 우선순위가 빠름
// 때문에 연산을 먼저 묶음
byte result = (byte)(b1+b2);
System.out.println(b1 + " + " + b2 + " = " + result);
double d = 11.14;
float f = (float)d;
System.out.println("double : " + d + ", float : " + f);
// 상수에 사용가능, literal 자체는 바뀌지 않음
float f1 = (float)2018.11;
System.out.println("float : " + f1);
// error!
// 상수값이 literal보다 크면 casting을 실행하기 전에 error 발생
// long l = (long)2147483648;
// int와 float은 byte 수는 같아도 값을 담는 형태가 달라 할당 안됨
// 값손실 발생(실수부의 값이 모두 사라져 할당)
int i = (int)f1;
System.out.println("int : " + i + ", float : " + f1);
char c = 'A';
System.out.println(c + "의 unicode(ASCII code)값 " + (int)c);
// 형이(기본형 <-> 참조형) 다르면 강제형변환이 되지 않는다.
// error!
String str = "11"; // String은 참조형 데이터타입
int i2 = str; // int는 기본형 데이터타입
// boolean형은 boolean형 끼리만 변환가능
// error!
// boolean b=true;
// int i3=(int)b;
boolean b = true;
boolean b3 = (boolean)b; // 의미없는 강제형변환..
System.out.println("boolean : " + b3);
}// main
}// class
// 정수는 그냥 int로 변수를 생성하면 걱정없음..
// 메모리 마구마구 쓰세요~
// 메모리를 절약하기 위해 형변환을 여러번 하는 것보다
// int로 연산하는게 더 빠르다!
Constant (상수)
- 변수를 상수처럼 사용하기
- 값 할당이 되지않는 변수
- 프로그램 내에서 사용하게 될 기준값을 설정할 때 사용
- API의 field 항목에서 확인가능
- class의 field에서만 정의가능
- 최초 선언시에만 값할당이 가능
- constant명은 모두 대문자로 작성(‘_‘사용가능)
// 작성법
public static final 데이터형 상수명 = 값;
// 사용법
// 정의한 클래스안에서 사용
// - 상수명 또는 클래스명.상수명
// 다른 클래스에 있는 상수
// - 클래스명.상수명
// '.'은 그 안을 의미.. ex) 내.너
/*
Constant(변수를 상수처럼 사용하는 것: 상수)의 사용
선언 : class field에서만 선언
*/
class Constant {
// Constant 선언
// 상수는 method내에서 선언할 수 없다
public static final int MAX_SCORE=100;
public static final int MIN_SCORE=0;
public static void main(String[] args) {
// 상수의 사용
System.out.println(MAX_SCORE + " / " + MIN_SCORE);
System.out.println(Constant.MAX_SCORE +
" / " + Constant.MIN_SCORE);
int my_score=83;
// MAX_SCORE=90; 상수는 값할당이 되지 않는다.
System.out.println("점수의 최고점은 "+Constant.MAX_SCORE+
"점이고, 최저점은 :"+Constant.MIN_SCORE+
"입니다. 획득점수는 "+my_score+
"이고, 최고점과 획득점수의 차이는 "+
(MAX_SCORE-my_score)+"입니다.");
}// main
}// class
/*
다른 클래스에 있는 상수를 사용해보기위한 클래스
*/
class UseConstant{
public static void main(String[] args){
// 다른클래스에 존재하는 상수를 참조할 땐
// 클래스명.상수명 의 형식을 가진다
// System.out.println(MAX_SCORE);
System.out.println(Constant.MAX_SCORE+" / "+Constant.MIN_SCORE);
}
}
Java API doc
- Java API doc download
- 설치한 JDK 버전과 동일한 doc을 다운로드
- 자주 볼 수 있도록 세팅
- 좌측 상단이 패키지, 하단이 클래스, 우측이 상세정보
- Wrapper Classes
- Byte, Short, Int, Long, Float, Double
- 기본 데이터형을 객체로 감싸 만든 객체
- 다양한 메소드가 가능해짐(추후 학습)
- Byte, Short, Int, Long, Float, Double
- 패키지 내 클래스 종류에 따라 필드가 있기도 없기도 함
// 클래스 field 사용해보기
System.out.println("long의 최댓값 : "+Long.MAX_VALUE+", long의 최소값 : "+Long.MIN_VALUE);
// 못 외우면 java api doc 찾으면서 사용
연산자 (맛보기)
- 연산에 사용되는 예약된 부호들
- 최단산쉬관리삼대콤마
- 최우선 ()
- 단항 ~,!,+,-,++,–
- 산술 +,-,*,/,%
- 쉬프트 <<, >> ,>>>
- 관계 ==, !=, >, >=, <, <=
- 일반논리 : &&, || , 비트논리 : &, |, ^
- 삼항(조건연산) ? :
- 대입 =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, :=, ^=
- 콤마 ,