국비학원 2일차 : 자료형, 형변환, 입출력, 배열

Digeut·2023년 2월 23일
0

국비학원

목록 보기
2/44

3. 자료형

실수타입

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"; 
//실제 데이터 값은 메모리 주소다. 대문자로 시작하는건 메모리 주소를 가진다.

4. 형변환

물리적으로 용량이 작은 상자를 용량이 큰 상자에 넣는건 불가능하다.
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; //타입을 명시해줘야 한다.

5. 입출력

입력은 출력에 비해서 사용도가 낮다.

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);

6. 배열

같은 타입의 변수가 나열 된 형태
배열은 생성해서 사용한다 (참조 변수 / 배열은 기본형 데이터가 아니다)
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]의 값도 바뀌어서 출력된다.
profile
개발자가 될 거야!

0개의 댓글