본문 바로가기
TIL/JAVA

23.05.22

by J1-H00N 2023. 5. 22.

java, 알고리즘 스터디를 위한 새로운 팀이 만들어졌다. 모두 활기차고 밝은 성격인 것 같아 다행이다. 팀 과제에서 누가 되지 않도록 java 문법 종합반 강의를 이수할 예정. 초반부 내용은 최근에 이미 짚고 넘어간 내용이라 빠르게 훑고 지나가고, 후반부 내용을 천천히, 여러 번 들을 계획이다.

 

1주차 강의는 따로 필기 사항X

1주차 숙제에서 이미 아는 내용을 추가해 더 그럴듯하게 구현했다. 이마저도 2주차부터는 기존 기능도 제대로 구현하기 빠듯하지 않을까 싶다.

package sparta_nbc.HW;
/*
요리 레시피 메모장 만들기

입력값
- 내가 좋아하는 요리 제목을 먼저 입력합니다.
- 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해주세요. (ex. 3.5)
- 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.

출력값
- 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
- 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해줍니다. (ex. 3)
- 바로 뒤에 정수별점을 5점만점 퍼센트로 표현했을 때 값을 실수로 출력해줍니다. (ex. 60.0%)
- 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력 해줍니다.

ex)
입력 예시
백종원 돼지고기 김치찌개 만들기
4.5
돼지고기는 핏물을 빼주세요.
잘익은 김치 한포기를 꺼내서 잘라주세요.
냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
다진마늘 한스푼, 설탕 한스푼 넣어주세요.
종이컵으로 물 8컵 부어서 센불에 끓여주세요.
핏물 뺀 돼지고기를 넣어주세요.
된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
중불로 줄여서 오래 끓여주세요~!!
마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^

출력 예시
[ 백종원 돼지고기 김치찌개 만들기 ]
별점 : 4 (80.0%)
1. 돼지고기는 핏물을 빼주세요.
2. 잘익은 김치 한포기를 꺼내서 잘라주세요.
3. 냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
4. 다진마늘 한스푼, 설탕 한스푼 넣어주세요.
5. 종이컵으로 물 8컵 부어서 센불에 끓여주세요.
6. 핏물 뺀 돼지고기를 넣어주세요.
7. 된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
8. 간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
9. 중불로 줄여서 오래 끓여주세요~!!
10. 마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^
*/

import java.util.Scanner;

public class HW_01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 터미널에서 입력값을 받아오기 위해 Scanner 사용

        System.out.println("레시피 이름을 입력합니다");
        String recipe_name = scanner.nextLine();

        System.out.println("레시피의 점수를 입력합니다");
        double star = scanner.nextDouble();
        String percent = (int)(star*20)+"%"; // %형태로 만들기 위해 20을 곱한뒤 정수형으로 바꿔주기, 자동 형변환

        scanner.nextLine();

        System.out.println("레시피 10줄을 입력합니다.");
        String[][] recipe = new String[10][2]; // 두 칸짜리 자료 10줄 생성
        for (int i = 0; i < 10; i++) {
            recipe[i][0] = (i + 1) + ". "; // i 번째 줄 첫째칸은 i. 으로 지정, 문자열을 붙이면 자동 형변환
            recipe[i][1] = scanner.nextLine(); // i번째 줄 둘째칸은 레시피 적기
        }
        scanner.close(); // 뒤에는 스캐너 사용이 없으므로 닫기 // 굳이 넣을 필요는 없음.
        System.out.println();

        System.out.println("[ " + recipe_name + " ]");
        System.out.print(star);
        System.out.println(" (" + percent + ")"); // 별점 뒤에 한 칸 띄우기
        for (int i = 0; i < 10; i++) {
            System.out.println(recipe[i][0] + recipe[i][1]);
        }
    }
}
더보기

발생한 문제점

레시피가 출력될 때 

1. 

2. ~~~

3. ~~~

와 같이 첫 번째 줄이 공백으로 출력되는 문제 발생

 

시도해본 것들

1. 별점과 레시피 사이 코드에서 문제가 생긴거라 생각해 system.out.println(); , system.out.print();을 추가해 봤으나 칸이 띄어지는 것 말고는 변경사항 없었음.

2. 반복문에서 문제가 생겼다고 생각해

for (int i = 1; i <= 10; i++) {
            recipe[i-1][0] = i + ". ";
            recipe[i-1][1] = scanner.nextLine();
        }

 위와 같이 수정했으나 똑같은 문제 발생

