9/16 3-1일차(참조형,Typecasting,EscapeChar)
1.참조 자료형
String 형 : 참조형 -기본 자료형이 아님 , 문자열을 저장할 수 있는 데이터 타입!
**기본 참고사항 **
자바에서는 ""이걸로 문자열을 나타냄
+는 숫자 연산에서는 더하기지만 문자열에서는 문자를 연결할 때 사용
문자열 + 숫자는 문자열
//1.1 참조형과 기본 자료형 사이에 항변환 불가
int number; //변수선언 (기본자료형이군)
number = 99; //변수 초기화
// String strNumber = (String)number; 이거 불가
// int initNum = (int)"100"; 이거도 불가 왜? ""안에 들어간 것은 문자열!
//2.1 문자열+숫자
String strNumber = "100";
Sysem.out.println("2.1,"+strNumber+number); // 문자열 +숫자 = 문자열 즉 "100"+ 99 = "10099"
//2.2 new 연산자를 사용해서 문자열 저장
String newString = new String("new 연산자 사용"); // 이거는 아직 몰라도 되지만 이것은 ""안의 내용을 출력 한다는 것
System.out.println("2.2"+newString);
//2.3 기본 자료형처럼 문자열 저장 (new 연산자 미사용)
String strngLikeBasic = "기본 자료형처럼 문자열 저장" // 위에꺼랑 출력은 똑같이 됨! 이건 나중에 배움
System.out.println("2.3"+strngLikeBasic);
//2.4 +가 문자열에 사용될 때는 연결의 의미
Strirng plusString;
plusString = newString + ","+strngLikeBasic;
System.out.println("2.4"+plusString);
int kor=100, eng=100, math=100;
System.out.println("2.4.1"+"총점:"+kor+eng+math); // 문자를 나열한것 밖에 안됨
System.out.println("2.4.2"+"총점:"+(kor+eng+math)); // 괄호를 넣어서 연산처리를 하자
2. 기본자료형 간의 타입변환
// 2.1 자동 형변환
/* 작은 그릇의 데이터를 큰 그릇에 넣을 때 형변환이 자동으로 일어난다.
즉 병 변환 불필요함
*/
byte b1=65;
short s1;
s1=b1; //가능 자동 형 변환됨
System.out.println("2.1.1 "+"b1은"+b1+" ,s1은"+s1);
int num1=s1+b1; // 참고로 이건 자동 항변환이 아님! s1+b1의 연산결과가 이미 int형 이기 때문
char ch1 = 65; //'A'의 코드값 저장 (상수 65를 코드값으로 처리한다)
// char ch2 = b1; //안됨 이건 항 변환을 해야한다 왜? char는 부호가 없고byte 부호가 있음 즉 그릇의 구조가 다름
char ch2 = (char)b1;
System.out.println("2.1.2 "+"ch2="+ch2);
//2.2 강제적 형변환
/* 큰 그릇의 데이터를 작은 그릇에 쑤셔담을 때 해당
캐스팅 연산자를 사용한다 : (자료형) ex) 변수앞에 (byte) 요거 붙인다고
데이터 손실이 일어날 수 있음
*/
//2.2.1 데이터 손실이 안 일어나는 경우 : 강제변환을 해도 충분히 담을 수 있음
short s2 = 100;
// byte b2 = s2; 안됨 short > byte short는 byte그릇에 못담아
byte b2 = (byte)s2; //강제적 형변환
System.out.println("2.2.1 "+"[데이터 미 손실]s2는 "+s2+" b2는 "+b2);
//2.2.2 데이터 손실이 일어나는 경우
int num3 = 300;
// b2 = num3 안됨 int를 어떻게 byte에 넣냐
b2 = (byte)num3;
System.out.println("2.2.2 "+"[데이터 손실]b2는 "+b2+" num3는 "+num3); // 그릇에 내용물이 넘쳐흐르는 경우임
// 해보자
double dl = 3.14;
// int num4 = num3+dl; 안됨 num3+dl 의 연산값이 double임
double dl2 = num3 + dl; //[방법1] double형에 담는다.(항변환 하지 않음)
int num4 = (int)(num3+dl); //[방법2] 연산결과 전체를 int형으로 형 변환 한다.
num4 = num3+(int)dl; //[방법3] double형만 int형으로 형 변환
3. Escape문자 EscapeChar
/* Escape 문자란 특정 기능에 맞게 출력하기 위해 쓰이는 문자로 특정문자 앞에 \을 붙이면 그 특수한 기능을 하게 됨
*** 주의사항 ***
Escape 문자는 모든 ""안에서 사용할 수 있다
Escape 문자는 모두 소문자여야 한다
ex) "HitHomeRun" 여기서 t는 일반 문자임
"Hi\tHomeRun" 여기서 t는 \와 결합하여 tab만큼 띄어쓰는 기능을 하는 Escape 문자가 됨.
*/
//ex)
// 1] \t : tab만큼 띄어쓰기
System.out.println("Hit Home-Run");
System.out.println("HI\t Home-Run");
// 2] \n : 줄바꿈(line feed)기능
System.out.print("Welcome To Java!\n");
System.out.print("Hi Java!\n");
System.out.print("Let's Do it,\nGo Fighting!!!\n");
// 3] \r :커서를 해당 줄에서 맨 처음으로(carrige return)
System.out.println("My Nickname is Superman\rXX");
/* ****암기
키보드의 A라고 치면 65(A의 아스키 코드값)라는 값이 저장됨
키보드로 엔터를 치면 13과 10이 저장됨
13은 \r의 아스키 코드값
10은 \n의 아스키 코드값
따라서 엔터키는 \r\n 이다
*/
// 4] \' : single quotation 표시, 문자열을 ''으로 감싸도 여기서는 딱히 의미가 없음. 되는곳만 적용
System.out.println("나의 닉네임은'스마트 보이'입니다");
System.out.println("나의 닉네임은\'스마트 보이\'입니다");
// 5] \" :요놈의 의미는 문자열의 시작/끝을 의미하는 문자가 아님을 알려줌
System.out.println("나의 닉네임은\"스마트 보이\"입니다");
// 6] \\ : 뒤에 \은 이스케이프 문자 역할을 하는 특수문자가 아니라는 것을 알려줌 즉 원화표시 그대로 나오게 함
System.out.println("D:\nDrive\table");
System.out.println("D:\\nDrive\\table");
/* ****참고사항****
Format String : 출력형식을 지정하기 위한 형식 문자열
%s나 %d등의 변환 지시어(Conversion Specifier)를 사용해 원하는 출력 형식을 만들 수있다.
※변환지시어를 쓸 수는 메소드가 정해져 있다
[주요 변환 지시어]
%d :정수값 출력시(byte/short/int/long)
%f :실수값 출력시(float/double)
%c:한 문자 출력시(char)
%b:boolean형 출력시
%s:문자열 출력시
%n:줄바꿈 (\r\n도 가능)
%%: %리터럴을 의미
*/
// 해보자
int kor = 99, eng = 80, math = 96;
double avg = (kor+eng+math)/3.0;
System.out.println("형식문자열 미사용") ;
System.out.println("국어:"+kor+" ,영어:"+eng+" ,수학:"+math+" ,평균:"+avg);
System.out.println("형식문자열 사용") ;
// printf("형식문자열",값들을 콤마로 구분해서 나열.단,printf는 줄바꿈 기능이 없다 즉 (" ",) 요런형태임
System.out.printf("국어:%d,영어:%d,수학:%d,평균:%.14f%n",kor,eng,math,avg);
// ' %.숫자f ' 이거는 소수점자리 어디까지 나타 낼 건지 정하는거래!
System.out.printf("국어:%d\t영어:%d\t수학:%d\t평균:%.14f\r\n",kor,eng,math,avg);
/* *** 참고사항2 ****
형식문자열에서 데이타 출력시 자릿수 지정
예] %숫자d
%4c : 한문자를 출력하는 데 전체 자리수는 4
%5d: 정수 숫자를 출력하는 데 전체 자리수는 5
%6.2f%:실수를 출력하는데 전체 자리수는 6(소수점포함), 소수점 둘째자리까지만 출력
자릿수 지정시 값을 기본 오른쪽부터 채움(양수일때) -를 붙이면 왼쪽부터 채움
*/
//해보자
System.out.println("[출력 자리수 미지정]");
System.out.printf("국어:%d,영어:%d,수학:%d,평균,%f%n",kor,eng,math,avg);
System.out.println("[출력 자리수 지정(양수)]");
System.out.printf("국어:%4d,영어:%4d,수학:%4d,평균,%6.2f%n",kor,eng,math,avg);
System.out.println("[출력 자리수 지정(음수)]");
System.out.printf("국어:%-4d,영어:%-4d,수학:%-4d,평균,%-6.2f%n",kor,eng,math,avg);
//기타
System.out.printf("%c%b%.2f%s%n",'가',false,3.145678,"문자열");
// 모든 값을 %s로 출력해도 된다
System.out.printf("%s%s%s%s%n",'가',false,3.145678,"문자열");
// 이건 과제
System.out.println("==============================================");
System.out.format("%-8s%-7s%-7s%-8s%-9s%s%n","NAME","KOR","ENG","MATH","TOTAL","AVG");
System.out.println("==============================================");
double totalH = 98+99+67;
double avgH =totalH/3;
System.out.format("%-8s%-7d%-7d%-8d%-9.2f%.2f%n","HONG",98,99,67,totalH,avgH);
double totalK = 99+99+99;
double avgK = 99;
System.out.format("%-8s%-7d%-7d%-8d%-9.2f%.2f%n","KIM",99,99,99,totalK,avgK);
double totalP = 56+78+45;
double avgP = totalP/3;
System.out.format("%-8s%-7d%-7d%-8d%-9.2f%.2f%n","HONG",56,78,45,totalP,avgP);
System.out.println("==============================================");