한화시스템 23기 5주차 회고

hoony·2025년 12월 21일

한화시스템 23기

목록 보기
4/12

📚 이번주엔 뭘 배웠지?

이번 주는 자바의 클래스부터 객체지향의 핵심 개념까지 배운 한 주였다.
+Queue, Stack, Deque까지

  • 자료구조마다 존재하는 트레이드오프
  • 조회가 잦은 경우 → ArrayList, 삽입/삭제 흐름이 중요한 경우 → LinkedList
  • 메서드의 존재 이유
    → ((코드)중복 제거를 위한 모듈화)
  • static 메서드와 객체 메서드의 차이
  • 매개변수(원시형, 객체) 전달 방식
    → 기본 타입은 값 복사, 객체는 참조 전달
    → 객체로 메모리 주소를 던졌기 때문에 수정하면 내용 변경됨
  • 생성자와 setter/getter의 역할
    → setter는 피치못하면 쓰고, 생성자를 활용하는 느낌으로 발전
  • 캡슐화(private)와 접근 제어자
    → public > protected > default > private 순서로 접근제한 수준
  • 메서드의 오버로딩
    → 매개변수 타입과 매개변수 개수의 차이로 허용
  • 컬렉션(List, Map)을 활용한 객체 관리
  • 간단한 계좌, 게시판 시스템 구현
  • 재귀 함수의 호출 흐름과 백트래킹
  • 상속, 오버라이딩, super
    → 오버라이딩 : 부모, 자식클래스의 메서드명이 동일한 경우
    → 부모클래스를 상속받을때, 자식객체의 생성자에서는 부모객체를 자동으로 생성
  • 추상 클래스 vs 인터페이스
    → 추상메소드가 하나만 있어도 추상 클래스,
    → 인터페이스는 모두 추상메소드 (자바8 이후로 메소드 구현 가능)
  • 다형성의 의미와 장점
    → 기존의 구현체(ex-ArrayList)를 다른 구현체(ex-LinkedList)로 변경시 용이. 구현체에 의존하지 않고, 코드변경 최소화
  • 익명 클래스, 람다 표현식
    → 구현체가 없는 추상클래스 또는 인터페이스는 익명객체로 생성.
    → 클래스 선언 + 객체 생성을 동시에
  • 인터페이스 Comparator / Comparable을 이용한 정렬
    → 깨달음 목차에 정리
    1) Comparator → compare()메서드만 존재
    2) Comparable → compareTo()메서드만 존재

이번주는 헷갈렸던 문법이 많이 해결된 느낌이었다.
특히, 클래스(static) 변수와 객체 변수의 사용범위
(객체변수는 객체메서드에서만 접근 가능 , main메서드는 접근 불가[static이기에] -> 사용하려면 객체 만들어서 사용 가능)

그리고, 구현체가 없는 추상클래스 또는 인터페이스는 익명객체 생성시 람다식표현방법(메서드가 1개밖에 없을 경우 가능)

👊 어떤 문제점이 있었지?

초반에는 솔직히 많이 헷갈렸다.

  • static이 붙으면(메소드에) 왜 객체 메서드를 못 부르는지
    → static 메서드는 객체를 전제로 하지 않기 때문에
    객체가 있어야만 의미가 있는 인스턴스 메서드를
    그냥 호출 불가 (객체 생성하여 호출 가능)

  • 메서드에 값 또는 객체를 넘길때 어떻게 다른지?

  • 생성자를 쓰는 이유가 setter랑 뭐가 다른지

  • 인터페이스에서 직접 메서드를 구현해서 사용하는 경우도 있다.(자바8이후로 가능)
    ex) myList.sort(Comparator.naturalOrder());

  • 재귀 함수는 어디서 호출되고 언제 돌아오는지 감이 안 왔음
    → 정말 어려웠다. 조합, 순열 함수를 호출하여 어느시점에 끝나는지를 종이와 펜을 통해 직접 써보면서 이해했다. 이걸 눈으로 바로 이해한다고? 하는 생각도 들긴했다.

  • 람다식은 “편한 문법”이라는데, 그래 알겠는데, 왜 가능한지?
    (이게 왜 편한 문법인지도 몰랐다.)

  • 람다식과 더불어 정렬기준을 만들때 Comparator 익명객체 생성방법

  •    Collections.sort(myList2, new Comparator<String>(){
           @Override
           public int compare(String o1, String o2) {
               if(o1.length()==o2.length()){
                   return o1.compareTo(o2);
               }
               return o1.length() - o2.length();
           }
       });

    위 코드에서 Comparator는 compare메소드만을 가지고 있는데 어떻게 compareTo를 사용할 수 있는지?

🙏 무엇을 깨달았고, 어떤 생각이 들었지?

  • 메서드는 “기능”이 아니라 의도
  • 생성자는 객체의 안정적인 시작점
  • 객체를 넘긴다는 건 주소를 공유한다는 것
  • 상속은 재사용이 아니라 타입 확장
  • 인터페이스의 다형성은 “편의성”이 아니라 유지보수성
  • 인터페이스는 구현보다 역할을 먼저 정의하는 것

- [Comparator를 이용한 정렬]

▶ 예를 들어 Integer 형식을 정렬한다면

  • sort()의 매개변수 타입은 Comparator 하나뿐!

    Integer implements Comparable

    Comparator.naturalOrder() -> 자바 8 이후부터는 인터페이스도 ‘구현 코드’를 가짐

    (o1, o2) -> o1.compareTo(o2) [Comparable의 compareTo를 그대로 사용]

    list.sort(Comparator.naturalOrder())

  • 한문장으로 정리하자면, list.sort는 비교 방법을 Comparator에게 위임하고, Comparator 안에서는 필요하면 Comparable의 compareTo를 직접 호출해서 재사용한 것이다.

  • 자바공부하면서 흥미?!를 느껴본 순간이었다.

  • 자바를 배우는 주차에 들어가면서 복습을 시작했는데, 복습의 중요성을 깨닫다 보니 리눅스와 데이터베이스를 배울때 복습을 안한 후회가 들었다.. (꼭 복습해서 정리하고자 한다.)

😄 결과적으로, 현재 나의 상태는?

예전에는 코드가 돌아가기만 하면 넘어갔다면,
지금은 이 객체가 왜 필요한지,
이 메서드는 누구 갖고 있는게 자연스러운지
왜 이 시점에 생성돼야 하는지 고민을 하나씩 늘리고 있다.

👨‍🚀 앞으로 어떻게 하는게 좋을까?

  • 문법 하나를 배워도 “어디에 쓰이는지”를 먼저 생각하고
    코드가 왜 이렇게 구성됐는지를 말로 설명할 수 있을 때까지
    한 번 더 정리해보려고 한다.

  • 또한, 이해가 애매한 개념은 그냥 넘기지 않고
    null, 참조, 다형성처럼 기본이 되는 개념들은 복습을 통해서라도 확실히 정리하고자 한다.

  • 그리고 이 과정을 가능하게 해주신 건
    개념을 단순히 알려주는 게 아니라,
    계속 질문하게 만들고 생각하게 해주신 강사님의 설명 방식 덕분이라고 느낀다. 항상 감사드린다.

profile
코딩정복하자

0개의 댓글