3. 마찬가지로 반복문이 문제라 생각해 번호를 매기는 반복문과 레시피 입력 반복문을 분리해봄.

for (int i = 0; i < 10; i++) {
            recipe[i][0] = (i + 1) + ". ";
        }
        
for (int i = 0; i < 10; i++) {
			recipe[i][1] = scanner.nextLine();
        }

여전히 문제 발생

 

해결 방법

검색 결과 .nextDouble(), .nextFloat() 등이 한 줄 띄우는 기능을 포함하고 있어 scanner.nextLine()을 추가해 한 줄 공백을 소비해 해결했다.

 

알게 된 점

.nextDouble(), .nextFloat() 등이 한 줄 띄우는 기능을 포함하고 있다는 것, 그것을 nextLine()을 추가해 소비할 수 있다는 것

array부터는 헷갈리는 부분이 있기에 코드를 실행하며 복습

문자열(array)

package sparta_nbc.Syntax.array;

import java.util.Arrays;

public class Arr_01 {
    public static void main(String[] args) {
        // 얕은 복사 : 참조형 변수의 주소값만 복사하는 것
        int[] a = { 1, 2, 3, 4 };
        int[] b = a; // 얕은 복사

        b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)

        System.out.println(a[0]); // 출력 3  <- a 배열의 0번째 순번값도 3으로 조회됩니다.

        // 깊은 복사 : 배열의 길이나 크기같은 성질만 복사하고 주소는 따로 만드는 것

        int[] a_2 = { 1, 2, 3, 4 };
        int[] b_2 = new int[a.length];

        for (int i = 0; i < a_2.length; i++) {
            b_2[i] = a_2[i]; // 깊은 복사
        }

        b_2[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)

        System.out.println(a_2[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.

        // 1. clone() 메서드
        int[] a_3 = { 1, 2, 3, 4 };
        int[] b_3 = a_3.clone(); // 가장 간단한 방법입니다.
        // 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!

        // 2. Arrays.copyOf() 메서드
        int[] a_4 = { 1, 2, 3, 4 };
        int[] b_4 = Arrays.copyOf(a_4, a_4.length); // 배열과 함께 length값도 같이 넣어줍니다.

        a_4[3] = 0;
        System.out.println(a_4[3]); // 0
        System.out.println(b_4[3]); // 4
    }
}

가변 배열

package sparta_nbc.Syntax.array;

public class Arr_02 {
    public static void main(String[] args) {
        // 가변 배열 : 열의 길이를 생략하여 행마다 다른 길이의 배열을 요소로 저장할 수 있다.

        // 선언 및 초기화
        // int[][] array = new int[3][];
        // 배열 원소마다 각기다른 크기로 지정 가능합니다.
        // array[0] = new int[2];
        // array[1] = new int[4];
        // array[2] = new int[1];

        // 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
        // int[][] array2 = {
        //         {10, 20},
        //         {10, 20, 30, 40},
        //         {10}
        //
        // };

        // 가변 2차원 배열 조회
        int[][] array = {
                {10, 20, 30},
                {10, 20, 30, 40},
                {10, 20}
        };

        for (int i = 0; i < array.length; i++) { // 1차원 길이
            for (int j = 0; j < array[i].length; j++) { // 2차원 길이
                System.out.println(array[i][j]); // 2중 반복문으로 i, j 인덱스 순회
            }
        }
//        10
//        20
//        30
//        10
//        20
//        30
//        40
//        10
//        20
    }
}

 

 

컬렉션

기능 : 크기 자동조정/ 추가/ 수정/ 삭제/ 반복/ 순회/ 필터/ 포함확인 등….

