본문 바로가기

기록/자바_국비

[배운 내용 정리] 1105 자바 국비교육

728x90

2020년 11월 05일 09시 ~ 15시 30분 zoom으로 비대면 강의 진행

자바 국비지원교육 3일차


BufferedReader

 BufferedReader라는 클래스를 사용하려고 하니 빨간 줄이 뜸 이유가 무엇일까

 BufferedReader 클래스의 위치와 내가 작성하는 클래스 파일의 위치가 달라서,

 다른 패키지의 내용을 가져다 쓰기위해서는 import를 이용해 다른 패키지의 내용을 빌려와 사용할 수 있다

package com.Test;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class Variable02 {

             public static void main(String[] args) {

                           //클래스명 변수명 = new 클래스명();

                           Variable02 v = new Variable02();

                           //변수명.메소드();

                           v.inputTest();

             }

             //기능을 담당할 메서드 생성 , java.io 패키지에서 제공되는 클래스들을 이용한 키보드 입력테스트

             public void inputTest() {

                           //현재 위치한 패키지와 다른 패키지에 속한 클래스를 사용할 때 import

                           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

                           //클래스명 변수명 = new 클래스명();

                           //println과 print의 차이는 줄바꿈

                           System.out.print("정수 값 한 개를 입력 : ");

                           try {

                                        String value = br.readLine();
                                        //readLine()을 통해 키보드로 입력받은 값을 받아온다

                                        System.out.println("value : " + value);

                           } catch (IOException e) {

                                        e.printStackTrace();

                           }

             }
}

 

package com.Test;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Scanner;

 

public class Variable02 {

             public static void main(String[] args) {

                           //클래스명 변수명 = new 클래스명();

                           Variable02 v = new Variable02();

                           //변수명.메소드();

                           //v.inputTest();

                          

                           v.inputTest02();

             }

             //기능을 담당할 메서드 생성

             //java.io 패키지에서 제공되는 클래스들을 이용한 키보드 입력테스트

             public void inputTest() {

                           //현재 위치한 패키지와 다른 패키지에 속한 클래스를 사용할 때 import

                           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

                           //클래스명 변수명 = new 클래스명();

                           //println과 print의 차이는 줄바꿈

                           System.out.print("정수 값 한 개를 입력 >> ");

                           try {

                                        String value = br.readLine();

                                        System.out.println("value : " + value);

                           } catch (IOException e) {

                                        e.printStackTrace();

                           }

             }

             public void inputTest02() {

                           //java.util 패키지 Scanner 클래스

                           Scanner sc = new Scanner(System.in);

                          

                           System.out.print("이름 : ");

                           String name = sc.nextLine();//입력한 한 줄에 대한 정보를 읽어온다.

                           System.out.print("나이 : ");

                           int age = sc.nextInt();//정수에 대한 값을 읽어온다.

                           System.out.print("키 : ");

                           double height = sc.nextDouble();//입력한 실수 값을 읽어온다.

                          

                           System.out.println(name + "님은 " + age + "세 이며, 키는 " + height + "cm 입니다.");

                          

             }
}

 

Scanner 사용 방법

 import java.util.Scanner;

 …

 Scanner sc = new Scanner(System.in);

 위의 방식대로 Scanner쓰는 방법 말고도 이렇게도 사용 가능하다!

 java.util.Scanner sc = new java.util.Scanner(System.in);

 

nextLine() 과 next()

 - nextLine은 띄어쓰기를 문자로 인식함

  ex) “안녕하세요 반가워요” <- 입력하고 출력하면 그대로 출력된다.

  nextLine은 공백이 있는 문자열, 긴 문장? 을 입력 받을 때 사용한다.

 - next는 띄어쓰기를 문자로 인식하지 못 함

  ex) “안녕하세요 반가워요” <- 입력하고 출력하면 안녕하세요 가 출력된다

  next()는 간단한 단어를 입력받을 때 사용한다.

 

charAt()

 charAt은 ()안에 들어가는 숫자 순서에 맞는 글자 하나만 읽어와서 문자로 바꾸어 저장한다.

문자열은 순서가 정해진다.

charAt() 메소드 사용 방법

package com.Test;

public class Variable03 {

             public static void main(String[] args) {

                           //클래스명 변수명 = new 클래스명();

                           Variable03 test = new Variable03();

                           test.changeValue();

             }

 

