오늘은 기다리던 모니터가 온다는 소식에 신나게 하루를 시작했다. 내일 드디어 과제를 제출하는 날이어서 오늘 과제를 마무리했는데 노력하는데도 여전히 부족한 나의 실력에 오늘도 여전히 막막한 기분이 들었는데 심화 OT 강의를 듣는데 튜터님꼐서 그러셨다. 다들 그러는 거고, 이상한 게 아니라고. 모두가 그런 상황이라고. 그러니 이론을 공부하고 여러 코드를 보며 코드 작성 실력을 늘려 가면 된다고 하셨다. 전공자임에도 불구하고 LEVEL 2부터 어떻게 손을 대야 할지, 코드를 어떻게 짜야 할지 막막하고 너무 부끄러울 지경이었는데 튜터님의 말씀에 오늘도 이렇게 힘을 얻고 나아간다. 오늘 모니터도 새로 받았겠다! 내일부터 잘 활용해서 열심히 해야지!
9시부터 10시까지는 알고리즘 코드카타 시간을 가졌다.
/*java*/
class Solution {
public int solution(int n) {
int sum = 0;
for (int i = 2; i <= n; i += 2) {
sum += i;
}
return sum;
}
}
#python
def solution(n):
total_sum = 0
even_numbers = []
for i in range(2, n + 1, 2):
total_sum += i
even_numbers.append(str(i))
return total_sum
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC
/*App class*/
// 초기 결과 값으로 사용할 리스트 생성
List<Double> initialResults = Arrays.asList(0.0, 0.0); // 예시로 0.0으로 초기화
// Calculator 인스턴스 생성 시 초기 결과 값 리스트 전달
Calculator calculator = new Calculator(initialResults);
/* // Calculator 인스턴스에서 계산 결과 검색
List<Double> calculationResults = calculator.getResults();
// 초기화 확인
if (initialResults.equals(calculationResults)) {
System.out.println("Calculator 인스턴스가 초기 결과로 성공적으로 생성되었습니다.");
} else {
System.out.println("오류: Calculator 인스턴스가 초기 결과로 올바르게 초기화되지 않았습니다.");
}
*/
/*Calculator class*/
private List<Double> results;
// Calculator 클래스의 생성자
public Calculator(List<Double> initialResults) {
this.results = new ArrayList<>(initialResults);
}
switch (operator) {
case '+' -> result = num1 + num2;
case '-' -> result = num1 - num2;
case '*' -> result = num1 * num2;
case '/' -> {}
default ->
/*App clss*/
while (true) {
System.out.println("작업을 선택하세요: ");
System.out.println("1. 산술 연산 수행");
System.out.println("2. 원의 넓이 계산");
System.out.println("3. 저장된 연산 결과 보기");
System.out.println("4. 저장된 원의 넓이 결과 보기");
System.out.print("선택: ");
int choice = sc.nextInt();
switch (choice) {
case 1:
performArithmetic(calculator, sc);
break;
case 2:
calculateCircleArea(calculator, sc);
break;
case 3:
showResults(calculator.inquiryResults());
break;
case 4:
showResults(calculator.inquiryCircleAreas());
break;
default:
System.out.println("잘못된 선택입니다. 1, 2, 3 또는 4를 입력하세요.");
}
System.out.println("계속 하시겠습니까? (종료하려면 'exit' 입력)");
String text = sc.next();
if (text.equals("exit")) {
break;
}
sc.close();
}
private static void performArithmetic(Calculator calculator, Scanner sc) {
System.out.println("첫 번째 숫자를 입력하세요: ");
double firstNum = sc.nextDouble();
System.out.println("두 번째 숫자를 입력하세요: ");
double secondNum = sc.nextDouble();
System.out.print("연산자를 입력하세요 (+, -, *, /): ");
char operator = sc.next().charAt(0);
try {
double result = calculator.calculate(firstNum, secondNum, operator);
System.out.println("결과: " + result);
} catch (CalculatorException e) {
System.out.println("오류: " + e.getMessage());
}
}
private static void calculateCircleArea(Calculator calculator, Scanner sc) {
System.out.println("원의 반지름을 입력하세요: ");
double radius = sc.nextDouble();
double area = calculator.calculateCircleArea(radius);
System.out.println("원의 넓이: " + area);
}
private static void showResults(List<Double> results) {
System.out.println("저장된 결과: " + results);
/*Calculator class*/
private List<Double> results; // 연산 결과를 저장하는 컬렉션 타입 필드
private List<Double> circleAreas; // 원의 넓이 결과를 저장하는 컬렉션 타입 필드
// Calculator 클래스의 생성자
public Calculator(List<Double> initialResults) {
this.circleAreas = new ArrayList<>(); // 원의 넓이 결과를 저장하는 컬렉션 초기화
}
/ 원의 넓이를 계산하고 결과를 반환하는 메서드
public double calculateCircleArea(double radius) {
double area = Math.PI * radius * radius;
circleAreas.add(area); // 원의 넓이 결과를 컬렉션에 저장
return area;
}
// 원의 넓이 결과 리스트를 반환하는 메서드
public List<Double> inquiryCircleAreas() {
return new ArrayList<>(circleAreas);
}
/*App class*/
// 초기 결과값 리스트 생성
List<Double> initialResults = new ArrayList<>(Arrays.asList(0.0, 0.0));
// ArithmeticCalculator 및 CircleCalculator 객체 생성
ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculator(initialResults);
CircleCalculator circleCalculator = new CircleCalculator(initialResults, initialResults);
switch (choice) {
case 1:
// 산술 연산 수행 메소드 호출
performArithmetic(arithmeticCalculator, sc);
break;
case 2:
// 원의 넓이 계산 메소드 호출
calculateCircleArea(circleCalculator, sc);
break;
case 3:
// 저장된 연산 결과 보기
showResults(arithmeticCalculator.inquiryResults());
break;
case 4:
// 저장된 원의 넓이 결과 보기
showResults(circleCalculator.inquiryCircleAreas());
}
private static void performArithmetic(ArithmeticCalculator calculator, Scanner sc) {}
/*ArithmeticCalculator class*/
public class ArithmeticCalculator extends Calculator {
public ArithmeticCalculator(List<Double> initialResults) {
super(initialResults);
}
@Override
// 산술 연산을 수행하고 결과를 반환하는 메소드
public double calculate(double num1, double num2, char operator) throws CalculatorException {
double result;
switch (operator) {
case '+' -> result = num1 + num2; // 덧셈
case '-' -> result = num1 - num2; // 뺄셈
case '*' -> result = num1 * num2; // 곱셈
case '/' -> {
// 나눗셈 시 예외 처리
if (num2 == 0) {
throw new CalculatorException("Cannot divide by 0."); // 0으로 나눌 수 없음
}
result = num1 / num2; // 나눗셈 수행
}
default -> throw new CalculatorException("Invalid operator symbol."); // 잘못된 연산자 기호
}
results.add(result); // 결과를 리스트에 추가
return result; // 결과 반환
}
}
/*Calculator class*/
public class Calculator {
protected List<Double> results; // 서브클래스에서 접근할 수 있도록 protected로 변경
/*CircleCalculator*/
public class CircleCalculator extends Calculator {
private List<Double> circleAreas; // 원의 넓이를 저장하는 리스트
public CircleCalculator(List<Double> initialResults, List<Double> initialCircleAreas) {
super(initialResults);
this.circleAreas = initialCircleAreas;
}
// 원의 넓이를 계산하고 리스트에 추가하는 메소드
public double calculateCircleArea(double radius) {
double area = Math.PI * radius * radius; // 원의 넓이 계산
circleAreas.add(area); // 계산된 넓이를 리스트에 추가
return area;
}
// 저장된 원의 넓이를 조회하는 메소드
public List<Double> inquiryCircleAreas() {
return circleAreas;
}
}
/*AddOperator class*/
// 덧셈 연산을 수행하는 AddOperator 클래스
class AddOperator implements Operator {
@Override
public double calculate(double num1, double num2) {
return num1 + num2;
}
}
/*ArithmeticCalculator class*/
/ 연산자 인터페이스: calculate 메소드를 정의함
interface Operator {
double calculate(double num1, double num2) throws CalculatorException;
}
// 산술 연산을 위한 ArithmeticCalculator 클래스
public class ArithmeticCalculator extends Calculator {
private final Operator addOperator; // 덧셈 연산자
private final Operator subtractOperator; // 뺄셈 연산자
private final Operator multiplyOperator; // 곱셈 연산자
private final Operator divideOperator; // 나눗셈 연산자
// 생성자: 초기 결과 리스트를 받아와서 설정하고 연산자 객체들을 초기화함
public ArithmeticCalculator(List<Double> initialResults) {
super(new ArrayList<>(initialResults));
this.addOperator = new AddOperator();
this.subtractOperator = new SubtractOperator();
this.multiplyOperator = new MultiplyOperator();
this.divideOperator = new DivideOperator();
}
witch (operator) {
case '+':
result = addOperator.calculate(num1, num2); // 덧셈 연산 수행
break;
case '-':
result = subtractOperator.calculate(num1, num2); // 뺄셈 연산 수행
break;
case '*':
result = multiplyOperator.calculate(num1, num2); // 곱셈 연산 수행
break;
case '/':
result = divideOperator.calculate(num1, num2); // 나눗셈 연산 수행
break;
default:
throw new CalculatorException("Invalid operator symbol."); // 잘못된 연산자 기호
/*CircleCalculator class*/
initialCircleAreas) {
this.circleAreas = new ArrayList<>(initialCircleAreas);
}
/*DivideOperator class*/
// 나눗셈 연산을 수행하는 DivideOperator 클래스
class DivideOperator implements Operator {
@Override
public double calculate(double num1, double num2) throws CalculatorException {
if (num2 == 0) {
throw new CalculatorException("Cannot divide by 0."); // 0으로 나눌 수 없음
}
return num1 / num2;
}
}
/*MultiplyOperator class*/
// 곱셈 연산을 수행하는 MultiplyOperator 클래스
class MultiplyOperator implements Operator {
@Override
public double calculate(double num1, double num2) {
return num1 * num2;
}
}
/*SubtractOperator class*/
// 뺄셈 연산을 수행하는 SubtractOperator 클래스
class SubtractOperator implements Operator {
@Override
public double calculate(double num1, double num2) {
return num1 - num2;
}
}
/*ArithmeticCalculator class*/
private final ModOperator modOperator; // 나머지 연산자
public ArithmeticCalculator(List<Double> initialResults) {
super(new ArrayList<>(initialResults));
this.addOperator = new AddOperator(); // 덧셈 연산자 초기화
this.subtractOperator = new SubtractOperator(); // 뺄셈 연산자 초기화
this.multiplyOperator = new MultiplyOperator(); // 곱셈 연산자 초기화
this.divideOperator = new DivideOperator(); // 나눗셈 연산자 초기화
this.modOperator = new RemainderOperator(); // 나머지 연산자 초기화
}
switch (operator){
case '%':
result = modOperator.calculate(num1, num2); // 나머지 연산 수행
}
/*RemainderOperator class*/
// 나머지 연산을 나타내는 ModOperator 인터페이스
interface ModOperator {
double calculate(double num1, double num2) throws CalculatorException;
}
// RemainderOperator 클래스는 ModOperator 인터페이스를 구현하여 나머지 연산 처리
class RemainderOperator implements ModOperator {
@Override
// 나머지 연산을 수행하는 calculate 메소드
public double calculate(double num1, double num2) throws CalculatorException {
// 0으로 나누는 경우 예외 처리
if (num2 == 0) {
throw new CalculatorException("0으로 나눌 수 없습니다. 다시 입력하세요."); // 0으로 나눌 수 없음
}
return num1 % num2; // 나머지 연산 수행
}
}
/*1번 코드*/
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
/*1번 코드를 조상 타입의 배열에 자손들을 객체를 담을 수 있도록 수정*/
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
위의 코드를 그림으로 표현한 것
abstract class Player { // 추상 클래스
abstract void play(int pos); // 추상 메서드
abstract voud stop(); // 추상 메서드
}
class AudioPlayer extends Player { // 완전 클래스
void play(itn pos) {/*내용*/} // 추상 메서드 구현
void stop() {/*내용*/} // {} 구현부 작성
}
abstract class AbstractPlayer extends Player {
void play(int pos) {/*내용*/} // 추상메서드 구현
/*추상 클래스에 있던 추상 메소드 2개중 1개만 작성하였기 때문에 클래스 앞에 abstract 붙여줘야 함*/
}
abstract class Player {
boolean pause; // 일시정지 상태를 저장하기 위한 변수 (iv)
int currentPos; // 현재 paly되고 있는 위치를 저장하기 위한 변수 (iv)
Player() { // 생성자
pause = flase;
curtentPos = 0;
}
/*지정된 위치에서 시작하는 기능이 수행하도록 작성해야함*/
abstract void play(int pos); // 추상 메서드
/*재생을 즉시 멈추는 기능을 수행하도록 작성해야 함*/
abstract void stop(); // 추상 메서드
void play() { // 인스턴스 메서드(1. 객체 생성 후 2. 호출)
play(currentPos); // 추상 메서드 사용 가능
}
}
브랜치를 생성하고 이동하는 방법과 머지, 그리고 기본적으로 팀 프로젝트 시에 깃허브를 어떻게 사용하면 좋을지에 대한 강의를 들었다.