  • 컬렉션 종류
    • Collection 에는 List, Set , Queue , Map 이 있습니다.
    • List : 순서가 있는 데이터의 집합 (데이터 중복 허용) - 배열과 비슷
    • Queue : 터널처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합
      • First In First Out : 먼저들어간 순서대로 값을 조회할 수 있다.
    • Set : 순서가 없는 데이터의 집합 (데이터 중복 허용 안함) - 순서없고 중복없는 배열
    • Map : 순서가 없는 (Key,Value) 쌍으로 이루어진 데이터의 집합 (Key값 중복 허용 안함)

컬렉션은 참조형 변수를 저장한다. (int의 참조형 Integer, long의 참조형 Long, double의 참조형 Double, ... )

 

List

ArrayList : array는 크기가 정해져 있는 정적배열이고 ArrayList는 크기가 변하는 동적배열이다.

// ArrayList 
// (사용하기 위해선 import java.util.ArrayList; 를 추가해야합니다.)
import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {
		ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 및 생성
		
		intList.add(1);
		intList.add(2);
		intList.add(3);
		
		System.out.println(intList.get(0)); // 1 출력
		System.out.println(intList.get(1)); // 2 출력
		System.out.println(intList.get(2)); // 3 출력
		System.out.println(intList.toString()); // [1,2,3] 출력
		
		intList.set(1, 10); // 1번순번의 값을 10으로 수정합니다.
		System.out.println(intList.get(1)); // 10 출력
		
		
		intList.remove(1); // 1번순번의 값을 삭제합니다.
		System.out.println(intList.toString()); // [1,3] 출력
		
		intList.clear(); // 전체 값을 삭제합니다.
		System.out.println(intList.toString()); // [] 출력
	}
}

LinkedList : 기능적으로 ArrayList와 동일하나 값을 나누어 담아 저장하는 방식 때문에 조회하는 속도가 느리다. 대신 값을 중간에 추가하거 삭제할때는 빠르다.

// LinkedList 
// (사용하기 위해선 import java.util.LinkedList; 를 추가해야합니다.)
import java.util.LinkedList;

public class Main {

	public static void main(String[] args) {
		LinkedList<Integer> linkedList = new LinkedList<>(); // 선언 및 생성

		linkedList.add(1);
		linkedList.add(2);
		linkedList.add(3);

		System.out.println(linkedList.get(0)); // 1 출력
		System.out.println(linkedList.get(1)); // 2 출력
		System.out.println(linkedList.get(2)); // 3 출력
		System.out.println(linkedList.toString()); // [1,2,3] 출력 (속도 느림)

		linkedList.add(2, 4); // 2번 순번에 4 값을 추가합니다.
		System.out.println(linkedList); // [1,2,4,3] 출력

		linkedList.set(1, 10); // 1번순번의 값을 10으로 수정합니다.
		System.out.println(linkedList.get(1)); // 10 출력

		linkedList.remove(1); // 1번순번의 값을 삭제합니다.
		System.out.println(linkedList); // [1,4,3] 출력

		linkedList.clear(); // 전체 값을 삭제합니다.
		System.out.println(linkedList); // [] 출력
	}
}

Stack : 상자 쌓기처럼 밑에서부터 쌓고 위에서부터 꺼내는 형식. 이러한 형식 때문에 넣기(push()), 조회(peek()), 꺼내기(pop()) 기능만 존재. 최근 데이터 순으로 나열하거나 데이터의 중복을 막고 싶을 때 이용

// Stack 
// (사용하기 위해선 import java.util.Stack; 를 추가해야합니다.)
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		Stack<Integer> intStack = new Stack<Integer>(); // 선언 및 생성
		
		intStack.push(1);
		intStack.push(2);
		intStack.push(3);

		while (!intStack.isEmpty()) { // 다 지워질때까지 출력
		    System.out.println(intStack.pop()); // 3,2,1 출력
		}

		// 다시 추가
		intStack.push(1);
		intStack.push(2);
		intStack.push(3);
		
		// peek()
		System.out.println(intStack.peek()); // 3 출력
		System.out.println(intStack.size()); // 3 출력 (peek() 할때 삭제 안됬음)
		
		// pop()
		System.out.println(intStack.pop()); // 3 출력
		System.out.println(intStack.size()); // 2 출력 (pop() 할때 삭제 됬음)		
		
		System.out.println(intStack.pop()); // 2 출력
		System.out.println(intStack.size()); // 1 출력 (pop() 할때 삭제 됬음)		

		while (!intStack.isEmpty()) { // 다 지워질때까지 출력
		    System.out.println(intStack.pop()); // 1 출력 (마지막 남은거 하나)
		}
	}
}

 

Queue

First In First Out : 먼저들어간 순서대로 값을 조회할 수 있다.

위 형식 때문에 stack과 비슷하게 넣고(add()) 조회(peek())하고 빼는(poll()) 기능만 있다.(차이점은 Stack은 마지막에 넣은게 먼저 빠지고 Queue는 마지막에 넣은게 마지막에 빠짐)