             public void changeValue() {

                           //변수 선언

                           String name;

                           char gender;

                           int age;

                           double height;

                          

                           //변수 초기화

                           name = "햄서터";//문자열은 ""큰따옴표

                           gender = 'M';//문자는 ''작은따옴표

                           age = 29;

                           height = 179;

                          

                           System.out.println(name + " 님의 개인정보");

                           System.out.println("gender : " + gender);

                           System.out.println("age : " + age);

                           System.out.println("height : " + height);

                          

                           //키보드로 입력받아 변수에 저장된 값 변경

                           //아까 Scanner쓰는 방법 말고도 이렇게도 사용 가능하다!

                           java.util.Scanner sc = new java.util.Scanner(System.in);

                          

                           System.out.print("name : ");

                           name = sc.nextLine();

                           //nextLine은 띄어쓰기를 문자로 인식함

                           //nextLine은 공백이 있는 문자열, 긴 문장? 을 입력받을 때 사용한다,

                          

                           System.out.print("gender : ");

                           gender = sc.next().charAt(0);

                           //next는 띄어쓰기를 문자로 인식하지 못 함

                           //next()는 간단한 단어를 입력받을 때 사용한다.

                           //charAt ->

                           //문자열은 순서가 매겨져있다 charAt은 ()안에 들어가는 숫자 순서에 맞는 글자 하나만 읽어와 문자로 바꾸는것

                          

                           System.out.print("age : ");

                           age = sc.nextInt();

                          

                           System.out.print("height : ");

                           height = sc.nextDouble();

                          

                           System.out.println(name + " 님의 개인정보");

                           System.out.println("gender : " + gender);

                           System.out.println("age : " + age);

                           System.out.println("height : " + height);

                          

             }
}

문자열

 단어나 문장 , “”이 있으면 문자열로 인식

 java에서는 String 객체를 이용해 문자열을 저장한다.

 

문자열 초기화

 String str = “asd”;

 String str = new String(“기차”);

 String str = “기차” + “칙칙폭폭”;

 String str = new String(“abc” + “def”);

 String str = “기차” + 123 + 45 + “출발”;

“” + 숫자는 -> 문자열 연산이 된다 -> 기차12345출발

 String str = 123 + 45 + “기차” + “출발”;
  숫자+숫자 연산이라 168+문자열연산 -> 168기차출발

숫자+숫자 연산이 먼저 만나 168이 먼저 연산이 되고, 숫자+문자열이 만나

“숫자”+문자열 형태가 되어 숫자를 문자열 취급하여 최종적으로 결과가 문자열로 나옴

 

다른 자료형과 문자열이 + 연산자로 연산하게 될 경우 다른 자료형이 문자열로 바뀌게 된다

ex) “age : ” + 20  ->  “age : ” + “20”  -> “age : 20”

문자열 + 다른자료형 -> 문자열 + 문자열 (다른 자료형이 문자열로 변함) -> 최종 연산 결과 : 문자열

 

데이터 오버플로우

 각 데이터는 저장 공간이 제한 되어있는데 그 제한된 공간 이상의 비트를 침범하게 될 때 값이 최소값으로 변경되는 경우를 오버플로우라고 말한다.

 ex) byte b = 127;

     b += 1; 하면 결과가 -128이 된다.

     제한된 공간 = 정해진 비트 01111111(127) 에서 +1 을 하면

10000000(-128) 최소값으로 변하게된다.

 

형변환(casting)

컴퓨터의 값 처리 원칙

 - 같은 종류의 자료형만 대입 가능

 - 같은 종류 자료형만 계산 가능

 - 계산의 결과도 같은 종류의 값이 나와야 함

 이러한 원칙이 지켜지지 않은 경우에 형 변환이 필요함

 

위에서 다룬 문자열과 다른 종류의 데이터를 연산한 경우가 형변환의 예시

 형변환에는 자동형변환, 강제형변환 두 종류가 있다

 

자동 형변환(묵시적 형변환, upcasting)

 연산시 컴파일러가 자동으로 형을 변환하는 것을 의미한다.

 ex)

 int a = 12;

  double d = 3.3;

  double result = a + d;  //result->15.3

단, byte와 short 자료형 값의 계산 결과는 무조건 int로 처리한다

byte와 short연산

 byte bnum = 10, bnum2 = 20;

 byte result = bnum + bnum2;

//에러난다. 바이트+바이트 연산 결과가 int 형이기 때문에 int보다 저장공간이 작은 byte 타입으로 저장할 수 없다.

 

 int result = bnum + bnum2;         //이건 가능

 byte result = (byte) (bnum + bnum2); //얘도 가능

 //int형으로 나온 bnum+bnum2의 결과를 byte형으로 강제로 변환시키기 때문에

 

