스프링부트 자바 기반 웹개발 day 1
지역변수 : 메서드 안에서 선언해주는 변수
*선언 : 자료형 변수이름(선언)
*초기화 : = xx
변수 -> 한 가지 자료형 단 한 개
배열 -> 한 가지 자료형을 여러 개 저장
원시 타입 / 참조 타입
원시타입 : 순수하게 메모리 방에 값이 저장되어 있다
참조타입 : 메모리방에 주소값이 한개 들어가 있다
int num = 10;
int[] arr = new int[5];
얕은 복사 vs. 깊은 복사
int[] arr = {10, 20, 30, 40, 50}; // new가 없는 게 아니라 생략되어 있고 컴퓨터가 자동으로 만들었다고 봄
얕은 복사
int[] arr3 = arr2;
arr3[2] = 300;
=> arr2[2], arr3[2] => 300이라는 값을 갖는다.
=> 얕은 복사 : 같은 주소값을 참조하고 있는 참조 변수에서 한쪽에서 값을 수정하면 다른 쪽도 수정이 된다.
깊은 복사
- 기존 값을 건들이지 않았으면 할 때
int[] arr4 = new int[arr2.length]; => [0, 0, 0, 0, 0] 갖고 있음
for (int i =0 ;i < arr4.length; i++){
arr4[i] = arr2[i];
}
새로운 방을 만들어서 넣어주었기 때문에 참조하는 주소값이 다르므로
arr4[4] =500;
변경을 했을 때
arr2는 바뀌지 않는다.
원시타입의 경우 깊은 복사
int num2 = 100;
int num3 = num2;
num3 = 200;
num2는 바뀌지 않는다.
=> 원시타입은 전부 깊은 복사
배열 연습 문제 1
package day2;
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.IntStream;
public class ArrayTest1 {
public static void main(String[] args) {
problem4();
}
private static void problem1() {
int a[] = {10, 49, 51, 36, 17};
// 문제 1) 다음 리스트를 값을 입력하면 번호 출력
// 예) 51 ==> 2
// 예) 10 ==> 0
// 추가조건 : 없는 값을 입력했을시 "값이 존재하지 않습니다"를 출력
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
// Arrays.stream(a)
// .filter(v -> v == number)
// .mapToObj(idx -> String.format("%d", a[idx]))
// .forEach(System.out::println);
//// .orElseThrow(()->new IllegalArgumentException("값이 존재하지 않습니다"));
// System.out.println(found);
//
// System.out.println(IntStream.range(0, a.length)
// .mapToObj(v -> a[v] == number)
// .filter(v->v==true)
// .map(v->String.format("%d", v)).findFirst().toString());
//// .
//// .forEach(System.out::println);
//// .orElseThrow(()->new IllegalArgumentException("값이 존재하지 않습니다"));
}
private static void problem2() {
// 문제 2) 다음 리스트를 이용해서 a 의 값중 홀수만 b 에 저장(위치는 동일한위치에 저장)
// 예) b = [0, 49, 51, 0, 17]
int a[] = {10, 49, 51, 36, 17};
int b[] = {0, 0, 0, 0, 0};
for (int i = 0; i < a.length; i++) {
if (isOddNumber(a[i])) {
b[i] = a[i];
}
}
System.out.println(Arrays.toString(b));
}
private static boolean isOddNumber(int a) {
return a % 2 != 0;
}
private static void problem3() {
// 문제 3) 다음 리스트를 이용해서 a 의 값중 홀수만 c 에 저장(위치는 앞에서 부터 저장)
// 2번문제와 조금 다름
// 예) c = [49, 51, 17, 0, 0]
int a[] = {10, 49, 51, 36, 17};
int c[] = {0, 0, 0, 0, 0};
int count = 0;
for (int i = 0; i < a.length; i++) {
if (isOddNumber(a[i])) {
c[count++] = a[i];
}
}
System.out.println(Arrays.toString(c));
}
private static void problem4() {
//-------------------------------------------------
int arr[] = {1001, 20, 1002, 45, 1003, 54};
// 학번과 점수가 한쌍이다. ==> 1001:20 , 1002:45 , 1003:54
// 문제4) 학번을 입력하면 점수 출력
// 예) 1001==>20 , 1003 ==> 54
Scanner scanner = new Scanner(System.in);
int studentId = scanner.nextInt();
// solution 1
for (int i = 0; i < arr.length / 2; i++) { // 0 2 4
if (arr[i * 2] == studentId) {
System.out.printf("%d => %d\n", studentId, arr[i * 2 + 1]);
}
}
// solution 2
for (int i =0; i<arr.length; i+=2){
if (arr[i] == studentId) {
System.out.println(arr[i + 1]);
}
}
// solution 3
// for (int i = 0; i < arr.length; i++) { // 0 2 4
// if (isOddNumber(i)) {
// continue;
// }
// if (arr[i] == studentId) {
// System.out.println(arr[i + 1]);
// }
// }
}
private static void problem5() {
// 문제5) 점수를 입력하면 학번 출력
// 예) 20 ==> 1001 , 45 ==> 1002
int arr[] = {1001, 20, 1002, 45, 1003, 54};
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
for (int i = 0; i < arr.length; i++) { // 0 2 4
if (!isOddNumber(i)) {
continue;
}
if (arr[i] == score) {
System.out.println(arr[i - 1]);
}
}
}
}
배열 문제 2
package day2;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayTest2 {
public static void main(String[] args) {
problem1();
problem2();
problem3();
problem4();
}
private static void problem1() {
// 문제1) 인덱스(방번호)를 입력하면 값출력
int a[] = {10, 20, 30, 40, 50};
// 예) 3 ==> 40
int number = getInputNumber();
System.out.println(a[number]);
}
private static int getInputNumber() {
Scanner scanner = new Scanner(System.in);
return scanner.nextInt();
}
private static void problem2() {
// 문제2) 아래배열중 가장큰값 출력
int b[] = {12, 54, 23, 87, 1};
// 예) 87
int max = 0;
for (int number : b) {
if (number > max) {
max = number;
}
}
System.out.println(max);
}
private static void problem3() {
// 문제3) 아래 배열중 홀수의 개수 출력
int c[] = {12, 54, 23, 87, 1};
// 예) 홀수의 개수 : 3
int oddCounts = 0;
for (int i = 0; i < c.length; i++) {
if (isOddNumber(c[i])) {
oddCounts++;
}
}
System.out.println(oddCounts);
}
private static boolean isOddNumber(int a) {
return a % 2 != 0;
}
private static void problem4() {
// 문제4) 아래배열을 거꾸로 저장
int d[] = {1, 2, 3, 4, 5};
int e[] = {0, 0, 0, 0, 0};
//예) ={5,4,3,2,1};
int idx = 0;
for (int i = d.length - 1; i >= 0; i--) {
e[idx++] = d[i];
}
System.out.println(Arrays.toString(e));
}
}
배열 문제 3
package day2;
import java.util.Arrays;
public class ArrayTest3 {
public static void main(String[] args) {
problem3();
problem3();
problem1();
}
private static void problem3() {
// 문제3) 아래는 시험결과 이다 시험에 합격한 사람의 번호만 win2 에 저장 (60점이상 합격)
int data[] = {1001, 80, 1002, 23, 1003, 78};
int win2[] = {0, 0, 0};
// 예) win2[] = {1001, 1003, 0};
int count = 0;
for (int i = 0; i < data.length/2; i++) { // 1 3 5
if (data[i*2+1] >=60){
win2[count++] = data[i*2];
}
}
System.out.println(Arrays.toString(win2));
}
private static void problem2() {
// 문제2) 아래는 시험결과 이다. 시험에 합격한사람의 번호만 win 에 저장 (60점이상합격)
int num[] = {1001, 1002, 1003};
int score[] = {50, 83, 78};
int win[] = {0, 0, 0};
// 예) win[]= {1002, 1003, 0};
int count = 0;
for (int i=0; i< score.length; i++){
if (score[i] >= 60){
win[count++] = num[i];
}
}
System.out.println(Arrays.toString(win));
}
private static void problem1() {
// 문제 1) 아래 배열 a 와 b 를 비교해서 둘의 합이 짝수 일때만 c에 저장
//
int a[] = {10, 20, 30, 40, 50};
int b[] = {13, 54, 17, 42, 1};
int c[] = {0, 0, 0, 0, 0};
// 예) c[] = {74,82,0,0,0}
int idx =0;
for (int i =0;i <a.length;i++){
if ( (a[i] + b[i]) % 2 == 0) {
c[idx++] = a[i] + b[i];
}
}
System.out.println(Arrays.toString(c));
}
}
배열 문제 4
package day2;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayTest4 {
public static void main(String[] args) {
problem1();
problem2();
}
private static void problem1() {
// 문제 1) 아래 배열 a 에서 내가 입력한 값만 빼고 b 에 저장
int a[] = {10, 20, 30, 40, 50};
int b[] = {0, 0, 0, 0, 0};
// 예) 30 ==> b[] = {10,20,40,50,0};
int idx = 0;
int inputNumber = getInputNumber();
for (int number : a) {
if (number == inputNumber) {
continue;
}
b[idx++] = number;
}
if (idx == 5) {
System.out.println("배열에 없는 값을 입력했습니다!");
return;
}
System.out.println(Arrays.toString(b));
}
private static void problem2() {
// 문제 2) 아래 배열에서 내가 입력한 번호 와 값 만 빼고 d 에 저장
int c[] = {1001, 40, 1002, 65, 1003, 70};
int d[] = {0, 0, 0, 0, 0, 0};
// 예) 1002 ==> d[] = {1001, 40, 1003, 70 , 0, 0};
int idx = 0;
int inputNumber = getInputNumber();
for (int i = 0; i < c.length / 2; i++) {
if (c[i * 2] == inputNumber) {
continue;
}
d[idx++] = c[i * 2];
d[idx++] = c[i * 2 + 1];
}
if (idx == 6) {
System.out.println("배열에 없는 값을 입력했습니다!");
return;
}
System.out.println(Arrays.toString(d));
}
private static int getInputNumber() {
Scanner scanner = new Scanner(System.in);
return scanner.nextInt();
}
}
배열 문제 5
package day2;
import java.util.Arrays;
public class ArrayTest5 {
public static void main(String[] args) {
problem1();
problem2();
problem3();
}
private static void problem1() {
// 문제1) a의 값과 b의 값을 번갈아가면서 c에 저장
// 예) c = {10,40,20,50,30,60}
int a[] = {10, 20, 30};
int b[] = {40, 50, 60};
int c[] = {0, 0, 0, 0, 0, 0};
// solution 1
int idx = 0;
for (int i = 0; i <= a.length - 1; i++) {
c[idx++] = a[i];
c[idx++] = b[i];
}
System.out.println(Arrays.toString(c));
// solution 2
for (int i = 0; i < a.length; i++) {
c[i * 2] = a[i];
c[i * 2 + 1] = b[i];
}
System.out.println(Arrays.toString(c));
}
private static void problem2() {
// 문제 2) aa 배열의 값들을 앞으로 한칸씩 당기고 맨뒤에 bb의 값을 저장
int aa[] = {10, 20, 30, 40, 50};
int bb = 90;
// 예) aa = {20,30,40,50,90};
for (int i = 0; i < aa.length - 1; i++) {
aa[i] = aa[i + 1];
}
aa[aa.length - 1] = bb;
System.out.println(Arrays.toString(aa));
}
private static void problem3() {
// 문제 3) cc 의 배열을 뒤로 하나씩 밀어낸후 맨 앞에 dd의 값을 저장
int cc[] = {10, 20, 30, 40, 50};
int dd = 60;
// 예) cc[] = {60,10,20,30,40};
for (int i = cc.length - 1; i > 0; i--) {
cc[i] = cc[i - 1];
}
cc[0] = dd;
System.out.println(Arrays.toString(cc));
}
}
for loop 을 instream을 이용해 풀이하기
private static void problem1() {
int a[] = {10, 49, 51, 36, 17};
// 문제 1) 다음 리스트를 값을 입력하면 번호 출력
// 예) 51 ==> 2
// 예) 10 ==> 0
// 추가조건 : 없는 값을 입력했을시 "값이 존재하지 않습니다"를 출력
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
try {
int answer = IntStream.range(0, a.length)
.filter(v -> a[v] == number)
.boxed()
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("값이 존재하지 않습니다"));
System.out.println(answer);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
2차원 배열
int[] arr = {10, 20, 30, 40};
=> arr에 new를 해서 배열을 만들고 그 주소값을 넣은 상태
int[][] darr = new int[3][2];
=> 2차원 배열은 주소값을 두번 참조한다
=> 첫 번째 3개 짜리 방이 먼저 만들어지고
=> 두 번째 2개짜리 방이 만들어지고
=> 첫번째 배열은 두 번째 배열의 주소만 저장함
darr[0] = 주소값
=> 서로 다른 크기의 배열이 가능해지고
=> x를 더이상 참조하지 않기 때문에 x는 garbage collector가 정리한다
int[][] darr2 = new int[2][];
2개의 방이 만들지고
| null |
| ---- |
| null |
이 생성되어 있음
darr2[0] = new int[3]
darr2[1] = arr; // 얕은 복사
System.out.print(darr2);
=> 주소값 2개가 출력된다 !
=>[ [x] , [y] ]
이중 반복문을 돌릴 때
첫 번째는 처음 만들어진 방의 크기 = > darr.length
두번째는 두번째 만들어진 방의 크기 => darr[i].length
for (int i =0; i < darr2.length; i++) {
for (int j = 0; j< darr2[i].lenght) {
sout(darr2[i][j]);
}
}
2차원 배열 기본 문제
package day2;
public class DArrayTest1 {
public static void main(String[] args) {
int[][] arr = new int[3][3];
int k = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
arr[i][j] = 10 * k;
k += 1;
}
}
problem1(arr);
problem2(arr);
problem3(arr);
problem4(arr);
}
private static void problem4(int[][] arr) {
// 문제 4) 4의 배수의 개수 출력
// 정답 4) 4
int count = 0;
for (int[] numbers : arr) {
for (int number : numbers) {
if (number % 4 == 0) {
count++;
}
}
}
System.out.println(count);
}
private static void problem3(int[][] arr) {
// 문제 3) 4의 배수의 합 출력
// 정답 3) 200
int sum = 0;
for (int[] numbers : arr) {
for (int number : numbers) {
if (number % 4 == 0) {
sum += number;
}
}
}
System.out.println(sum);
}
private static void problem2(int[][] arr) {
// 문제 2) 4의 배수만 출력
// 정답 2) 20 40 60 80
StringBuilder stringBuilder = new StringBuilder();
for (int[] numbers : arr) {
for (int number : numbers) {
if (number % 4 == 0) {
stringBuilder.append(number).append(" ");
}
}
}
System.out.println(stringBuilder);
}
private static void problem1(int[][] arr) {
// 문제 1) 전체 합 출력
// 정답 1) 450
int sum = 0;
for (int[] numbers : arr) {
for (int number : numbers) {
sum += number;
}
}
System.out.println(sum);
}
}
package day2;
import java.util.Scanner;
public class DArrayTest2 {
public static void main(String[] args) {
int[][] apt = {
{101, 102, 103},
{201, 202, 203},
{301, 302, 303}
};
int[][] pay = {
{1000, 2100, 1300},
{4100, 2000, 1000},
{3000, 1600, 800}
};
problem1(pay);
problem2(apt, pay);
problem3(apt, pay);
problem4(apt, pay);
}
private static void problem4(int[][] apt, int[][] pay) {
// 문제 4) 호 2개를 입력하면 관리비 교체
Scanner scanner = new Scanner(System.in);
int room1 = scanner.nextInt();
int room2 = scanner.nextInt();
int room1i = 0;
int room1j = 0;
int room2i = 0;
int room2j = 0;
boolean found1 = false;
boolean found2 = false;
for (int i = 0; i < apt.length; i++) {
for (int j = 0; j < apt[i].length; j++) {
if (apt[i][j] == room1) {
room1i = i;
room1j = j;
found1 = true;
}
if (apt[i][j] == room2) {
room2i = i;
room2j = j;
found2 = true;
}
}
}
int temp = pay[room1i][room1j];
pay[room1i][room1j] = pay[room2i][room2j];
pay[room2i][room2j] = temp;
if (!found1 || !found2) {
System.out.println("찾는 호실 없음 !");
return;
}
System.out.println(pay[room1i][room1j]);
System.out.println(pay[room2i][room2j]);
}
private static void problem3(int[][] apt, int[][] pay) {
// 문제 3) 관리비가 가장 많이 나온 집, 적게 나온 집 출력
// 정답 3) 가장 많이 나온 집(201), 가장 적게 나온 집(303)
int maxPayment = 0;
int maxRoom = 0;
int minPayment = pay[0][0];
int minRoom = 0;
for (int i = 0; i < apt.length; i++) {
for (int j = 0; j < apt[i].length; j++) {
int paymentEach = pay[i][j];
if (paymentEach > maxPayment) {
maxRoom = apt[i][j];
maxPayment = paymentEach;
}
if (paymentEach < minPayment) {
minRoom = apt[i][j];
minPayment = paymentEach;
}
}
}
System.out.printf("%d %d, %d %d\n", maxRoom, maxPayment, minRoom, minPayment);
}
private static void problem2(int[][] apt, int[][] pay) {
// 문제 2) 호를 입력하면 관리비 출력
// 예 2) 입력 : 202 관리비 출력 : 2000
Scanner scanner = new Scanner(System.in);
int requestedRoom = scanner.nextInt();
for (int i = 0; i < apt.length; i++) {
for (int j = 0; j < apt[i].length; j++) {
if (apt[i][j] == requestedRoom) {
System.out.print(pay[i][j] + "\n");
return;
}
}
}
System.out.println("찾는 호수가 없습니다!");
}
private static void problem1(int[][] pay) {
// 문제 1) 각층별 관리비 합 출력
// 정답 1) 4400, 7100, 5400
for (int[] payByFloor : pay) {
int floorPaySum = 0;
for (int payEach : payByFloor) {
floorPaySum += payEach;
}
System.out.print(floorPaySum + " ");
}
}
}
문자열
자바 lang pkg는 자동으로 import가 된다.
// import java.lang.*;
String name = "홍길동";
=> 기본형은 색깔이 바뀐다.
=> String은 바뀌지 않음 = 객체임
=> 주소 값을 가지고 있음
그런데 왜
sout(name); => 값이 나올까?
클래스에서 overriding을 통해
미리 변경을 해주었기 때문에
String => heap 저장 // String pool에 별도로 저장
String name1 = "홍길동";
String name2 = "홍길동";
같은 것을 저장한 두 개의 String에 대해서 비교 연산을 해보면 ?
sout(name1 == name2);
true가 나온다 !
=> String pool에 같은 값이 확인된다면 다른 방을 만드는 것이 아니라 해당 주소 값을 할당한다.
하지만 Scanner나 new String을 통해 생성한 string 값은 새로운 주소와 저장공간을 할당하기 때문에 false가 나온다.
String의 주소값을 출력하기
System.out.println(System.identityHashCode(name1));
순수하게 값을 비교하기
String 클래스 내의 equals 메서드를 이용한다.
System.out.println(name1.equals(name2));
System.out.println(name1.equals(myName));
System.out.println(name1.equals(name3));
과거의 방식 :
char[] myName = {'홍', '길', '동'};
문자열과 배열의 차이점 => 문자열은 읽기 전용 배열이다.
myName = [1] = '현';
=> 개별적인 변경이 가능하다.
문자열은 통째로 바꿔야 함.
문자열 비교하기
숫자값이 나온다.
=> 자동형변환을 통해 유니코드 방식의 숫자끼리 빼준 값
같은 결과
System.out.println(a1 - a1);
System.out.println(a1 - a2);
System.out.println(a3 - a2);
결과 값이
0 -> 같은 문자
음수 -> 기준 문자열이 사전적으로 앞선 순위다
양수 -> 기준 문자열이 사전적으로 후순윈다
=> 이 논리를 기반으로 문자열 비교 로직을 구현한다.
package day2.string;
import java.util.Arrays;
public class StringTest1 {
public static void main(String[] args) {
int[] scores = {11, 87, 54, 63, 100, 2};
// 100 87 63 54 11 2
// bubbleSort2(scores);
problem1();
}
private static void problem1() {
// 문제 ) 사전 순으로 이름 정렬
String[] names = {"홍길동", "김유신", "마동석", "자바킹", "서동요"};
// // solution 1
// int[] nameAsNumbers = new int[5];
// for (int i = 0; i < names.length; i++) {
// for (int j = 0; j < names[i].length(); j++) {
// nameAsNumbers[i] += names[i].charAt(j);
// }
// }
// solution 2
for (int i = 0; i < names.length; i++) {
for (int j = i; j < names.length; j++) {
if(names[i].compareTo(names[j]) > 0){
// 값교체
String temp = names[i];
names[i] = names[j];
names[j] = temp;
}
}
}
System.out.println(Arrays.toString(names));
}
private static void bubbleSort(int[] scores) {
for (int i = 0; i < scores.length; i++) {
for (int j = 0; j < scores.length; j++) {
if (scores[i] > scores[j]) {
int temp = scores[i];
scores[i] = scores[j];
scores[j] = temp;
}
}
}
System.out.println(Arrays.toString(scores));
}
private static void bubbleSort2(int[] scores) {
for (int i = 0; i < scores.length; i++) {
for (int j = i; j < scores.length; j++) {
if (scores[i] < scores[j]) {
int temp = scores[i];
scores[i] = scores[j];
scores[j] = temp;
}
}
}
System.out.println(Arrays.toString(scores));
}
}
입력 버퍼를 알아보자
Scanner를 사용할 때
nextInt와 next만 쓰면 문제가 안된다.
nextLine을 쓸 때 문제가 됨 !
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
String name = scanner.next();
System.out.println(age);
System.out.println(name);
next => ' ' 전까지만 가져옴
nextLine => '\n'까지 가져옴
scanner.nextLine() => 이거만 사용하여 \n 전까지 삭제해줌
'교육 > Java&Spring' 카테고리의 다른 글
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 11 (0) | 2023.01.03 |
---|---|
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 10 (0) | 2023.01.02 |
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 9 (0) | 2022.12.30 |
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 8 (0) | 2022.12.30 |
kosta 클라우드 네이티브 애플리케이션 개발 과정 day 7 (0) | 2022.12.28 |