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(); 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은 ()안에 들어가는 숫자 순서에 맞는 글자 하나만 읽어와서 문자로 바꾸어 저장한다.
문자열은 순서가 정해진다.
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 } |
'기록 > 자바_국비' 카테고리의 다른 글
[배운 내용 정리] 1111 자바 국비교육 (0) | 2020.11.14 |
---|---|
[배운 내용 정리] 1110 자바 국비교육 (0) | 2020.11.10 |
[배운 내용 정리] 1109 자바 국비교육 (0) | 2020.11.10 |
[배운 내용 정리] 1106 자바 국비교육 (0) | 2020.11.06 |
[배운 내용 정리] 1104 자바 국비교육 (0) | 2020.11.04 |