Day_20 ( Java 기초 문법 실습 - 5 )

HD.Y·2023년 11월 24일
0

한화시스템 BEYOND SW

목록 보기
18/58
post-thumbnail

오늘 배운 문법 정리

  • 문자열 (Str)
    1) 특정 문자 변경 : [문자열 변수이름].replace("변경되는문자", "변경할문자");

    2) 문자열을 쪼개서 배열로 저장
        String[] [배열 이름] = [문자열 변수이름].split("기준으로 정할 문자");

    3) 자바에서 SQL 쿼리문 사용 시

      public class Str {
          public static void main(String[] args) {

              int empNo = 10000;
              int salaryAvg = 90000;

              String sql = "SELECT emp_no, AVG(salary) " +
                      "FROM salaries " +
                      "WHERE emp_no >= " + empNo + " " +
                      "GROUP BY emp_no " +
                      "HAVING AVG(salary) > " + salaryAvg + ";";

              // 빈칸을 표현식으로 변경
              // %d : 숫자, %s : 글자
              String str5 = "SELECT emp_no, AVG(salary) " +
                      "FROM salaries " +
                      "WHERE emp_no >= %d " +
                      "GROUP BY emp_no " +
                      "HAVING AVG(salary) > %d;";
                
              // String.format(빈칸 뚫어둔 글자, 빈칸에 들어갈 변수)
              System.out.println(
                      String.format(str5, empNo, salaryAvg)
                      );
          }
      }

  • final 제어자
    : 클래스, 메서드, 변수 등에 사용될 수 있으며 "final 제어자" 가 붙으면 변경할 수 없다.

    public class Final {
      public static void main(String[] args) {
          final int MAX = 10;  // 변경시킬수 없다는 변수를 표현하기 위해 대문자로 쓰는 경우가 많음
    
          // MAX = 20;  // ❌ final 값을 설정하면 변수의 값을 변경할 수가 없음 ❌
      }
    }

  • abstract 제어자
    : 클래스에 사용되면 클래스 내에 추상메서드가 선언되어 있다는 것을 의미하고,
      메서드에 사용되면 다른 클래스나 패키지에서 해당 클래스를 사용할 때는 반드시
      "abstract 메서드"를 사용해야만 한다.
     public abstract class AbstractClass {
    
        // abstarct 메서드는 선언부만 작성하고 구현부는 작성하지 않는다.
        abstract void method1(String url, String id, String pw);

        void method2() {
            System.out.println("메서드2입니다.");
        }
     }
     public class AbstractChild extends AbstractClass {
     
     // abstract 클래스를 사용하려면 반드시 abstract 메서드를 사용해야만 한다.
     @Override
        void method1(String url, String id, String pw) {

        }
     }

  • 예외 처리
    : 프로그램의 오류에는 컴파일할 때 발생하는 컴파일 에러와 실행할 때 발생하는
      런타임 에러, 마지막으로 실행 시 의도와 다르게 동작하는 논리적 에러가 있다.

    : 에러(Error)는 프로그램 코드에 의해서 수정이 불가능한 심각한 오류를 말하는데,
      예외(Exception)는 프로그램 코드에 의해서 수정될 수 있는 미약한 오류를 말한다.

    : 따라서, 에러는 어쩔 수 없지만 예외는 반드시 처리해야 한다. 예외를 처리하기 위해서
      try-catch 문을 사용한다.

    : 보통 예외 처리를 해줄때는 N 개의 클래스가 있을때, 각 클래스에서는 발생할 수 있는
      예외를 1개의 메인 클래스로 전부 던지고, 모든 예외는 해당 메인 클래스에서 전부 다
      처리한다.

    : 아래는 예외처리 예시다. 예외를 던질때는 보통 실제로 발생하는 "에러명" 으로 적어준다.

     public class ExceptionTest {
     int method01(int num1, int num2) throws ArithmeticException, IndexOutOfBoundsException {
        int result = 0;
        int[] arr = new int[3];

        //arr[5] = 10;

        result = num1 / num2;  

        return result;
       }
     }

     public class ExceptionMain {
         public static void main(String[] args) {
             ExceptionTest exceptionTest = new ExceptionTest();

             try {  // 예외가 발생할 가능성이 있는 문장들을 넣는다.
                 exceptionTest.method01(10, 0);
             } catch (ArithmeticException e) {
                 System.out.println("0으로 나눌 수 없습니다."); // 예외처리를 위한 문장을 적는다.
             } catch (IndexOutOfBoundsException e) {
                 System.out.println("인덱스 크기가 3을 넘으면 안됩니다.");
            }
         }
      }

  • 컬렉션 프레임워크
    1) 맵(Map) : 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장한다.
            순서는 유지되지 않고, 키는 중복을 허용하지 않는다.

    • 맵에 값 추가 : [맵이름].put("키1","값1);
    • 맵에서 원하는 위치의 값 가져오기 (키의 값으로 불러온다.) : [맵이름].get("키1");
    • 맵에서 값 삭제 : [맵이름].remove("키1");

    2) 리스트(List) : 여러개의 데이터를 저장할 수 있고, 크기가 정해져 있지 않다.

    • 리스트에 값 추가 : [리스트명].add("값");
    • 리스트에 값 삭제 : [리스트명]remove("값");
    • 리스트에서 원하는 위치에 값 추가 : [리스트명].add(인덱스번호, "값");
    • 리스트에서 원하는 위치의 값 가져오기 : [리스트명].get(인덱스번호);
    package day05;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class ListTest {
        public static void main(String[] args) {
    
            ArrayList arrayList = new ArrayList();
    
            // 리스트에 값 추가
            arrayList.add("111");
            arrayList.add("222");
            arrayList.add("333");
    
            System.out.println(arrayList); // [111, 222, 333]   => 출력형태 : 대괄호 []
    
            // 리스트에 값 삭제 (중복된 것이 있으면, 제일 앞에 있는 것 삭제 / 추가 삭제 원할 시 다시 명령어를 실행시킨다.)
            arrayList.remove("222");
    
            // 리스트에서 원하는 위치에 값 추가
            arrayList.add(0, "000");
    
            // 리스트에서 원하는 위치에 있는 값 삭제
            arrayList.remove(0);
    
            // 리스트에서 원하는 위치의 값 가져오기
            arrayList.get(0);    // 인덱스 번호
    
            // 리스트는 타입에 상관없이 저장은 가능하나, 결코 좋은 방법은 아니다
            arrayList.add(444);
            
            // 그렇기 때문에 타입을 지정해서 리스트를 생성한다.
            // List<Integer> integerList = new ArrayList<Integer>();
    
            // 해시맵
            HashMap hashMap = new HashMap();
    
            // 맵에 값 추가
            hashMap.put("키1", "값1");
            hashMap.put("키2", "키2");
            hashMap.put("키3", "키3");
    
            // 맵에서 원하는 위치의 값 가져오기 (키의 값으로 불러온다.)
            hashMap.get("키1");
    
            // 맵에서 값 삭제
            hashMap.remove("키1");
    
        }
      }

  • 위의 기본적인 문법들 외에 더 문법들이 많지만, 수업 중에 배운 간단한 문법 위주로 정리를 해봤다. 추가적으로 필요한 문법은 지금 하고 있는 프로그래머스 문제를 풀어나가면서 익혀보면 될 것 같다.
  • 가장 중요한것은 맵과 리스트가 정말 많이 쓰인다는 것이고, 맵은 값을 불러올 때 "키" 로 불러오고, 리스트는 값을 불러올 때 "인덱스 번호" 로 불러온다는 차이다.

