오늘 배운 문법 정리 ✍
문자열 (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 값을 설정하면 변수의 값을 변경할 수가 없음 ❌
}
}
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 중 하나인 "엘라스틱 서치" 공부 및 구현을 해보려고 한다.
무사히 구현이 된다면, 파이널 프로젝트에 이 기능을 구현해보고 싶다. 그러기 위해선 더더욱 열심히 공부하고 학습하는 길뿐이므로, 오늘도 의지를 다잡는다.😄