한화시스템 BEYOND SW 캠프 19기 - 5주차 회고

후라이드·2025년 8월 17일

회고록

목록 보기
6/28
post-thumbnail

✨BEYOND SW 캠프 19기 5주차 회고

벌써 4주차라니 시간 참 잘 가는 것 같다.

특히 이번 주는 월, 화, 수 3일만 수업 듣고

목요일엔 정처기 필기, 금요일엔 광복절이라

4일을 쉬는 시간을 가져서 그런가 더 체감이 컸다. 😄

다행스럽게도 목요일에 본 정처기 필기는 합격했다! 💯

시험 보기 전 봤던 cbt들은 계속 불합격 기준이였는데

시험이 생각보다 쉽게 나와서 합격 할 수 있었던 것 같다.

이제 남은 시간동안 실기도 천천히 준비해야겠다…!

📕 새롭게 얻은 지식

🎭 추상 클래스 - 반쯤 완성된 설계도

특징

  • abstract 키워드로 선언
  • 추상 메서드구현된 메서드 둘 다 가질 수 있음
  • 직접 객체 생성은 불가능 (new 못 씀!)
  • 단일 상속만 가능 (extends는 하나만!)

핵심 개념

abstract class Animal {
    String name;  // 일반 필드
    
    public void sleep() {  // 구현된 메서드
        System.out.println(name + "이(가) 잠을 잔다");
    }
    
    abstract void makeSound();  // 추상 메서드 (구현 안 함!)
}

장점

  • 공통 기능 제공: 여러 자식 클래스가 공통으로 쓸 메서드를 미리 구현해둘 수 있음 ✨
  • 강제 구현: 추상 메서드로 "이건 반드시 구현해!" 라고 강제할 수 있음
  • 코드 재사용성: 공통 로직은 부모에서 구현, 다른 부분만 자식이 구현

단점

  • 단일 상속 제약: 하나의 추상클래스만 상속 가능 😰
  • 결합도 높음: 부모 클래스와 강하게 연결됨

언제 쓸까?

  • 여러 클래스가 공통으로 가져야 할 필드나 메서드가 있을 때
  • "비슷하긴 한데 일부는 다르게 구현해야 해!" 할 때
  • IS-A 관계가 명확할 때 (Dog is Animal 처럼)
// 이런 상황엔 추상클래스가 최고!
abstract class Vehicle {
    int speed = 0;
    
    public void start() { 
        System.out.println("시동을 켠다"); 
    }
    
    abstract void move();  // 각자 다르게 구현해!
}

class Car extends Vehicle {
    void move() { 
        System.out.println("바퀴로 굴러간다"); 
    }
}

⚡ 인터페이스 (Interface) - 완벽한 계약서

특징

  • interface 키워드로 선언
  • 기본적으로 모든 메서드가 추상 메서드 (Java 8 이후 default, static 메서드 추가)
  • 다중 상속 가능 (implements 여러 개!)
  • 모든 필드는 public static final (상수만 가능)
interface Flyable {
    int MAX_SPEED = 100;  // 자동으로 public static final
    
    void fly();  // 자동으로 public abstract
    void land();
    
    default void showInfo() {  // Java 8부터 구현 가능
        System.out.println("날 수 있는 객체입니다");
    }
}

장점

  • 다중 상속: 여러 인터페이스를 동시에 구현 가능! 🚀
  • 유연한 설계: 결합도가 낮아서 변경에 강함
  • 표준화: 같은 기능을 보장하는 여러 클래스 만들 때 좋음

단점

  • 공통 구현 제한: 기본적으로 구현체를 제공할 수 없음 (default 메서드 제외)
  • 상수만 가능: 일반 필드는 못 가짐

언제 쓸까?

  • 서로 관련 없는 클래스들이 같은 기능을 제공해야 할 때
  • "이런 능력을 가져야 해!" 라는 능력 위주의 설계할 때
  • CAN-DO 관계일 때 (ex: Bird can fly )
// 이런 상황엔 인터페이스가 최고!
interface Drawable {
    void draw();
}

class Circle implements Drawable {
    public void draw() { 
        System.out.println("원을 그린다"); 
    }
}

class Rectangle implements Drawable {
    public void draw() { 
        System.out.println("사각형을 그린다"); 
    }
}

🤔 그래서 뭘 써야 할까?

선택 기준

상황추상클래스인터페이스
공통 필드/ 메서드 필요
다중 상속 필요
IS - A 관계
CAN - DO 관계
밀접한 관련성
느슨한 결합 원함

문자열 API : String, StringBuilder, StringBuffer

String은 문자열을 선언할 때 항상 사용했었기에 나름 익숙했었고,

StringBuilderStringBuffer는 과거 백준에서 알고리즘 문제를 풀 때

몇 번 접한적이 있었으나, 셋다 문자열을 처리하는데 무슨 차이로 사용하는지에

대해선 알지는 못했었는데, 막상 배워보니 각각 사용하는데엔 다 이유가 있었다.

🎯 String - 불변의 문자열 객체

특징

  • 불변(Immutable) 객체라는 게 핵심이다!
  • 한 번 만들어지면 절대 내용을 바꿀 수 없음
  • 문자열 연산할 때마다 새로운 String 객체가 생성됨