🚗 오늘의 실습 문제 ( 자동차 경주 게임 ) 🚕

  • 사용자는 몇대의 자동차로 게임을 진행할 지 입력한다.
  • 사용자는 각 자동차에 이름을 부여한다.
  • 사용자는 몇 회의 게임을 진행할 것인지 입력한다.
  • 각 자동차는 주어진 횟수 동안 전진 또는 멈출 수 있다.
  • 전진하는 조건은 0에서 9사이에서 무작위 값을 구한 뒤 4이상이면 전진한다.
  • 우승자가 여러 명일 경우 전부 출력한다.
  • 실행 결과 ( 자동차 3대, 5회 기준 )

pobi : -
woni :
jun : -


pobi : --
woni : -
jun : --


pobi : ---
woni : --
jun : ---


pobi : ----
woni : ---
jun : ----


pobi : -----
woni : ----
jun : -----


최종 우승자
pobi
jun

public class CarRace {
    private String name; // 자동차의 이름
    private int forward; // 전진 거리
    private String far; // 전진 막대기
    
    public CarRace(String name) {
        this.name = name;
        this.forward = 0;
        this.far = "";
    }

    public String getName() {
        return name;
    }

    // 전진한 거리
    public void drive(int distance){
        if(distance >= 4) {
            this.forward = forward + 10;
        }
        // System.out.println(this.forward);
    }
    // 전진한 막대기
    public void move(int moving) {
        if(moving >= 4) {
            this.far = far + "-";
        }
        System.out.println(this.far);
    }

