PLAYDATA 주간회고

플레이데이터 풀스택 백엔드 9기 4월 1주차 회고

Berry-mas 2025. 4. 8. 01:46

플레이데이터 풀스택 백엔드 9기 3주차 주간회고 및 학습기록 (세 번째 기록)


Facts

이번 주는 내내 java 공부만 했다. 저번 주와 달라진 점은 java가 어려웠다는 것이다. 당연히 갈수록 어려운 걸 배우겠지만 그래도 내 생각보다 복잡해서 더 당황스러웠다. 클래스와 객체, 객체와 인스턴스, 다형성과 상속 등,,, 수업 중에는 이해를 하며 들었지만 내 것으로 만드는 시간을 제대로 못 가졌다. 결국 며칠만에 개념을 잊고 실습 과제를 풀 때는 허둥지둥,,,

매주 '이번 주는 더 잘하리라' 다짐하지만, 또 제대로 하진 못한 거 같다.

 

자 이제 변명 타임. 이번 주에는 밀린 SQL 정리와 리눅스 정리를 끝내느라 자바 코드 복습 시간이 부족했다. (물론! SQL과 리눅스 정리를 진작에 했어야 하거나 좀 미루고 일단 java 복습부터 하는 게 맞았다. 어려운 걸 회피하는 나의 본능이 또다시 발동한 게 문제...)  SQL 및 리눅스 정리를 이어나가며,  그날 배운 java를 정리하고 실습과제를 풀고난 후에는 도저히 시간이 없었던 거 같다. (아 나 주말에 시간 많았구나. 하하) 수업시간에 작성한 코드를 복습하고 진득하게 고민하는 시간을 가져야 했는데 말이다. 

 

한 가지 더. 내 체력은 이제 약하다. 4시간 자고 8시간씩 공부했던 건 19살의 나였고, 지금은 도저히 안 될 거 같다. 체력관리도 실력이다. 지속가능한 공부를 위해 생각했던 공부 방식을 전면 수정해야한다. 물론 저번 주처럼 졸지는 않았다. 플레이데이터에 있는 커피머신 덕분에 버틸 수 있었기 때문이다. 그러나 목요일, 금요일의 피로도는 장난 아니었다.

 

아 그리고, 정보처리기사 스터디를 하기로 결정했다. 플레이데이터에서 지원해주는 만큼 지원을 안 할 수 없었다. 이 기회를 놓칠 수는 없다. 앞으로 그만큼 시간이 부족할텐데, 공부에 있어서 선택과 집중을 잘해야겠다.

 


Feelings

난 홍창기가 좋다.

상속과 다형성 배울 때는 좀 짜증이 났다. 배울 때는 이해가 되는데, 왜 내가 적용하려고 하면 바로바로 되지 않는 건지. 한 번 졸음이 몰려오면 왜 이렇게 머리가 안 돌아가는지. 내 손은 왜 이렇게 느려서 선생님의 코드를 못 쫓아가는지. 지난 주엔 컴퓨터 용량이 말썽을 피우더니 이번 주엔 내 머리와 손이 말썽을 피웠다. 

 

그래도 기분 좋은 일은 몇가지 있었다. SQL과 리눅스 정리를 끝냈고 자바 실습과제를 나름 제때 맞춰서 제출했다(실습과제를 최대한 빨리 끝내려고 하는 습관은 좋은 거 같다). 그리고 내 목, 어깨와 정신 건강을 위해(?) 키보드도 샀다. COX CK88 딥씨축을 구매했는데, 타건감과 디자인이 너무 마음에 들어서 애국가만 쳐도 행복했다.


금요일에는 여러가지 일 덕분에(?) 긴장도 되고 기분도 좋아서 거의 졸지 않고 수업을 들었다. 금요일 수업이 끝나자마자 야구장에 가서 스트레스를 풀었는데, 피로도 함께 풀리는 듯했다. 종종 야구장에 다니면서 스트레스를 풀어야겠다. 그리고 이렇게 기대되는 무언가를 계획해두면 수업 시간에 더 집중할 수 있는 것 같다. 내가 야구장에 더 자주 가야할 명분을 찾았다. 


Findings

역시 이번에도 헷갈렸던 것을 정리해보았다.

 

알게된  1. 졸음 깨는 법

: 커피를 한 모금 마신 후 이클립스 두 개를 통으로 씹어 먹는다. 차가운 물을 벌컥 벌컥 들이킨다. 그 상태로 졸음껌을 씹는다. 이렇게 하면 확실하게 정신차리고 집중할 수 있다. 수업 자체는 참 재밌고 좋은데,,,이걸 못 따라가는 내 몸뚱아리여

 

배운  2. 객체지향 프로그래밍의 특징

  • 캡슐화 : 데이터를 숨기고 외부에서 직접 접근 못하게 보호하는 것
    • 데이터 무결성 유지, 보안성 높임
  • 추상화 : 필요한 정보만 보여주고 불필요한 세부사항은 숨기는 것
    • 객체의 본질적인 특징만 남기고, 복잡한 내부 구현은 감추는 개념
  • 상속 : 부모 클래스의 속성과 메소드를 자식 클래스가 물려받는 것
    • 코드의 중복을 줄이고 기존 기능을 확장할 때 사용하는 개념
  • 다형성 : 같은 메소드를 서로 다른 방식으로 동작하도록 하는 것
    • 같은 이름의 메소드가 여러 형태로 동작할 수 있도록 하는 것
    • 객체지향의 꽃

배운 것 3. 캡슐화 - public / protected / default / private

