float (1.4 10^-45 ~ 3.4 10^38) (4 byte)
double (4.9 10^-324 ~ 1.8 10^308) (8 byte) 정도의 크기를 갖는다
float은 일부는 실수, 일부는 정수의 형태로 저장된다.
//리터럴 상수는 double 타입의 데이터이므로
//float의 형태로 바꿀시 F를 붙여서 입력해준다.
float float1 = 3.14F;
//만약 붙이지 않으면
float float1 = 3.14; //타입 미스매치 오류
float 타입은 소수점 6번째자리
double 타입은 소수점 15번째자리에서 오차가 발생한다 (이 이후로는 반올림을 함)
char (0 ~ 65,535)정도의 크기를 갖는다
short과 달리 부호를 갖지 않아서 양수의 크기를 갖는다.
문자가 아닌 '단어' 하나를 저장할 수 있는 공간이다.
char char1 = 'a';
char char2 = 97; //아스키 코드 영소문자 시작이 97
//char은 음수의 값을 가질 수 없다.
boolean (false(0), true(1)의 크기를 갖는다)
boolean boolean1 = true;
boolean1 = false;
boolean을 반환하는 데이터명 적을때는 ~is , ~has 로 데이터명 지정한다
단순 true false 값을 반환할때에는 flag 로 데이터명 지정한다
기본 데이터 타입이 아닌 메모리 주소를 참조하는 데이터 타입
시작하는 객체 데이터 또는 배열이 어디서부터 시작하는지를 참조한다.
기본 데이터 타입과는 다르게 시작은 대문자로 시작한다
Class
String //문자열(문자의 배열) 담을 수 있는 참조형 데이터 타입
String string1 = "This is Comment";
//실제 데이터 값은 메모리 주소다. 대문자로 시작하는건 메모리 주소를 가진다.
물리적으로 용량이 작은 상자를 용량이 큰 상자에 넣는건 불가능하다.
float(8byte)타입에 double(8byte)을 넣을 수 없다.
값이 모두 1로 동일하다고 하더라도, 타입이 다른 경우 차지하는 비트의 크기가 다르기 때문에 들어갈수 없다.
차지하는 범위가 작은 데이터타입은 범위가 큰 데이터타입으로 자동 변환된다.
short short2 = 1; //(2 byte)
int int2 = short2; //(4 byte)
char char3 = 1 ; //(2 byte)
short2 = char3; //(2 byte) //이 둘은 크기가 같아도 오류가 뜨게 된다.
//byte만 아니라 표현하는 "방식"까지 생각해야 한다.
//short는 부호부가 있는 형태이고 char은 부호부가 없는 형태
//short는 음수까지 받을수 있지만 char은 음수를 받을수 없다.
//범위 자체도 short는 양수값이 0 ~30000대이고
//char은 0~60000대이다. (범위적 문제로 들어가지 못한다)
float float3 = 3.14F; (4 byte) (1.4 10^-45 ~ 3.4 10^38)
int2 = float3; (4 byte) (-2,147,483,648 ~ 2,147,483,647)
//이것 또한 범위적 문제로 들어가지 않는다.
범위가 큰 데이터 타입을 범위가 작은 데이터 타입으로 대입 시에는 형 변환을 명시해야 한다.
강제 형변환 시에는 overflow(범위초과)가 발생 할 수 있다.
short2 = (short) int2; //타입을 명시해줘야 한다.
입력은 출력에 비해서 사용도가 낮다.
console을 통해서 개발자로부터 데이터를 입력 받을때 Scanner 객체를 사용한다.
console로 데이터를 출력할땐 System 객체를 사용한다.
//System.out.println(출력하고자 하는 변수 혹은 상수);
// sysout 단축키로 바로 작성 가능
String comment = "이것은 변수에 저장된 문자열입니다.";
System.out.println("이것을 리터럴 상수 문자열입니다.");
System.out.println(comment);
//출력 시,
//이것은 리터럴 상수 문자열입니다.
//이것은 변수에 저장된 문자열입니다.
//System.out.println(변수 혹은 상수); //변수 혹은 상수 자리에 어떤 데이터타입이 와도 됨
float float1 = 1.111111113333F;
//float은 소수점 6번째자리까지만 맞고 뒤로는 오차발생 (반올림하는듯)
System.out.println(float1); //출력시 1.111112로 출력
Scanner 클래스를 이용한다. (참조형 데이터 타입 : 메모리 주소를 가진다)
Scanner scanner = new Scanner(System.in); //스캐너 클래스 이용
//클래스 구역 위에 import java.util.Scanner; 하면 사용가능
//이클립스에서 scanner입력하고 ctrl 스페이스바 하면 Scanner 클래스 입력되나..?
System.out.println(scanner); //스캐너의 메모리 주소 출력
//Scanner 객체의 .next**();기능(메서드)을 사용해서 입력을 받을 수 있다.
int inputInteger = scanner.nextInt(); //사용자로부터 입력받아 사용
System.out.println("입력 받은 값: ");
System.out.println(inputInteger);
String inputString = scanner.nextLine();
System.out.println("입력한 문자열: ");
System.out.println(inputString);
같은 타입의 변수가 나열 된 형태
배열은 생성해서 사용한다 (참조 변수 / 배열은 기본형 데이터가 아니다)
new 연산자로 생성할 수 있다.
배열은 실제 데이터값이 저장되는게 아니라
데이터 배열이 저장된 첫번째 메모리 주소가 저장된다.
// 선언 방법 : 데이터타입[] 배열명;
// 생성 방법 : 배열명 = new 데이터타입[배열의 길이];
// 초기화 방법 : 배열명[인덱스번호] = 데이터;
//인덱스는 0부터 시작한다. (인덱스는 bit한칸 자체가 아니고 그 사이의 경계)
String[] string1 = new String();
// String는 자주 사용하는 것이므로 매번 이런 식의 작성 안해도 된다
//동일한 그룹의 데이터를 변수로만 선언해서 사용할 때
int score1, score2, score3, score4, score5;
score1 = 90;
score2 = 100;
score3 = 70;
//그냥 변수로만 쓰게되면 이렇게 선언하고 초기화해줘야한다.
//위 방식의 문제점 : 관리가 어려움, 특정 조건에 따른 데이터를 가져오기 힘듦
int[] scores ; //배열 선언
scores = new int[5]; //배열 생성
scores[0] = 90;
scores[1] = 100;
scores[2] = 70;
scores[3] = 80;
scores[4] = 75; //배열 초기화
// 선언과 동시에 생성 및 초기화
// 1. 데이터타입[] 배열명 = new 데이터타입[/*여기서는 배열 길이 지정하지 않는다*/]{요소};
int[] scoreList = new int[] {90, 100, 95};
//객체지향 언어에서는 대부분 new를 배열선언이나 클래스를 객체로 만들때 사용한다
System.out.println(scoreList.length); //출력값 3
// 2. 데이터타입[] 배열명 = {요소1, 요소2, ...};
char[] string = { 'h', 'e', 'l', 'l', 'o' };
System.out.println(string); //출력값 hello
string[0] = 'k';
System.out.println(string[0]); //출력값 k
배열 내에 기본 데이터 값이 아닌 메모리 주소를 가지는 데이터 타입도 들어갈 수 있다.
//선언방법 : 데이터타입[][] 배열명;
//생성 방법 : 배열명 = new 데이터타입[첫번째 배열길이][두번째 배열길이];
// 선언과 동시에 초기화(생성인가..? 초기화 아니고)
// 1. 데이터타입[][] 배열명 = new 데이터타이[][] {{요소11,..},{요소22,...},...};
// 2. 데이터타입[][] 배열명 = {{요소11, ...},{요소22,...},...};
//scoreList = {90, 100, 95}
int[] extraScoreList = scoreList;
System.out.println(extraScoreList);
System.out.println(scoreList); //둘의 메모리주소는 동일하게 나온다
//배열은 같은 방향성을 가지고 같은것을 바라보는 개념.
//그래서 그게 바뀌면.. 같이 바뀌게 된다? ->객체 할때 다시 설명
//값이 동일하게 바뀌는거 방지하는 방법 : 배열복사
//(-> 한 배열을 바꾸더라도 다른 배열은 바뀌지 않는다)
extraScoreList[0] = 70;
System.out.println(scoreList[0]); //extraScoreList[0]의 값만 바꿨는데도
//ScoreList[0]의 값도 바뀌어서 출력된다.