장점

  • Thread-Safe: 여러 스레드에서 동시에 써도 안전함 ✨
  • String Pool 활용: 같은 문자열은 메모리에서 재사용됨
  • 사용법이 간단: 그냥 + 연산자로 쉽게 합칠 수 있음

단점

  • 메모리 낭비: 문자열 합칠 때마다 새 객체 생성으로 GC 부담 증가 😰
  • 성능 저하: 반복적인 문자열 연산 시 심각하게 느려짐

언제 쓸까?

  • 문자열을 한 번 만들고 나서 거의 안 바꿀 때
  • 간단한 문자열 연산 몇 번 정도 할 때
  • 문자열을 여러 곳에서 참조만 할 때
// 이런 상황엔 String이 최고!
String name = "홍길동";
String message = "안녕하세요, " + name + "님!";

⚡ StringBuilder - 속도의 문자열

특징

  • 가변(Mutable) 객체로 내용을 자유자재로 변경 가능
  • Thread-Safe 하지 않음 (단일 스레드 전용)
  • 내부적으로 배열을 사용해서 효율적으로 문자열 관리

장점

  • 빠른 성능: 문자열 연산이 엄청나게 빨라짐! 🚀
  • 메모리 효율: 불필요한 객체 생성 없음
  • 다양한 메서드: append(), insert(), delete() 등 편리한 기능들

단점

  • Thread-Safe 하지 않음: 멀티스레드 환경에서 위험함 ⚠️
  • 사용법이 좀 복잡: String처럼 +로 간단하게 못 씀

언제 쓸까?

  • 반복문 안에서 문자열 계속 붙일 때
  • 단일 스레드 환경에서 성능이 중요할 때
  • 문자열을 자주 수정해야 할 때
// 이런 상황엔 StringBuilder가 최고!
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000; i++) {
    sb.append("숫자: ").append(i).append("\n");
}
String result = sb.toString();

🛡️ StringBuffer - 안전지향 문자열

특징

  • 가변(Mutable) 객체 (StringBuilder와 동일)
  • Thread-Safe: 동기화 처리로 멀티스레드에서 안전
  • StringBuilder와 거의 같은 메서드들 제공

장점

  • Thread-Safe: 멀티스레드 환경에서도 안전하게 사용 가능 🔒
  • StringBuilder와 같은 편의성: 다양한 문자열 조작 메서드 제공
  • 성능도 나쁘지 않음: String보다는 훨씬 빠름

단점

  • 동기화 오버헤드: StringBuilder보다 약간 느림
  • 단일 스레드에선 불필요: 혼자 쓸 때는 굳이 안 써도 됨

언제 쓸까?

  • 멀티스레드 환경에서 문자열을 자주 수정할 때
  • 여러 스레드가 동시에 같은 문자열 객체에 접근할 때
  • Thread-Safe가 중요한 상황일 때
// 이런 상황엔 StringBuffer가 최고!
StringBuffer buffer = new StringBuffer();
// 여러 스레드에서 동시에 이 buffer에 문자열 추가해도 안전함

🤔 그래서 뭘 써야 하는가?

성능 비교 (대략적인 느낌)

  • String: 문자열 1만 번 합치기 → 몇 초 걸림 😱
  • StringBuilder: 같은 작업 → 몇 밀리초만에 끝 ⚡
  • StringBuffer: 같은 작업 → StringBuilder보다 살짝 느리지만 여전히 빠름 🏃‍♂️

선택 가이드

  1. 간단한 문자열 연산 몇 번String
  2. 반복문으로 문자열 많이 합치기 + 단일 스레드StringBuilder
  3. 반복문으로 문자열 많이 합치기 + 멀티 스레드StringBuffer

🏆 좋았던 점

오랜만의 휴식

4주간 달려왔던 몸이 슬슬 피곤했는지 수업시간에도 계속 꾸벅꾸벅

졸았었는데 때 마침 운이 좋아 편히 쉴 수 있었다.

덕분에 체력도 회복하고 복습도 하면서 재정비 시간을 가질 수 있었다. 🔥

📋 아쉬운 점

부족한 복습

이번 주는 6시에 강의가 끝나고 나면 정처기 필기 준비를 하느냐,

복습에 많은 시간을 쓰진 못했던 것 같다.

그나마 다행인건 연휴가 껴 있어서 쉬는 동안 조금씩은

복습을 할 수 있었다.

📌 앞으로의 목표

SQLD 합격 도전

정처기 필기는 합격 했으니 이제 8/23 토요일(내 생일) 에 있을

SQLD도 합격 할 수 있게 열심히 준비 해야겠다.

이번 주에 4일간 쉬면서 원기회복도 했으니,

이제 남은 며칠은 불태워서 꼭 합격할 수 있으면 좋겠다~! 💯💯💯

정처기 실기 준비

정처기 실기는 11월이라 아직 한참 남았지만 지금 내 지식으로는

실기는 커녕 필기도 사실 아슬아슬 했다.

게다가 정처기는 코딩 문제의 점수 배점이 높은데

Java 만 나오는게 아닌 C 와 python 까지 준비를 미리 해둬야

이론 문제를 좀 틀려도 합격할 수 있을것이다….

한번에 붙어서 내년 상반기 이력서에는

정처기 자격증 한 줄이라도 추가 할 수 있으면 좋겠다~ 🙂

profile
라이언을 좋아하는 초보 개발자의 보금자리

0개의 댓글