학원/JAVA

9/16 3-1일차(참조형,Typecasting,EscapeChar)

도원결의 2022. 9. 17. 18:10

[Do it! 자바 완전 정복] 목차 참고

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("==============================================");