강제 형변환(명시적 형변환, downcasting)

 데이터가 큰 자료형에서 작은 자료형으로 변경하는 경우를 말하고,

데이터 손실이 있을 수 있어 유의해야 한다

ex)

double temp;

int name = (int)temp; //빨간색이 강제형변환

//double 타입의 데이터를 int 타입으로 강제로 변환시킨다.

강제형변환의 데이터 손실

변수와 메모리 구조

 - static

  static 예약어로 선정된 필드, 메소드가 저장되는 공간 (클래스변수 등)

 - hip

  new 연산자에 의해 동적으로 할당하고 저장되는 공간 (객체, 배열 등)

- stack

  메소드를 호출하면 자동으로 생기고, 메소드가 끝나면 자동으로 소멸

  (지역변수, 매개변수, 메소드 호출 스택, 기본 자료형)

 

변수와 메모리 구조

출력 메소드

 - System.out.print()

  ()안의 변수, 문자, 숫자, 논리 값을 모니터에 출력

 - System.out.println()

  print문과 동일하게 출력해주지만 출력후에 자동으로 줄바꿈을 해주는 메소드이다.

 - System.out.printf(“%형식”, 변수 등)

  정해져 있는 형식에 맞춰서 그 형식에 맞는 값을 줄바꿈 하지 않고 출력

   %d : 정수형     %o : 8진수         %x : 16진수

   %c : 문자       %s : 문자열

   %f : 실수(소수점 아래 6자리)    %e : 지수 형태 표현   %g : 대입 값 그대로

   %A : 16진수 실수

   %b : 논리형

   정렬방법

    %5d : 5칸을 확보하고 오른쪽 정렬

    %-5d : 5칸을 확보하고 왼쪽 정렬

    %.2f : 소수점 아래 2자리까지만 표시

 

escape문자

 tab       => \t : 정해진 공간만큼 띄어쓰기

 new line  => \n : 출력하고 다음 라인으로 옮김 (줄바꿈)

 역슬래쉬   => \\

 작은따옴표 => \’  특수문자 사용시 백슬러스(\)를 넣고 특수문자를 넣어야 한다.

 큰따옴표   => \”

 유니코드   => \u

package firstProject.com.test;

 

import java.util.Scanner;

 

public class Hello {

         public static void main(String[] args) {

                  int num = 3;

                  System.out.printf("num :%d \n", num);//3

                  System.out.printf("num :%3d \n", num);//   3

                 

                  char ch = 'A';

                  System.out.printf("ch :%c \n", ch);//A

                 

                  float fnum = 3.14f;

                  double dnum = 4.1;

                  System.out.printf("fnum :%f \n", fnum);//3.140000

                  System.out.printf("fnum :%.3f \n", fnum);//3.140

                  System.out.printf("fnum :%10.2f \n", fnum);//      3.14

                 

                  String str = "hello world";

                  //System.out.printf("str(c) :%c \n", str);//에러

                  System.out.printf("str(s) :%s \n", str);//hello world

         }
}

package com.Test;

public class Variable04 {

 

             public static void main(String[] args) {

                           Variable04 test = new Variable04();

                           test.printVarSize();

             }

            

             //변수의 사이즈 출력

             public void printVarSize() {

                           System.out.println("byte : " + Byte.BYTES + "byte");

                           System.out.println("short : " + Short.BYTES + "byte");

                           System.out.println("int : " + Integer.BYTES + "byte");

                           System.out.println("long : " + Long.BYTES + "byte");

                          

                           System.out.println("float : " + Float.BYTES + "byte");

                           System.out.println("double : " + Double.BYTES + "byte");

                          

                           System.out.println("char : " + Character.BYTES + "byte");

                          

             }
}

Integer.parseInt 는 Integer 클래스안의 parseInt메소드!

Wrapper 클래스 기본 자료타입을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스 

 -> 가볍게 언급만 하고 넘어갔슈 나중에 배울 내용~

 

BYTES를 import 안하고 쓸 수 있는 이유. java.lang에 포함 되어있는 친구라서

java.lang 패키지는 import 하지 않아도 접근 가능하다.

자동으로 import되어있다고 생각하면 된다.

 

bnum = 127일 때

bnum = bnum + 1는 에러가 발생하고, bnum += 1은 에러가 발생하지 않는다, 왜일까

bnum = bnum + 1 은 byte + int 의 형태라 byte가 int 형으로 형변환 하여

int + int 꼴이 되고, 결과 값으로 int 형을 가지게 되어 byte 변수에 int 형을 대입하는 상태가 되어 에러가 나게 되는 것.

 

