1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | package day02; import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.Scanner; public class Ex01 { public static void main(String[] args) throws Exception { System.out.println(System.in); System.out.println(System.out); System.out.println(System.err); InputStream stdin = System.in; // 0번 통로 PrintStream stdout = System.out; // 1번 통로 PrintStream stderr = System.err; // 2번 통로 // System.out.println(10 / 3); // System.out.println(10 / 0); System.out.print("아무 키나 입력하세요 : "); int data = System.in.read(); // keyCode를 정수로 입력받는다 System.out.println("data : " + data); System.out.println((char) 44032); // System.in.read()는 1바이트의 표준 입력을 처리하는 함수이다 System.in.read(); System.in.read(); // 한글은 처리할 수 없으므로, 2바이트 입력을 처리할 수 있는 새로운 함수를 사용하게 된다 // 1바이트 입력을 처리하는 객체를 재료로 사용하여 2바이트를 처리하는 새로운 객체를 생성한다 InputStreamReader isr = new InputStreamReader(System.in); System.out.print("한글 하나 입력 : "); int num2 = isr.read(); System.out.println(num2); // 한글자씩 입력받으면 문장단위 입력이 매우 까다롭기 때문에 일정크기로 입력받는 형식으로 바꾼다 // 2바이트 입력기를 이용하여 문장단위 입력을 처리하는 객체를 생성한다 BufferedReader br = new BufferedReader(isr); br.readLine(); // 이전에 남아있던 데이터를 가져와서 버림 System.out.print("문장을 입력하세요 : "); String str = br.readLine(); System.out.println("출력 : " + str); // 자바 1.4까지는 이렇게 사용함 BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in)); // 자바 1.5부터 입력을 처리하는 새로운 객체가 등장 Scanner sc = new Scanner(System.in); // Scanner는 생성자 매개변수에 넣는 대상을 읽어내는 객체이다 String path = "C:\\windows\\system32\\drivers\\etc\\hosts"; File f = new File(path); Scanner sc2 = new Scanner(f); while (sc2.hasNextLine()) { // 파일에 읽어내지 않은 다음 줄이 있으면 String line = sc2.nextLine(); // 한 줄을 읽어내서 (\n 이전까지) System.out.println(line); // 그 줄을 화면에 출력한다 } System.out.println("End"); sc.close(); sc2.close(); URL url = new URL("https://mgr.kgitbank.com"); URLConnection conn = url.openConnection(); InputStream in = conn.getInputStream(); Scanner sc3 = new Scanner(in); while (sc3.hasNextLine()) { String line2 = sc3.nextLine(); System.out.println(line2); } System.out.println("close"); sc3.close(); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package day02; import java.util.Scanner; public class Ex02 { public static void main(String[] args) { // buffer : 데이터를 복사/이동할 때 사용하는 일정 메모리 단위 Scanner sc = new Scanner(System.in); int num; String str; System.out.print("정수 입력 : "); num = sc.nextInt(); // 입력된 데이터 중에서 정수에 해당하는 값만 저장한다 // 48 ~ 57 사이의 값만 저장한다 // 엔터키의 키 코드는 13(\r), 10(\n) sc.nextLine(); // 버퍼에 남아있는 엔터키 이전값을 가져와서 저장하지는 않는다 // 엔터키값이 버퍼에서 사라진다 System.out.print("문자열 입력 : "); // str = sc.next(); // 엔터 혹은 공백 이전까지의 내용을 문자열로 저장한다 str = sc.nextLine();// 엔터 이전까지의 내용을 문자열로 저장한다 System.out.println(num); System.out.println(str); System.out.println("정수 입력 : "); num = Integer.parseInt(sc.nextLine()); // 문자열형태로 가져와서 정수로 바꾼다 System.out.println("문자열 입력 : "); str = sc.nextLine(); sc.close(); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package day02; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; public class Ex03 { public static void main(String[] args) throws IOException { String path = "https://postfiles.pstatic.net/MjAyMDEyMDhfMjgg/MDAxNjA3MzU5MzM1ODgw.NPDe6mGlyyJajKG_tgDOFSK6DXA3QXj2LR32DTxn7kAg.bE1QJjLGAa7WsKBbueudIafbBFgAcLAx9B_x11JHLy0g.JPEG.itiio1619dl/IMG_2692.jpg?type=w966"; BufferedInputStream bis = null; FileOutputStream fos = null; try { bis = new BufferedInputStream(new URL(path).openStream()); fos = new FileOutputStream(new File("my.jpg")); byte[] buffer = new byte[4096]; // 버퍼, 1바이트씩 처리하면 함수호출이 너무 많다 int count, total = 0; // 일정한 크기만큼 데이터를 모아서 한번에 처리한다 while ((count = bis.read(buffer, 0, 1024)) != -1) { total += count; System.out.println(total); fos.write(buffer, 0, count); } } finally { bis.close(); fos.close(); } System.out.println("끝"); } } | cs |
자바의 자료형은 기본 타입(primitive type)과 참조 타입(reference type) 으로 나누어진다.
기본 타입은 정수, 실수, 문자, 논리 리터럴을 저장하는 타입이고,
참조 타입은 배열, 열거, 클래스, 인터페이스 등 객체의 위치를 참조하는 타입이다.
래퍼 클래스란 8개의 기본 타입에 해당하는 데이터를 객체로 표현하기 위해 포장해주는 클래스라고 한다.
각각의 타입에 해당하는 데이터를 인수로 전달받아 해당 값을 가지는 객체로 만들어준다.
래퍼 클래스는 모두 java,lang 패키지에 포함되어 제공된다.
또한 래퍼 클래스 특징으로는 기본 타입은 값을 갖는 객체인 포장 객체를 생성할 수 있지만
래퍼 클래스는 각 타입에 해당하는 데이터를 파라미터로 전달받아 해당 값을 가지는 객체로 만들어준다.
그리고 래퍼 클래스로 감싸고 있는 기본 타입 값은 외부에서 변경할 수 없으며, 변경하기 위해서는 새로운 포장 객체를 만들어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public class Ex04 { public static void main(String[] args) { boolean a1; // primitive type, 원시 자료형 byte a2; // 데이터를 저장하는 목적으로 사용 char a3; // 객체가 아니다 short a4; // 함수를 포함하지 않고, 오로지 저장목적으로만 사용한다 int a5; long a6; float a7; double a8; Boolean b1; // Wrapper Class, 원시자료형의 변수를 객체 유형으로 포장하는 클래스 Byte b2; // 데이터를 저장하면서, 관련된 함수를 포함하는 자료형 Character b3; // 클래스에 의해서 만들어진 객체 유형이다 Short b4; // 함수를 포함한다. 객체의 함수 혹은 클래스의 함수가 있다 Integer b5; // Integer.parseInt(String s)와 마찬가지로 문자열을 형변환하는 함수도 있다 Long b6; Float b7; Double b8; a2 = 10; b2 = 20; // a2. // a2는 원시형 변수이므로, 메서드를 포함하지 않는다 // b2. // 변수는 객체를 저장하고, 객체의 메서드가 포함되어 있다 // Byte. // 객체를 생성하지 않더라도, 클래스에도 메서드가 포함되어 있다 String t1 = "1234"; int num = 0; // 문자열을 정수로 직접 바꾸는 코드 for(int i = 0; i < t1.length(); i++) { char ch = t1.charAt(i); num *= 10; num += (int)(ch - 48); } System.out.println("num : " + num); // wrapper class의 만들어진 함수를 이용하여 변환하는 코드 int num2 = Integer.parseInt(t1); System.out.println("num2 : " + num2); } } | cs |
덧셈 연산자를 진행할때 연산자 중 한쪽이 String형이면 나머지 쪽을 String형으로 변환하여 결합하는 방식이다. 누가 우선 순위인지 고민하지 않도록 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Ex05 { public static void main(String[] args) { int n1 = 10, n2 = 3; // 정수와 정수의 덧셈 System.out.println(n1); n1 = n1 + n2; n1 += n2; System.out.println(n1); String s1 = ""; // 문자열과 문자열의 덧셈 String s2 = "A"; s1 = s1 + s2; s1 += s2; System.out.println(s1); String s3 = ""; // 문자열에 정수를 더하는 덧셈 int n3 = 8; s3 += n3; s3 = s3 + n3; System.out.println(s3); double pi = 3.1415926535; // primitive에 빈 문자열을 더하면 String s4 = pi + ""; // 그 결과는 String 타입으로 나타난다 System.out.println(s4); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Ex06 { public static void main(String[] args) { // 반복문 int num = 10; if(num < 20) { System.out.println("if) num : " + ++num); } while(num < 20) { // 조건이 거짓이 되기 전까지 반복하여 수행한다 // 조건이 참인 동안 반복하여 수행한다 (while) System.out.println("while) num : " + ++num); } for(int i = 0; num < 30; i++) { System.out.println("for) num : " + ++num); } while(true) { // 반복은 '무조건' 돌아가기 때문에 System.out.println("infinite loop) num : " + ++num); if(num == 10000) { // 특정 조건에서 반복을 탈출할 조건을 탐색한다 break; // break는 if를 제외한 제어문의 블럭을 아래로 빠져나간다 } } System.out.println("끝"); } } | cs |
nextLine은 메모리 영역에서 스페이스와 엔터를 모두 가지고 가지만 nextInt는 오직 정수만 들고가기에 enter키가 메모리에 남게 된다 그렇기에 nextLine을 한번 더 사용하여 공간을 비워주지 않으면 마지막 입력 구문에선 엔터키를 가진 뒤 종료되버린다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class Quiz1 { public static void main(String[] args) { // Scanner를 이용하여 이름과 나이, 주소를 순서대로 입력받은 후 출력하세요 // 단, 주소는 띄워쓰기를 포함하여 입력할 수 있어야 합니다 // 입출력에는 사용자의 입력에 따라 예외가 발생할 수 있기 때문에 // 보통 IOException 처리를 해야하지만 // Scanner는 내부 코드에서 예외 처리가 되어있어서, 예외 선언을 안해도 된다 // 1) 변수 선언 Scanner sc = new Scanner(System.in); String name, address; int age; // 2) 입력 System.out.print("이름 입력 : "); name = sc.nextLine(); System.out.print("나이 입력 : "); // age = sc.nextInt(); // sc.nextLine(); age = Integer.parseInt(sc.nextLine()); System.out.print("주소 입력 : "); address = sc.nextLine(); System.out.println("".equals(address)); // String name = request.getParameter("name"); // String age = request.getParameter("age"); // int _age = Integer.parseInt(age); // 3) 출력 System.out.println("이름 : " + name); System.out.println("나이 : " + age); System.out.println("주소 : " + address); // 4) 마무리 sc.close(); } | cs |
이런 문제를 해결하기 위해선 문제의 의도를 잘 파악해야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | public class Quiz2 { public static void main(String[] args) { // if 문제 /* * 이용 시간에 따라 요금을 책정하는 놀이기구가 있다 * 기본요금 3천원으로 시작하여 10분당 추가요금 500원이 발생한다 * 요금표는 아래와 같은 규칙으로 적용한다 * * 0 ~ 30 3000원 * 31 ~ 40 3500원 * 41 ~ 50 4000원 * ... * * 이용시간을 분으로 입력받아서, 금액을 계산하여 출력하는 코드를 작성하세요 */ Scanner sc = new Scanner(System.in); int time, fee = 3000, overcost; System.out.print("시간 입력 (분) : "); time = sc.nextInt(); if(time > 30) { if(time % 10 != 0) { overcost = (((time - 30) / 10) + 1) * 500; } else { overcost = ((time - 30) / 10) * 500; } fee += overcost; } System.out.println("요금 : " + fee); sc.close(); } // This method must return a result of type int static int getFee(int time) { int fee, overcost; if(time > 30) { if(time % 10 != 0) { overcost = (((time - 30) / 10) + 1) * 500; } else { overcost = ((time - 30) / 10) * 500; } fee = 3000 + overcost; return fee; } return 3000; } } | cs |
※ n1은 1234 n2는 0이라고 가정한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | public class Quiz3 { public static void main(String[] args) { // 1) while을 이용하여 정수를 거꾸로 뒤집어서 다른 변수에 저장한 후 출력하세요 int n1 = 1234; int n2 = 0; /* n2 *= 10; // n2 = 0 n2 += n1 % 10; // n2 = 4 n1 /= 10; // n1 = 123 n2 *= 10; // n2 = 40 n2 += n1 % 10; // n2 = 43 n1 /= 10; // n1 = 12 n2 *= 10; // n2 = 430 n2 += n1 % 10; // n2 = 432 n1 /= 10; // n1 = 1 n2 *= 10; // n2 = 4320 n2 += n1 % 10; // n2 = 4321 n1 /= 10; // n1 = 0 */ while(n1 > 0) { // 0이 아닐때, 또는 0보다 클 경우라는 식을 쓴다(10씩 몫을 구하고 있어서 0 이하는 절대 계산할 수가 없다) n2 *= 10; // n1에서 받은 나머지를 10씩 곱하여 자릿수를 맞춰준다. 뒤에 쓰게 되면 한자리가 더 늘어나게 되므로 n2과 0일때 곱한다. n2 += n1 % 10; // n1의 첫째자리 나머지를 n2에 더한다 n1 /= 10; // n1가 한자리씩 줄어들도록 마지막 자리씩 잘라낸다 } System.out.println("n2 : " + n2); // 4321 // 2) for를 이용하여 1부터 1000사이의 홀수의 합과 짝수의 합을 각각 구하여 출력하세요 // odd 홀수 even 짝수 int oddSum = 0, evenSum = 0; // 250000, 250500 /* int i = 1; if(i % 2 == 0) evenSum += i; else oddSum += i; i++; if(i % 2 == 0) evenSum += i; else oddSum += i; i++; if(i % 2 == 0) evenSum += i; else oddSum += i; i++; */ for(int i = 1; i <= 1000; i++) { // i가 1부터 1000사이의 수 일 경우 i를 1씩 증가 시켜라 if(i % 2 != 0) evenSum += i; // i를 2로 나눴을때 나머지가 0이면 짝수에 i를 더해라 else oddSum += i; // 그게 아닐 경우 홀수에 i를 더해라 } /* ... */ System.out.printf("oddSum : %d, evenSum : %d\n", oddSum, evenSum); } } | cs |