인터페이스(생성자)가 없기에 바로 생성은 불가능

자식 클래스인 LinkedList를 사용하여 생성

// Queue 
// (사용하기 위해선 java.util.LinkedList; 와 import java.util.Queue; 를 추가해야합니다.)
import java.util.LinkedList;
import java.util.Queue;

public class Main {

	public static void main(String[] args) {
    	// LinkedList 를 생성하면 Queue 기능을 할 수 있습니다.
		Queue<Integer> intQueue = new LinkedList<>(); // 선언 및 생성

		intQueue.add(1);
		intQueue.add(2);
		intQueue.add(3);

		while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
			System.out.println(intQueue.poll()); // 1,2,3 출력
		}

		// 다시 추가
		intQueue.add(1);
		intQueue.add(2);
		intQueue.add(3);

		// peek()
		System.out.println(intQueue.peek()); // 1 출력 (맨먼저 들어간값이 1 이라서)
		System.out.println(intQueue.size()); // 3 출력 (peek() 할때 삭제 안됬음)

		// poll()
		System.out.println(intQueue.poll()); // 1 출력
		System.out.println(intQueue.size()); // 2 출력 (poll() 할때 삭제 됬음)

		System.out.println(intQueue.poll()); // 2 출력
		System.out.println(intQueue.size()); // 1 출력 (poll() 할때 삭제 됬음)

		while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
			System.out.println(intQueue.poll()); // 3 출력 (마지막 남은거 하나)
		}
	}
}

 

집합 : 순서 상관 X, 중복 허용 X
그냥 쓸 수도 있으나 HashSet, TreeSet 등으로 응용해서 같이 사용 가능
Set은 Queue와 같이 인터페이스(생성자)가 없어서 혼자 사용 불가능
생성자가 존재하는 HashSet을 사용해서 구현 가능

package sparta_nbc.Syntax.collection;

import java.util.HashSet;
import java.util.Set;

public class _Set {
    public static void main(String[] args) {
        // 집합 : 순서 상관 X, 중복 허용 X
        // Set -> 그냥 쓸 수도 있으나 HashSet, TreeSet 등으로 응용해서 같이 사용 가능
        // Set은 Queue와 같이 인터페이스가 없어서 혼자 사용 불가능
        // 생성자가 존재하는 HashSet을 사용해서 구현 가능

        Set<Integer> intSet = new HashSet<>(); // 선언 및 생성

        intSet.add(1);
        intSet.add(12);
        intSet.add(5);
        intSet.add(9);
        intSet.add(1);
        intSet.add(12);

        for (Integer value : intSet) {
            System.out.println(value);
        }
//        1
//        5
//        9
//        12

        // contains
        System.out.println(intSet.contains(2)); // false
        System.out.println(intSet.contains(5)); // true
    }
}

 

Map : key - value 의 한 쌍으로 저장함 <- 중요!!

key는 중복을 허용하지 않으나 value는 중복 가능

Map 또한 인터페이스(생성자)가 없어 HashMap이나 TreeMap으로 생성한다.

package sparta_nbc.Syntax.collection;

import java.util.HashMap;
import java.util.Map;

public class _Map {
    public static void main(String[] args) {
        Map<String, Integer> intMap = new HashMap<>();

        // key 값
        intMap.put("일", 11);
        intMap.put("이", 12);
        intMap.put("삼", 13);
        intMap.put("사", 14);
        intMap.put("사", 15); // 중복 key
        intMap.put("사", 16); // 중복 key

        // 키 값 전체 출력
        // key를 가져오는 함수 .keySet()
        for (String key : intMap.keySet()) {
            System.out.println(key);
        }
        // 이
        // 일
        // 삼
        // 사 // 중복되는 키는 나타내지 않음

        // value 값 전체 출력
        // value를 가져오는 함수 .values()
        for (Integer value : intMap.values()) {
            System.out.println(value);
        }
        // 12
        // 11
        // 13
        // 16 // 키가 중복되면 value는 마지막 값으로 덮어씀

        // key를 통해 value를 가져오는 함수 .get("key")
        System.out.println(intMap.get("사")); // 16
    }
}

 

'TIL > JAVA' 카테고리의 다른 글

23.05.24  (0) 2023.05.24
23.05.23  (0) 2023.05.23
23.05.04  (0) 2023.05.04
23.05.03  (0) 2023.05.03
23.05.02  (0) 2023.05.02