bnum += 1 은 bnum = bnum + 1로 생각하면 되는데

신기하게도 뒤에 bnum + 1이라는 것을 알아서, 앞에 있는 변수의 데이터 형에 맞게 변환시켜서 1을 더해준다

 

쉽게 생각하면!

bnum += 1은 컴퓨터가 읽을 때 bnum에 1 증가시키세요! 라고 읽어서 byte값을 1 증가 시키는것임!! 그래서 에러안나고 오버플로우가 난다!

bnum = bnum + 1은 진짜 말 그대로 더하기 연산을 하게 되는 경우라서 에러가 나는 것임!!

 

+ 이클립스에서 java 파일을 만들면 사용자가 직접 컴파일 하지 않아도 class 파일이 생김

이클립스 사용하는 내내 class 파일이 자동으로 갱신됨!

 

package com.Test;

 

public class Variable05 {

          

           //강제 형변환 = 명시적 형변환 -> (바꿀자료형)값 또는 (바꿀자료형)변수

           public static void main(String[] args) {

                     Variable05 test = new Variable05();

                     test.rule1();

           }

           //형변환

           //1. 같은 자료형 끼리만 대입 가능하기 때문에, 다른 자료형의 값을 대입할때는 형변환 필요

           //2. 같은 자료형 끼리만 연산 가능하고 계산의 결과도 같은 자료형이어야 한다.

           //3. 정수 -> 실수 : 자동형변환

           //   실수 -> 정수 : 강제형변환

           public void rule1() {

                     boolean flag = true;//형변환에서 예외 boolean은 무조건 true나 false만 들어올 수 있음

                    

                     //자동 형변환, upcasting,  묵시적 형변환

                     //강제 형변환, downcasting, 명시적 형변환

                    

                     int num = 'A'; //char는 int형으로 자동형변환 가능 A == 65

                     int n = '1'; // '1' == 49

                     //System.out.println("num : " + num);

                     System.out.println("n : " + n);

                    

                     char ch = 97;

                     System.out.println("ch : " + ch); //result = a

                    

                     //char ch = -97; //이거 에러남! 형변환 할 수 없다고 뜸 아스키코드표에 음수값이 없어서 생기는 문제

                    

           }
}

A => 아스키코드 값으로 65를 갖고, a => 97을 갖는다

 

char ch = -97; 이 에러나는 이유

 int -> char / char -> int의 경우 아스키 코드표에 있는 값으로 변환하는 것인데

 아스키 코드표에는 음수 값이 지정 되어있지 않아서 변환할 수 없다고 에러가 뜬다

 

class

 클래스를 구성하는 것은 크게 두가지로 나눠진다

 데이터를 담는 변수 , 기능을 담당하는 메소드

package com.Test;

 

public class Variable05 {

             //강제 형변환 = 명시적 형변환 -> (바꿀자료형)값 또는 (바꿀자료형)변수

             public static void main(String[] args) {

                           Variable05 test = new Variable05();

//                        test.rule1_1();

                           test.rule2();

             }

             public void rule1_1() {

                          

                           //강제 형변환, downcasting, 명시적 형변환

                          

                           int num = 'A';

                           //char ch = num; 이건 에러남

                           char ch = (char)num;

                           System.out.println("ch : " + ch);//65출력

            

                           int num2 = -97;

                           char ch2 = (char)num2;//오잉 이건 되네

                           System.out.println("ch2 : " + ch2);//?뜬다

                           //부호비트가 char 에는 없어서 얘는 내가 가진 표에는 이 값이 없어! 이래서 ? 출력

             }

            

             public void rule2() {

                           //다른 자료형끼리 연산은 큰 자료형으로 자동형변환 후 처리된다

                           int inum = 10;

                           long lnum = 100;

                          

                           //int isum = inum + lnum; 이 에러나는 이유

                           //inum + lnum의 경우 int형인 inum이 long형인 lnum과 연산하기위해 long형으로 형변환되어

                           //연산 결과가 long형이 되어 int형인 isum에 값을 저장 할 수 없다.

                          

                           //1. 수행결과를 int형으로 강제형변환 시킨다.

                           int isum = (int)(inum + lnum);

                           System.out.println("isum : " + isum);//result 110

                          

                           //2. long 형 값을 int로 강제 형 변환

                           int isum2 = inum +(int)lnum;

                           System.out.println("isum : " + isum);//result 110

                          

                           //3. long 타입의 변수로 받는다

                           long lsum = inum + lnum;

                           System.out.println("lsum : " + lsum);//result 110

             }
}