캡슐화를 통해 필드에 대한 직접 접근을 제한하고, 클래스에 간접적으로 접근할 수 있도록 하여 유지보수성을 증가시킬 수 있다. 필드에 직접 접근할 수 있다면, 필드에 올바르지 않은 값이 들어가도 통제가 불가능해지는 등 문제가 생길 수 있다.

구분  같은 클래스 같은 패키지 자식 클래스 전체
public O O O O
protected O O O  
default - 생략 가능 O O    
private O      

 

배운 것 4. 클래스와 객체, 그리고 인스턴스

객체와 인스턴스는 '거의 같다'. 관점에 따라 용어 구분만 잘하며 된다.

  • 클래스
    • 객체를 만들기 위한 설계도
    • '붕어빵 거푸집'
  • 객체
    • 메모리에 존재하는 독립된 실체 그 자체
    • '거푸집으로 만든 모든 붕어빵
  • 인스턴스
    • "그 객체가 어떤 클래스에 의해 만들어 실체인가?" 라는 관점에 초점
    • 어떤 설계도로 만들었는지 강조한 객체
    • '우리 동네 붕어빵 할머니께서 슈크림 붕어빵 거푸집으로 만드신 붕어빵'
  • 객체와 인스턴스의 관계
    • 모든 인스턴스는 객체이지만, 모든 객체가 늘 특정 클래스의 인스턴스는 아님
    • 인스턴스는 객체의 관계적 표현
  • 미분으로 비유
    > 계속 이해가 안 되면 이렇게 이해해보는 것도 괜찮다. 
    • 클래스 : 도함수 f'(x)
    • 인스턴스 : x = a 라는 특정 값에서의 미분계수 f'(a)
    • 객체 : 모든 x에 대한 미분계수들
    • new 연산자 : x를 입력값으로 도함수에 대입하는 것

배운 것 5. 생성자

초기 수행할 명령 내용이 있는 경우 미리 작성해두고, 특정 클래스에 대한 인스턴스 생성 시 단 한번 호출되는 함수

  • 기본 생성자 (default constructor)
    : 생성자 함수에 매개변수가 없는 생성자
    > 인스턴스 생성 시 직접 필드값을 입력
    > 생성자를 정의하지 않았을 때 생성자 메소드를 호출하면 컴파일러가 자동으로 기본 생성자를 생성
public class Person {
    String name;
    int age;

    // 기본 생성자
    public Person() {}
  • 매개변수가 있는 생성자
    : 필드(멤버변수)에 초기값을 설정해주는 생성자 
    > 객체를 생성할 때 매개변수에 값을 전달하여 초기값을 설정할 수 있도록 함
public class Person {
    String name;
    int age;

    // 매개변수가 있는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

 

배운 것 6. 오버로딩과 오버라이딩

1. 오버로딩

- 동일한 클래스 내에 매개변수의 타입, 개수, 순서를 다르게 작성하여 '동일한 이름의 메소드'를 만드는 것

- 원래 동일한 클래스 내에서는 동일한 이름의 메소드를 만들 수 없음

- 오버라이딩과 달리, 접근제어자나 예외처리는 오버로딩과 무관하다.

public void test() {}				// 기본

public void test(int num) {}    		// 매개변수가 달라졌으므로(생겼으므로) 오버로딩이 인정됨

public void test (int num1, int num2) {}    	// 매개변수의 개수가 달라졌으므로 오버로딩이 인정됨

public void test (int num2, int num1) {}    	// 매개변수 이름의 순서가 다른 것은 오버로딩과 무관

public void test(int num, String str) {}	// 매개변수의 타입이 달라졌으므로 오버로딩이 인정됨

public void test(String str, int num) {}	// 매개변수 타입의 순서가 달라지면 오버로딩 적용

 

2. 오버라이딩

- 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의 하는 것

- 부모 클래스가 준 기능을 자식 클래스 입맛에 맞게 바꾸는 것

- 오버라이딩 성립 조건

  • 메소드명 동일
  • 메소드 반환 타입 동일
  • 매개변수의 타입, 개수, 순서가 동일 (오버로딩과 다름!)
  • 부모 클래스의 private 메소드는 오버라이딩 불가
  • 부모 클래스의 final 키워드 메소드는 오버라이딩 불가
  • 접근제어자(public, protected, default, private)는 부모메소드와 같거나 더 넓은 범위
  • 예외처리는 같은 예외 or 하위인 예외 

- 오버라이딩 성립 조건을 굳이 외우진 않아도 될 거 같다.

- 현실에서 자식이 부모에게 대들면 안되듯이, java에서도 자식 클래스가 부모 클래스에게 대들면 안되는 것이다.

('감히' 자식클래스가 부모클래스의 private한 생활을 넘보면 안되고, '감히' 자식클래스가 부모클래스의 접근자보다 좁은 범위로 메소드를 사용할 수는 없다)

// 부모 클래스

public class Superclass {

    public void method(int num) {}
    protected void protectedmethod(int num) {}
    
// =============================================================================================

// 자식 클래스 (오버라이딩 할 때는 @Override 표시를 해줘야 한다)

    @Override
    public void method(int num) {
        super.method(num);
    }

    @Override
    protected void protectedmethod(int num) {      
        super.protectedmethod(num);
    }
    
    @Override
    public void protectedmethod(int num) {        // => 더 넓은 범위의 접근제어자는 가능
        super.protectedmethod(num);
    }

Future

1. 취침 시간 목표를 2시 이전에서 1시 이전으로 바꿔야겠다. 생각보다 내 체력은 더 약했다.

2. 내 공부 루틴 (일단 이렇게 한 번 해보자)

  • 수업 내용 정리 : 쉬는 시간과 점심시간 + 수업 후 30분
  • 실습 과제 푸는 시간은 매일 : 1시간
  • 그날 배운 코드 복습 시간 : 1시간