diff --git a/hanghae-java-study-12.iml b/hanghae-java-study-12.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/hanghae-java-study-12.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/hwj_report/Calculator.java b/src/hwj_report/Calculator.java new file mode 100644 index 0000000..0bce67d --- /dev/null +++ b/src/hwj_report/Calculator.java @@ -0,0 +1,77 @@ +package hwj_report; + +import java.util.Scanner; + +public class Calculator { + + public static void main(String[] args) { + + while (true) { + + // 계산기 왜 프로그래밍 언어에 제어문 + Scanner scanner = new Scanner(System.in); + // 숫자 2개랑, 연산기호 + + System.out.print("숫자 1 입력하세요 : "); + int num1 = scanner.nextInt(); + System.out.print("연산자를 입력하세요 : "); + String op = scanner.next(); + System.out.print("숫자 2 입력하세요 : "); + int num2 = scanner.nextInt(); + + + if (op.equals("*")) { + System.out.println(num1 * num2); + } else if (op.equals("/")) { // 분모 : num2 != 0 + if (num2 > 0) { + System.out.println(num1 / num2); + } else if (num2 == 0) { + System.out.println("다시 입력하세요!"); + } else { + System.out.println("음수값이 나옵니다."); + System.out.println(num1 / num2); + } + } else if (op.equals("+")) { + System.out.println(num1 + num2); + } else if (op.equals("-")) { + System.out.println(num1 - num2); + } + + if (op.equals("exit")) { + System.out.println("종료!"); + //break; + return; + } + + // switch +// switch (op) { +// case "*": +// System.out.println(num1 * num2); +// break; +// case "/": +// if (num2 > 0) { +// System.out.println(num1 / num2); +// } else { +// System.out.println("다시 입력하세요!"); +// } +// break; +// case "+": +// System.out.println(num1 + num2); +// break; +// case "-": +// System.out.println(num1 - num2); +// break; +// default: +// System.out.println("연산자가 틀렸습니다."); + } + + + } + +} + + + + + + diff --git a/src/hwj_report/Report01.java b/src/hwj_report/Report01.java new file mode 100644 index 0000000..cf4b816 --- /dev/null +++ b/src/hwj_report/Report01.java @@ -0,0 +1,37 @@ +package hwj_report; + +public class Report01 { + public static void main(String[] args) { + + //2-4. 다음 중 변수를 잘못 초기화 한 것은? +// byte b = 256; "오류" 원인 : 저장 가능한 값의 범위를 넘어가기 때문 +// char c = ''; "오류" 원인 : 빈 문자열은 선언 가능하지 않기 때문 +// char answer = 'no'; "오류" 원인 : 변수타입 char은 문자 하나만 가능하기 때문 +// float f = 3.14; "오류" 원인 : float 타입 변수에 실수를 할당할 때에는 실수값 뒤에 별도로 f나 F를 추가해야 하기 때문 + double d = 1.4e3f; + + //2-7. 다음 문장들의 출력 결과를 적으세요. 오류가 있는 문장의 경우, '오류' 라고 적으세요. + System.out.println(true+""); + System.out.println('A' + 'B'); + System.out.println('1' + 2); + System.out.println('1' + '2'); + System.out.println('J' +"ava"); + //System.out.println(true + null); 오류 + + + //2-8. 아래는 변수 x, y, z의 값을 서로 바꾸는 예제이다. 결과와 같이 출력되도록 코드를 넣으세요. + int x = 1; + int y = 2; + int z = 3; + + x = x + 1; + y = y + 1; + z = z -2; + + System.out.println("x="+x); + System.out.println("y="+y); + System.out.println("z="+z); + + } + +} diff --git a/src/hwj_report/Report02.java b/src/hwj_report/Report02.java new file mode 100644 index 0000000..8090da9 --- /dev/null +++ b/src/hwj_report/Report02.java @@ -0,0 +1,87 @@ +package hwj_report; + +public class Report02 { + + public static void main(String[] args) { + + byte b = 10; + char ch = 'A'; + int i = 100; + long l = 1000L; + + //3-1. 다음 중 형변환을 생략할 수 있는 것은? (모두 고르시오) + b = (byte)i; + ch = (char)b; + short s = (short)ch; + float f = l; // 정답 + i = (int)ch; // 정답 + + //3-2. 다음 연산의 결과와 그 이유를 적으세요. + int x = 2; + int y = 5; + char c = 'A'; // 'A'의 문자코드는 65 + + System.out.println(y >= 5 || x < 0 && x > 2); + // true 이유 : 먼저 해석하면 5>=5 OR 2 < 0 AND 2 > 2 => 먼저 한 조건이라도 true이기 때문에 true + System.out.println(y += 10 - x++); + // 13 이유 : 15 - 2 + System.out.println(x += 2); + // 5 이유 : 변수 x에 2를 더하자 2+2 = 4 인줄 알았으나 앞 식에서 증가연산자 때문에 x가 1 증가 함 그래서 3+2+=5가 나옴 + System.out.println(!('A' <= c && c <= 'Z')); + // false 이유 : 먼저 괄호안의 식이 먼저 계산되고 마지막에 !에의해 반대로 바뀐다. 두식다 true 이지만, !true = false + System.out.println('C' - c); + // 2 이유 : 피연산자가 int보다 작은 타입(byte, short, char)인 경우 int로 변환한 다음에 연산을 수행한다. c의 값이 'A'이므로 'C'-c는 ‘C'-'A'가 되고 'C'와 'A'는 int로 변환되어 '67 - 65'가 되고 최종결과는 2가 된다. 구글링에서 결과를 찾아봄 + System.out.println('5' - '0'); + // 5 이유 : 위와 마찬가지로 '5'라는 문자코드가 나타내는 숫자 53, '0'을 문자코드가 나타내는 숫자 48 둘을 빼서 + System.out.println(c + 1); + // 66 이유 : A는 문자코드 값이 65라는 결과로 얻게 되므로 연산 되어 66이라는 값이 나온다. + System.out.println(++c); + // B 이유 : 증감 연산자는 형변환이 발생하지 않기에 + System.out.println(c++); + // B 이유 : 증감 연산자는 형변환이 발생하지 않기에 + System.out.println(c); + // C 이유 : B에서 증가해버림 + + + //3-3. 아래는 변수의 num 값 중에서 백의 자리 이하를 버리는 코드이다. + //만일 변수 num의 값이 '456'이라면 '400'이 되고, '111'이라면 '100'이 된다. + //알맞은 코드를 넣으시오. + int num = 456; + + num = num - (num % 100); + + System.out.println(num); + + + //3-4. 아래의 코드는 사과를 담는데 필요한 바구니(버켓)의 수를 구하는 코드이다. + //만일 사과의 수가 123개이고 하나의 바구니에는 10개의 사과를 담을 수 있다면, 13개의 바구니가 필요할 것이다. + //알맞은 코드를 넣으시오. + + int numOfApples = 123; // 사과의 개수 + int sizeOfBucket = 10; // 바구니의 크기(바구니에 담을 수 있는 사과의 개수) + int numOfBucket = Math.round((int)(numOfApples / sizeOfBucket) + 0.5f); // 모든 사과를 담는데 필요한 바구니의 수 + + System.out.println("필요한 바구니의 수 : " + numOfBucket); + + + //3-5. 아래는 변수 num2의 값에 따라 '양수', '음수', '0'을 출력하는 코드이다. + //삼항연산자를 이용해서 빈칸에 알맞은 코드를 넣으시오. + //Hint : 삼항 연산자를 두 번 사용할 것! + int num2 = 10; + System.out.println((num2 > 0) ? "양수" : (num2 < 0) ? "음수" : "0"); + + + //3-6. 아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다. + //변환 공식이 'C = 5/9*(F-32)'라고 할 때, 빈 칸에 알맞은 코드를 넣으시오. + // 단, 변환값은 소수점 셋째자리에서 반올림하며, Math.round() 함수를 사용하지 않고 처리할 것! + int fahrenheit = 100; + float celcius = (int)(5/9f * (fahrenheit-32) * 100 + 0.5) / 100f; // 화씨 계산 할때 소수자리가 나오게 (int)와 f를 2번 쓴다. + + System.out.println("Fahrenheit: "+fahrenheit); + System.out.println("Celcius: "+celcius); + + + } + + +} diff --git a/src/hwj_report/Report03.java b/src/hwj_report/Report03.java new file mode 100644 index 0000000..6dbd5b8 --- /dev/null +++ b/src/hwj_report/Report03.java @@ -0,0 +1,231 @@ +package hwj_report; + +class Report03 { + public static void main(String[] args) { + + System.out.println("Report03"); + } +} + +//4-1. 다음의 문장들을 조건식으로 표현해보세요. + +//int형 변수 x가 10보다 크고 20보다 작을 때 true인 조건식 + // int x < 10 && int x > 20 + +//char형 변수 ch가 공백이나 탭이 아닐 때 true인 조건식 + // !(char ch == ' ' || ch =='\') + +//char형 변수 ch가 'x' 또는 'X'일 때 true인 조건식 + // char ch == 'x' || ch == 'X' + +//char형 변수 ch가 숫자('0'~'9')일 때 true인 조건식 + // char ch >= '0' || ch <= '9' + +//char형 변수 ch가 영문자(대문자 또는 소문자)일 때 true인 조건식 + // (ch <= 'a' && ch >= 'z') || (ch <= 'A' && ch >= 'Z') + +//int형 변수 year가 400으로 나눠떨어지거나 또는 4로 나눠떨어지고 100으로 나눠떨어지지 않을때 true인 조건식 + // year % 400 == 0 || year % 4 == 0 && year % 100 != 0 + +//boolean형 변수 powerOn이 false일 때 true인 조건식 + // !powerOn + +//문자열 참조변수 str이 "yes"일 때 true인 조건식 + // str.equals("yes") + + +//4-2. 1부터 20까지의 정수중에서 2 또는 3의 배수가 아닌 수의 총합을 구하세요. +class Exercise4_2 { + public static void main(String[] args) { + int sum = 0; + + for(int i = 1; i <= 20; i++) { + if(i % 2 != 0 && i % 3 != 0){ + sum += i; + } + } + + System.out.println("sum="+sum); + } +} + + +//4-3. 1+(1+2)+(1+2+3)+(1+2+3+4)+...+(1+2+3+...+10)의 결과를 계산하세요. +class Exercise4_3 { + public static void main(String[] args) { + int sum = 0; + int totalSum = 0; + + for(int i = 0; i < 10; i++) { + sum += i + 1; + totalSum += sum; + } + + System.out.println("totalSum="+totalSum); + } +} + + +//4-4. 1+(-2)+3+(-4)+...과 같은 식으로 계속 더해나갔을 때, +//몇까지 더해야 총합이 100 이상이 되는지 구하세요. +class Exercise4_4 { + public static void main(String[] args) { + int sum = 0; // 총합을 저장할 변수 + int s = 1; // 값의 부호를 바꿔주는데 사용할 변수 + int num = 0; + + for (int i = 0; sum < 100; i++) { + s = -s; + num = s * i; + sum += num; + if(sum >= 100) { + break; + } + } + + System.out.println("num="+num); + System.out.println("sum="+sum); + } +} + + + +//4-5. 다음의 for문을 while문으로 변경하세요. +class Exercise4_5 { + public static void main(String[] args) { +// for(int i=0; i<=10; i++) { +// for(int j=0; j<=i; j++) +// System.out.print("*"); +// System.out.println(); +// } + + int i = 0; + while (i <= 10){ + int j = 0; + while (j <= i){ + System.out.print("*"); + j++; + } + System.out.println(); + i++; + } + + }//end of main +} // end of class + + +//4-6. 두 개의 주사위를 던졌을 때, 눈의 합이 6이 되는 모든 경우의 수를 출력하는 프로그램을 작성하세요. +class Exercise4_6 { + public static void main(String[] args) { + + for (int i = 1; i <= 6; i++){ + for (int j = 1; j <= 6; j++){ + if(i + j == 6) { + System.out.println(i + " + " + j +" = "+ (i + j)); + } + } + } + + } +} + + +//4-7. 숫자로 이루어진 문자열 str이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하세요. +//만일 문자열이 "12345"라면, ‘1+2+3+4+5’의 결과인 15를 출력이 출력되어야 합니다.` +class Exercise4_7 { + public static void main(String[] args) { + String str = "12345"; + int sum = 0; + + for (int i = 0; i < str.length(); i++) { + + sum += str.charAt(i) - '0'; // 이해가 되질 않는다 또... + System.out.println(str.charAt(i)); + } + System.out.println("sum=" + sum); + } +}//예상 결과 : sum=15 + + + +//4-8. Math.random()을 이용해서 1부터 6 사이의 임의의 정수를 변수 value에 저장하는 코드를 완성하세요. +class Exercise4_8{ + public static void main(String[] args){ + + int value = (int)(Math.random() * 6) + 1; + + System.out.println("value:"+value); + } +} + + + +//4-9. int 타입의 변수 num이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하세요. +//만일 변수 num의 값이 12345라면, ‘1+2+3+4+5’의 결과인 15를 출력하세요. +//문자열로 변환하지 말고 숫자로만 처리하세요. +class Exercise4_9 { + public static void main(String[] args) { + int num = 12345; + int sum = 0; + + int number1 = num / 10000; + int number2 = num / 1000 - (number1 * 10); + int number3 = num / 100 - (number1 * 100) - (number2 * 10); + int number4 = num / 10 - (number1 * 1000) - (number2 * 100) - (number3 * 10); + int number5 = num / 1 - (number1 * 10000) - (number2 * 1000) - (number3 * 100) - (number4 * 10); + + // for문으로 돌리고 싶은데 어케 하지?? 답답하다 ㅡㅡ +// for(int i = 0; i < 5; i++) { +// sum += num / 10000 +// } + + sum = number1 + number2 + number3 + number4 + number5; + System.out.println("sum="+sum); + } +}//예상 결과 : sum=15 + + +//4-10. 다음은 숫자맞추기 게임을 작성한 것이다. 1과 100사이의 값을 반복적으로 입력해서 +// 컴퓨터가 생각한 값을 맞추면 게임이 끝난다. +// 사용자가 값을 입력하면, 컴퓨터는 자신이 생각한 값과 비교해서 결과를 알려준다. +// 사용자가 컴퓨터가 생각한 숫자를 맞추면 게임이 끝나고 몇 번 만에 숫자를 맞췄는지 알려준다. + +class Exercise4_14 { + public static void main(String[] args) { + // 1~100사이의 임의의 값을 얻어서 answer에 저장한다. + int answer = (int) (Math.random() * 100) + 1; + int input = 0; //사용자입력을 저장할 공간 + int count = 0; //시도횟수를 세기위한 변수 + + // 화면으로 부터 사용자입력을 받기 위해서 Scanner클래스 사용 + java.util.Scanner s = new java.util.Scanner(System.in); + do { + count++; + System.out.print("1과 100사이의 값을 입력하세요 : "); + input = s.nextInt(); //입력받은 값을 변수 input에 저장한다. + if(answer == input) { + System.out.println("맞혔습니다."); + System.out.println("시도횟수는" + count + "번입니다."); + } else if(answer < input) { + System.out.println("더 작은 수를 입력하세요"); + } else { + System.out.println("더 큰 수를 입력하세요"); + } + } while(true); //무한반복문 + } // end of main +} // end of class + +//예상 결과 +//1과 100사이의 값을 입력하세요 : 50 +//더 큰 수를 입력하세요. +//1과 100사이의 값을 입력하세요 : 75 +//더 큰 수를 입력하세요. +//1과 100사이의 값을 입력하세요 : 87 +//더 작은 수를 입력하세요. +//1과 100사이의 값을 입력하세요 : 80 +//더 작은 수를 입력하세요. +//1과 100사이의 값을 입력하세요 : 77 +//더 작은 수를 입력하세요. +//1과 100사이의 값을 입력하세요 : 76 +//맞혔습니다. +//시도횟수는 6번입니다. diff --git a/src/hwj_report/Report04.java b/src/hwj_report/Report04.java new file mode 100644 index 0000000..a6c6da9 --- /dev/null +++ b/src/hwj_report/Report04.java @@ -0,0 +1,146 @@ +package hwj_report; + +import java.util.Arrays; +import java.util.Random; +import java.util.Scanner; + +class Report04 { + public static void main(String[] args) { + System.out.println("report04"); + } + +} + +class array_exercise { + + public static void main(String[] args) { + //5-1. 다음은 배열을 선언하거나 초기화한 것이다. 잘못된 것을 고르고 그 이유를 설명하세요. + int[] arr1[]; + int[] arr2 = {1, 2, 3,}; + int[] arr3 = new int[5]; + //int[] arr4 = new int[5]{1,2,3,4,5}; // 잘못된거 []안에 배열의 크기를 지정할 수 없다. + //int arr5[5]; // 잘못된거 + int[] arr6[] = new int[3][]; + + + //5-2. 다음과 같은 배열이 있을 때, arr[3].length의 값은? + int[][] arr7 = { + {5, 5, 5, 5, 5}, + {10, 10, 10}, + {20, 20, 20, 20}, + {30, 30} + }; + // 답 : 2 + } + +} + + +//5-3. 배열 arr에 담긴 모든 값을 더하는 프로그램을 완성하세요. +class Exercise5_3 { + public static void main(String[] args) { + int[] arr = {10, 20, 30, 40, 50}; + int sum = 0; + + for(int i = 0; i < arr.length; i++) { + sum += arr[i]; + } + + System.out.println("sum=" + sum); + } +}//예상 결과 : sum=150 + + +//5-4. 2차원 배열 arr에 담긴 모든 총합과 평균을 구하는 프로그램을 완성하세요. +class Exercise5_4 { + public static void main(String[] args) { + int[][] arr = { + {5, 5, 5, 5, 5}, + {10, 10, 10, 10, 10}, + {20, 20, 20, 20, 20}, + {30, 30, 30, 30, 30} + }; + + int total = 0; + float average = 0; + + int avgCnt = 0; + for(int i = 0; i < arr.length; i++) { + for (int j = 0; j < arr[i].length; j++) { + total += arr[i][j]; + avgCnt += 1; + average = (float) total / avgCnt; + } + } + + System.out.println("total=" + total); + System.out.println("average=" + average); + } // end of main +} // end of class + + +//5-5. 다음은 1과 9 사이의 중복되지 않은 숫자로 이루어진 3자리 숫자를 만들어내는 프로그램이다. +//코드를 완성하세요. 다만 Math.random()을 사용했기 때문에 실행 결과 예시와 다를 수 있습니다. +class Exercise5_5 { + public static void main(String[] args) { + int[] ballArr = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + int[] ball3 = new int[3]; + + // 배열 ballArr의 임의의 요소를 골라서 위치를 바꾼다 + for (int i = 0; i < ballArr.length; i++) { + int j = (int) (Math.random() * ballArr.length); + int tmp = 0; + + tmp = ballArr[i]; + ballArr[i] = ballArr[j]; + ballArr[j] = tmp; + + } + + for (int i = 0; i < 3; i++) { + ball3[i] = ballArr[i]; + } + + // 배열 ballArr의 앞에서 3개의 수를 배열 ball3로 복사한다 + + System.arraycopy(ballArr,0, ball3,0,3); + + for (int i = 0; i < ball3.length; i++) { + System.out.print(ball3[i]); + } + }//end of main +}//end of class + + +//5-6. 단어의 글자위치를 섞어서 보여주고 원래의 단어를 맞추는 예제이다. +//실행결과와 같이 동작하도록 빈 칸을 채우세요. + +class Exercise5_13 { + public static void main(String args[]) { + String[] words = {"television", "computer", "mouse", "phone"}; + + Scanner sc = new Scanner(System.in); + + for (int i = 0; i < words.length; i++) { + char[] question = words[i].toCharArray(); // String을 char[]로 변환 + + for(int j = 0; j < question.length; j++) { + + int idx = (int) (Math.random() % question.length); // 인덱스를 가져오는 생각을 어케 하냐고 + char tmp; + tmp = question[j]; + question[j] = question[idx]; + question[idx] = tmp; + } // 이런 생각을 어떻게 하냐고 ㅡㅡ + + System.out.printf("Q%d. %s의 정답을 입력하세요 .>", i + 1, new String(question)); + String answer = sc.nextLine(); + + // trim()으로 answer의 좌우 공백을 제거한 후, equals로 word[i]와 비교 + if (words[i].equals(answer.trim())) + System.out.printf("맞았습니다.%n%n"); + else + System.out.printf("틀렸습니다.%n%n"); + } + } //end of main +}//end of class \ No newline at end of file diff --git a/src/hwj_report/Report05.java b/src/hwj_report/Report05.java new file mode 100644 index 0000000..4673de3 --- /dev/null +++ b/src/hwj_report/Report05.java @@ -0,0 +1,125 @@ +package hwj_report; + +public class Report05 { + public static void main(String[] args) { + System.out.println("Report05"); + } + +} +//6-1. 다음과 같은 멤버 변수를 갖는 Student 클래스를 정의하세요. +//타입 : String, 변수명 : name, 설명 : 학생 이름 +//타입 : int, 변수명 : ban, 설명 : 반 +//타입 : int, 변수명 : no, 설명 : 번호 +//타입 : int, 변수명 : kor, 설명 : 국어 점수 +//타입 : int, 변수명 : eng, 설명 : 영어 점수 +//타입 : int, 변수명 : math, 설명 : 수학 점수 + +class Student { + String name; + int ban; + int no; + int kor; + int eng; + int math; + +// public Student(String name, int ban, int no, int kor, int eng, int math){ +// this.name = name; +// this.ban = ban; +// this.no = no; +// this.kor = kor; +// this.eng = eng; +// this.math = math; +// } + + String info() { + return name + "," + ban + "," + no + "," + kor + "," + eng + "," + math; + } + + int getTotal() { + return kor + eng + math; + } + + float getAverage() { + return (int)(getTotal() / 3f * 10 + 0.5f) / 10.0f ; + } + +} + +//6-2. 6-1에서 정의한 Student 클래스에 생성자와 info()를 추가해서 실행결과와 같은 결과를 얻도록 하세요. +//class Exercise6_2{ +// public static void main(String[] args){ +// Student s = new Student("홍길동", 1, 1, 100, 60, 76); +// +// String str = s.info(); +// +// System.out.println(str); +// }// 예상 결과 : 홍길동, 1, 1, 100, 60, 76, 236, 78.7 +//} + + +//6-3. 연습문제 6-1에서 정의한 Student 클래스에 다음과 같이 정의된 두 개의 메서드를 추가하세요. + //1. 메서드명 : getTotal + //기능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다. + //반환타입 : int + //매개변수 : 없음 +//2. 메서드명 : getAverage + //기능 : 총점(국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다. + //소수점 둘째자리에서 반올림할 것. + //반환타입 : float + //매개변수 : 없음 + +class Exercise6_3 { + public static void main(String args[]) { + + Student s = new Student(); + s.name = "홍길동"; + s.ban = 1; + s.no = 1; + s.kor = 100; + s.eng = 60; + s.math = 76; + + System.out.println("이름 :"+s.name); + System.out.println("총점 :"+s.getTotal()); + System.out.println("평균 :"+s.getAverage()); + + }//예상 결과 : 이름 : 홍길동, 총점 : 236, 평균 : 78.7 +} + +//6-5. 다음의 코드에 정의된 변수들을 종류별(클래스 변수,인스턴스 변수, 지역변수)로 구분해서 적으세요. +class PlayingCard { + int kind; // 인스턴스 변수 + int num; // 인스턴스 변수 + static int width; // 클래스 변수 + static int height; // 클래스 변수 + PlayingCard(int k, int n) { + kind = k; // 지역변수 + num = n; // 지역변수 + } + public static void main(String args[]) { + PlayingCard card = new PlayingCard(1,1); + } +} + + +//6-7. 다음은 컴퓨터 게임의 병사(marine)를 클래스로 정의한 것이다. + //이 클래스의 멤버 중에 static을 붙여야 하는 것은 어떤 것들이고 그 이유는 무엇인가? + //(단, 모든 병사의 공격력과 방어력은 같아야 한다.) +class Marine { + int x=0, y=0; //Marine의 위치좌표 (x,y) + static int hp = 60; //현재 체력 // 이유 : 업그레이드를 하지 않은 한 고정값이어야 하기 때문이다. + static int weapon = 6; //공격력 // 이유 : 업그레이드를 하지 않은 한 고정값이어야 하기 때문이다. + static int armor = 0; //방어력 // 이유 : 업그레이드를 하지 않은 한 고정값이어야 하기 때문이다. + void weaponUp() { + weapon++; + } + void armorUp() { + armor++; + } + void move(int x, int y) { + this.x = x; + this.y = y; + } +} + + diff --git a/src/hwj_report/Report06.txt b/src/hwj_report/Report06.txt new file mode 100644 index 0000000..45a3977 --- /dev/null +++ b/src/hwj_report/Report06.txt @@ -0,0 +1,96 @@ +6-8. 다음 중 생성자에 대한 설명으로 옳지 않은 것은? (모두 고르시오) +a. 모든 생성자의 이름은 클래스의 이름과 동일해야한다. +b. 생성자는 객체를 생성하기 위한 것이다. +c. 클래스에는 생성자가 반드시 하나 이상 있어야 한다. +d. 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다. +e. 생성자는 오버로딩 할 수 없다. + +답 : b (클래스가 객체를 생성하기 위한 것, 생성자는 객체를 초기화하기 위한 것) / e. (오버로딩 할 수 있다.) + + +6-9. 다음 중 this에 대한 설명으로 맞지 않은 것은? (모두 고르시오) +a. 객체 자신을 가리키는 참조변수이다. +b. 클래스 내에서라면 어디서든 사용할 수 있다. +c. 지역변수와 인스턴스변수를 구별할 때 사용한다. +d. 클래스 메서드 내에서는 사용할 수 없다. + +답: b (this는 인스턴스 메서드 내에서만 사용 가능하다.) + + +6-10. 다음 중 오버로딩이 성립하기 위한 조건이 아닌 것은? (모두 고르시오) +a. 메서드의 이름이 같아야 한다. +b. 매개변수의 개수나 타입이 달라야 한다. +c. 리턴타입이 달라야 한다. +d. 매개변수의 이름이 달라야 한다. + +답 : c, d. - 오버로딩의 조건 : 1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입, 위치가 달라야 한다. 3. 반환타입에는 영향을 받지 않는다. + + +6-11. 다음 중 아래의 add메서드를 올바르게 오버로딩 한 것은? (모두 고르시오) +> long add(int a, int b) { return a+b; } + +a. long add(int x, int y) { return x+y; } +b. long add(long a, long b) { return a+b; } +c. int add(byte a, byte b) { return a+b; } +d. int add(long a, int b) { return (int)(a+b); } + +답 : b, c, d + + +6-12. 다음 중 초기화에 대한 설명으로 옳지 않은 것은? (모두 고르시오) +a. 멤버변수는 자동 초기화되므로 초기화하지 않고도 값을 참고할 수 있다. +b. 지역변수는 사용하기 전에 반드시 초기화해야 한다. +c. 초기화 블럭보다 생성자가 먼저 수행된다. +d. 명시적 초기화를 제일 우선적으로 고려해야 한다. +e. 클래스변수보다 인스턴스변수가 먼저 초기화된다 + +답 : c, e - 멤버 변수의 초기화 : 자동으로 초기화 된다. 클래스변수 - 클래스가 처음 로딩 될 때 단 한번만 초기화 / 인스턴스 변수 : 인스턴스가 생성될 때 마다 초기화 + - 지역 변수의 초기화 : 수동으로 초기화 된다. 해당 주소에 어떠한 값이 있는지 모르기 때문에 Java는 개발자에게 수동으로 초기화 하라고 요구 + + +6-13. 다음 중 인스턴스변수의 초기화 순서가 올바른 것은? +a. 기본값-명시적초기화-초기화블럭-생성자 +b. 기본값-명시적초기화-생성자-초기화블럭 +c. 기본값-초기화블럭-명시적초기화-생성자 +d. 기본값-초기화블럭-생성자-명시적초기화 + +답 : a + + +6-14. 다음 중 지역변수에 대한 설명으로 옳지 않은 것은? (모두 고르시오) +a. 자동 초기화되므로 별도의 초기화가 필요없다. +b. 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다. +c. 메서드의 매개변수로 선언된 변수도 지역변수이다. +d. 클래스변수나 인스턴스변수보다 메모리 부담이 적다. +e. 힙(heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다. + + +답 : a (수동으로 초기화 해야함), e (호출 스택에서 생성 된다.) + + +6-15. 호출스택이 다음과 같은 상황일 때 옳지 않은 설명은? (모두 고르시오) +a. 제일 먼저 호출스택에 저장된 것은 main메서드이다. +b. println메서드를 제외한 나머지 메서드들은 모두 종료된 상태이다. +c. method2메서드를 호출한 것은 main메서드이다. +d. println메서드가 종료되면 method1메서드가 수행을 재개한다. +e. main-method2-method1-println의 순서로 호출되었다. +f. 현재 실행중인 메서드는 println뿐이다. + +답 : b (호출 스택 제일 위에있는 메서드는 현재 수행중인 것이고 나머지는 수행중인 메서드를 끝나기를 기다리고 있음) + + +//6-16. 다음 코드의 실행 결과를 예측하여 적어주세요. +class Exercise6_16 { + public static void change(String str) { + str += "456"; + } + + public static void main(String[] args) { + String str = "ABC123"; + System.out.println(str); + change(str); + System.out.println("After change:" + str); + } +} + +답 : ABC123 , After change = ABC123 \ No newline at end of file diff --git a/src/hwj_report/Report07.java b/src/hwj_report/Report07.java new file mode 100644 index 0000000..d3bbb72 --- /dev/null +++ b/src/hwj_report/Report07.java @@ -0,0 +1,168 @@ +package hwj_report; + +public class Report07 { + public static void main(String[] args) { + System.out.println("Report07"); + } +} + +class Exercise6_17 { + + public static int[] shuffle(int[] arr) { + + for(int i = 0; i < arr.length; i++) { + + int num = (int)(Math.random() * arr.length); + + int idx = arr[num]; + arr[num] = arr[i]; + arr[i] = idx; + + } + return arr; + } + + public static void main(String[] args) { + int[] original = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + System.out.println(java.util.Arrays.toString(original)); + + int[] result = shuffle(original); + System.out.println(java.util.Arrays.toString(result)); + } +} + +class Exercise6_18 { + + public static boolean isNumber(String str) { + + if(str == null || str.equals("")) { + return false; + } + + for (int i = 0; i < str.length(); i++) { + char apb = str.charAt(i); + + if (apb < '0' || apb > '9') { + return false; + } + } + return true; + } + public static void main(String[] args) { + String str = "123"; + System.out.println(str + " 는 숫자입니까? " + isNumber(str)); + str = "1234o"; + System.out.println(str + " 는 숫자입니까? " + isNumber(str)); + } +} +//예상 결과 : 123는 숫자입니까? true, 1234o는 숫자입니까? false + +class MyTv { + boolean isPowerOn; + int channel; + int volume; + final int MAX_VOLUME = 100; + final int MIN_VOLUME = 0; + final int MAX_CHANNEL = 100; + final int MIN_CHANNEL = 1; + void turnOnOff() { + // (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다. + if(isPowerOn == true) { + System.out.println(true); + } else { + System.out.println(false); + } + + } + void volumeUp() { + // (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1 증가시킨다. + if(volume < MAX_VOLUME) { + volume += 1; + } + } + void volumeDown() { + // (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1 감소시킨다. + if(volume > MIN_VOLUME) { + volume -= 1; + } + } + void channelUp() { + // (4) channel의 값을 1 증가시킨다. + channel += 1; + // 만일 channel이 MAX_CHANNEL이면 , channel의 값을 MIN_CHANNEL로 바꾼다. + if(channel == MAX_CHANNEL + 1){ + channel = MIN_CHANNEL; + } + } + void channelDown() { + // (5) channel의 값을 1 감소시킨다 . + channel -= 1; + // 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL로 바꾼다. + if(channel == MIN_CHANNEL - 1) { + channel = MAX_CHANNEL; + } + } +} + +class Exercise6_19 { + public static void main(String args[]) { + MyTv t = new MyTv(); + t.channel = 100; + t.volume = 0; + System.out.println("CH:" + t.channel + ", VOL:" + t.volume); + t.channelDown(); + t.volumeDown(); + System.out.println("CH:" + t.channel + ", VOL:" + t.volume); + t.volume = 100; + t.channelUp(); + t.volumeUp(); + System.out.println("CH:" + t.channel + ", VOL:" + t.volume); + } +} +//예상 결과 : CH: 100, VOL: 0 / CH: 99, VOL: 0 / CH: 100, VOL: 100 + +class Exercise6_20 { + + static int max(int[] arr) { + + if(arr == null || arr.length == 0) { + return -999999; + } + + int max = 0; + for(int i = 0; i < arr.length; i++) { + if(arr[i] > max) { + max = arr[i]; + } + } + return max; + } + public static void main(String[] args) { + int[] data = {3,2,9,4,7}; + System.out.println(java.util.Arrays.toString(data)); + System.out.println("최대값 :" + max(data)); + System.out.println("최대값 :" + max(null)); + System.out.println("최대값 :" + max(new int[]{})); // 크기가 0인 배열 } + } +} +//예상 결과 : 최대값: 9 / 최대값: -99999 최대값: -999999 +class Exercise6_21 { + + static int abs(int value){ + + if(value < 0) { + value = value * -1; + } + + return value; + } + + public static void main(String[] args) { + int value = 5; + System.out.println(value + "의 절대값 :" + abs(value)); + value = -10; + System.out.println(value + "의 절대값 :" + abs(value)); + } +} +//예상 결과 : 5의 절대값 : 5 / -10의 절대값 : 10 + diff --git a/src/hwj_report/Report08.java b/src/hwj_report/Report08.java new file mode 100644 index 0000000..a6bee1e --- /dev/null +++ b/src/hwj_report/Report08.java @@ -0,0 +1,207 @@ +package hwj_report; + +public class Report08 { + + public static void main(String[] args) { + System.out.println("Report08"); + } + +} + + +// 7-1 섯다카드 20장을 포함하는 섯다카드 한 벌(SutdaDeck클래스)을 정의한 것이다. +// 섯다카드 20장을 담는 SutdaCard배열을 초기화하시오. +// 단, 섯다카드는 1부터 10까지의 숫자 가 적힌 카드가 한 쌍씩 있고, 숫자가 1, 3, 8인 경우에는 둘 중의 한 장은 광(Kwang)이 어야 한다. +// 즉, SutdaCard의 인스턴스변수 isKwang의 값이 true이어야 한다. +class SutdaDeck { + final int CARD_NUM = 20; + SutdaCard[] cards = new SutdaCard[CARD_NUM]; + + SutdaDeck() { + for (int i = 0; i < cards.length; i++) { + int num = i % 10 + 1; // 이해가 되질 않음 + boolean Kwang = (i < 10) && (num == 1 || num == 3 || num == 8); + + cards[i] = new SutdaCard(num, Kwang); + + } + } + void shuffle() { + for (int i = 0; i < cards.length; i++) { + int cardNum = (int)Math.random() * cards.length; + + SutdaCard tmp = cards[i]; + cards[i] = cards[cardNum]; + cards[cardNum] = tmp; + } + + } + SutdaCard pick(int index) { + if(index < 0 || index >20) { + return null; + } + return cards[index]; + } + SutdaCard pick() { + int random = (int)(Math.random()*cards.length); + return cards[random]; + } + +} +class SutdaCard { + int num; + boolean isKwang; + + SutdaCard() { + this(1, true); + } + SutdaCard(int num, boolean isKwang) { + this.num = num; + this.isKwang = isKwang; + } + // info()대신 Object클래스의 toString()을 오버라이딩했다. + @Override + public String toString() { + return num + ( isKwang ? "K":""); + } +} +class Exercise7_1 { + public static void main(String args[]) { + SutdaDeck deck = new SutdaDeck(); + + for (int i = 0; i < deck.cards.length; i++) + System.out.print(deck.cards[i] + ","); + } +} +// 예상결과) 1K,2,3K,4,5,6,7,8K,9,10,1,2,3,4,5,6,7,8,9,10, + + +// 7-2. 연습문제 7-1. 의 SutdaDeck클래스에 다음에 정의된 새로운 메서드를 추가하고 테스트 하시오. +class Exercise7_2 { + public static void main(String args[]) { + SutdaDeck deck = new SutdaDeck(); + + System.out.println(deck.pick(0)); + System.out.println(deck.pick()); + deck.shuffle(); + + for(int i = 0; i < deck.cards.length; i++) + System.out.print(deck.cards[i]+","); + + System.out.println(); + System.out.println(deck.pick(0)); + } +} +//예상결과) +// 1K +// 7 +// 2,6,10,1K,7,3,10,5,7,8,5,1,2,9,6,9,4,8K,4,3K, +// 2 + + +// 7-3. 다음의 코드는 컴파일하면 에러가 발생한다. 그 이유를 설명하고 에러를 수정하기 위해서는 코드를 어떻게 바꾸어야 하는가? +class Product { + int price; // 제품의 가격 + int bonusPoint; // 제품구매 시 제공하는 보너스점수 + + // (구현) + Product () { + // 부모 클래스에 기본 생성자를 만들어 준다. + } + Product(int price) { + this.price = price; + bonusPoint = (int) (price / 10.0); + } +} +class Tv extends Product { + Tv() { +// super(1000); // 자식 클래스에서 인스턴스를 생성할 때 기본 생성자가 호출 되어야 한다. 그래서 조상의 생성자를 호출시킴!! + } + public String toString() { + return "Tv"; + } +} +class Exercise7_3 { + public static void main(String[] args) { + Tv t = new Tv(); + } +} + +// 7-4. MyTv클래스의 멤버변수 isPowerOn, channel, volume을 클래스 외부에서 접근할 수 없도록 제어자를 붙이고 대신 이 멤버변수들의 값을 어디서나 읽고 변경할 수 있도록 getter와 setter메서드를 추가하라. +// 7-5. 문제7-4에서 작성한 MyTv2클래스에 이전 채널(previous channel)로 이동하는 기능 의 메서드를 추가해서 실행결과와 같은 결과를 얻도록 하시오. +class MyTv2 { + private boolean isPowerOn; + private int channel; + private int volume; + private int prevChannel; + + final int MAX_VOLUME = 100; + final int MIN_VOLUME = 0; + final int MAX_CHANNEL = 100; + final int MIN_CHANNEL = 1; + + public void gotoPrevChannel() { + setChannel(prevChannel); + } + + public boolean isPowerOn() { + return isPowerOn; + } + + public void setPowerOn(boolean powerOn) { + isPowerOn = powerOn; + } + + public int getChannel() { + return channel; + } + + public void setChannel(int channel) { + if (channel > MAX_CHANNEL || channel < MIN_CHANNEL) { + return; + } + prevChannel = this.channel; + this.channel = channel; + } + + public int getVolume() { + return volume; + } + + public void setVolume(int volume) { + if (volume > MAX_VOLUME || volume < MIN_VOLUME) + return; + this.volume = volume; + } +} + +class Exercise7_4 { + public static void main(String args[]) { + MyTv2 t = new MyTv2(); + + t.setChannel(10); + System.out.println("CH:" + t.getChannel()); + t.setVolume(20); + System.out.println("VOL:" + t.getVolume()); + } +} +//예상결과) CH:10 VOL:20 + +class Exercise7_5 { + public static void main(String args[]) { + MyTv2 t = new MyTv2(); + + t.setChannel(10); + System.out.println("CH:" + t.getChannel()); + t.setChannel(20); + System.out.println("CH:" + t.getChannel()); + t.gotoPrevChannel(); + System.out.println("CH:" + t.getChannel()); + t.gotoPrevChannel(); + System.out.println("CH:" + t.getChannel()); + } +} +// CH:10 +// CH:20 +// CH:10 +// CH:20 \ No newline at end of file diff --git "a/src/hwj_report/\353\241\234\352\267\270\354\235\270 \354\260\250\355\212\270 \355\224\214\353\241\234\354\232\260.png" "b/src/hwj_report/\353\241\234\352\267\270\354\235\270 \354\260\250\355\212\270 \355\224\214\353\241\234\354\232\260.png" new file mode 100644 index 0000000..5459750 Binary files /dev/null and "b/src/hwj_report/\353\241\234\352\267\270\354\235\270 \354\260\250\355\212\270 \355\224\214\353\241\234\354\232\260.png" differ