    public int getForward() {
        return forward;
    }
}

package day04.package2;

import day04.package1.CarRace;

import java.util.Arrays;
import java.util.Scanner;

public class CarRaceGame {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.print("경주할 자동차의 수를 입력하세요 : ");
        int carNum = sc.nextInt();  // 자동차 수 입력받음

        System.out.println();


        CarRace[] carName = new CarRace[carNum]; // 자동차 이름을 저장할 배열 생성

        System.out.println("경주할 자동차의 이름을 적어주세요");
        for(int i=0; i<=carNum-1; i++) {   // 입력받은 수만큼의 자동차 이름 저장
            carName[i] = new CarRace(sc.next());
        }

        System.out.println();

        System.out.print("시도할 횟수는 몇번 인가요? : ");
        int gameNum = sc.nextInt();

        System.out.println();

        // 1번 시도할때 마다 각 자동차가 입력받는 전진 번호
        int[] carDistance = new int[carNum];
        int[] totalDistance = new int[carNum];
        for(int i=0; i<gameNum; i++) {
            for(int j=0; j<=carNum-1; j++) {
                carDistance[j] = (int)(Math.random()*10);
            }
            // 입력 받는 전진 번호에 따른 전진 거리 및 막대기
            for(int j=0; j<=carNum-1; j++) {
                System.out.print(carName[j].getName() + " 자동차가 이동한 거리 : ");
                carName[j].move(carDistance[j]);
                carName[j].drive(carDistance[j]);
                totalDistance[j] = carName[j].getForward();
            }
            System.out.println();
        }
        // 최대거리 찾기
        int max=totalDistance[0];
        for(int i=0; i<=carNum-1; i++) {
            if(max < totalDistance[i]) {
                max = totalDistance[i];
            }
        }
        System.out.println("최종 우승자");
        
        // 최대 거리와 비교하여 최종 우승자(들) 출력
        for(int i=0; i<=carNum-1; i++) {
            if(max == totalDistance[i]) {
                System.out.println(carName[i].getName());
            }
        }
    }
}

  • 리스트를 배우기전에 문제를 푼 것이라 그동안 배웠던 배열, 반복문, 조건문을 활용하여 게임을 구현해봤다. 그러다 보니, 코드가 길어진 것도 있는것 같다.

  • 또한, 전진한 거리를 숫자가 아닌 막대 형식으로 표현을 하고, 최종 우승자를 뽑으려면 거리가 필요하다 생각했기 때문에 두 가지를 나눠서 구한 부분이 있다.

  • 그래도 실제 게임을 코드로 구현해 나가다보니, 점점 코드에 친숙해 지는것 같다. 코드의 길이나 복잡도 정도는 지금 고려할 사항이 아니라고 생각하기에, 일단은 내가 생각한 흐름 대로 그대로 코드로 구현을 할 수 있다면, 추후에 더 간단하게 코드를 짜는건 오히려 쉽다고 본다.😇


오늘의 느낀점 👀

  • 오늘로써, 자바 프로그래밍 수업 1주차가 끝났다. 처음에는 막막했던 코딩이 매일 프로그래머스 문제도 풀어보고, 수업 중 강사님이 내주신 게임 문제들을 하나씩 풀어나가다 보니, 그래도 조금씩 알아가게 되는 것 같다.

  • 다음주 토요일에 개인적으로 준비중인 자격증 시험이 있어, 주말에는 자격증 공부를 하고있지만, 이제 다음주 시험이 끝나면 주말에도 개발자가 되기 위한 개인 공부를 본격적으로 시작해 보려 한다.

  • 인프런에서 강의 할인을 하길래, 도커와 쿠버네티스 강의를 오늘 결재했는데 일단 지금 생각하는건 스프링 기본 강의를 수업 전에 먼저 들어보고, 그 다음에 도커와 쿠버네티스 강의를 들은 다음 NoSQL 중 하나인 "엘라스틱 서치" 공부 및 구현을 해보려고 한다.

  • 무사히 구현이 된다면, 파이널 프로젝트에 이 기능을 구현해보고 싶다. 그러기 위해선 더더욱 열심히 공부하고 학습하는 길뿐이므로, 오늘도 의지를 다잡는다.😄

profile
Backend Developer

0개의 댓글