
어느덧 8주차가 되었습니다
시간이 정말 빠르게 가고 있어서...
벌써 반이 넘게 지나간 것 같은 기분이에요
이번 주는 내용이 꽤 묵직했습니다
SOLID 원칙, 템플릿 메서드 패턴, 그리고 중첩 클래스와 익명 객체까지
한 주에 이 내용들을 다 소화해야 하니까
솔직히 머릿속에서 정리가 잘 안 됐던 순간들이 꽤 있었어요
그래도 하나씩 짚어보면서 "아, 이래서 쓰는 거구나!" 싶은 순간이 생기니까
그 맛에 공부하는 것 같습니다 ㅎㅎ
🔷 SOLID 원칙
가장 먼저 SOLID 원칙을 배웠는데요
객체지향 설계에서 기본 중의 기본이라고 할 수 있는 내용이에요
다섯 가지 원칙이 있는데, 이름도 외울 겸 정리해봤습니다

S - 단일 책임 원칙 (Single Responsibility)
하나의 클래스는 하나의 책임만 가져야 합니다
O - 개방 폐쇄 원칙 (Open/Closed)
확장에는 열려있고, 수정에는 닫혀 있어야 합니다
기존 코드를 건드리지 않고 새 기능을 추가할 수 있어야 한다는 말이에요
L - 리스코프 치환 원칙 (Liskov Substitution)
부모 타입 자리에 자식 타입을 넣어도 정상적으로 동작해야 합니다
업캐스팅을 해도 문제없이 돌아가야 한다는 의미인데,
개방 폐쇄 원칙을 받쳐주는 다형성 원칙이라고 이해했어요
I - 인터페이스 분리 원칙 (Interface Segregation)
클라이언트는 자신이 사용하는 메서드에만 의존해야 합니다
인터페이스를 너무 뚱뚱하게 만들지 말고, 사용하는 쪽 기준으로 잘게 나누라는 뜻이에요
D - 의존 역전 원칙 (Dependency Inversion)
고수준 모듈이 저수준 모듈의 구현에 직접 의존하면 안 됩니다
추상화(인터페이스)에 의존하도록 설계해야 한다는 원칙이에요
이 원칙들, 각각 따로따로 들을 때는 "그렇구나~" 싶은데
실제 코드에 적용하려면 또 다른 이야기더라구요
머리로는 아는데 손이 안 따라오는 그 느낌...
익숙해지는 수밖에 없는 것 같습니다
🔷 템플릿 메서드 패턴

다음은 디자인 패턴 중 하나인 템플릿 메서드 패턴(Template Method Pattern) 입니다
한마디로 정리하면,
부모 클래스에서 알고리즘의 뼈대를 정하고, 세부 구현은 자식 클래스에서 채운다
이 패턴이 왜 좋냐면, 공통 로직을 부모 클래스에 몰아넣을 수 있어서
자식 클래스들이 일일이 같은 코드를 반복하지 않아도 된다는 점이에요
실제 프레임워크 내부에서도 이 패턴이 많이 쓰인다고 하는데
"아, 그래서 상속이 중요한 거구나" 하고 다시 한번 느꼈어요
🔷 중첩 클래스와 익명 객체
이번 주 내용 중에서 가장 신선했던 파트였어요!!!
중첩 클래스란?
클래스 안에 또 다른 클래스를 선언하는 것입니다
크게 세 가지로 나뉘어요
인스턴스 멤버 클래스
바깥 클래스의 멤버로 선언되는 클래스예요
특징은, 바깥 객체(A)를 먼저 생성해야만 안쪽 클래스(B) 객체를 만들 수 있다는 것!

정적 멤버 클래스
static 키워드가 붙은 중첩 클래스예요
인스턴스 멤버 클래스와의 핵심 차이는 바깥 객체 없이 바로 생성 가능하다는 점입니다

여기서 중요한 포인트!!
static class B에서 static이 "B 객체가 하나만 만들어진다"는 뜻이 아니에요
"B 설계도를 사용하는 데 바깥 객체가 필요 없다"는 의미입니다
그래서 new를 자유롭게 써서 여러 개 만들 수 있어요
로컬 클래스

생성자나 메서드 내부에서만 선언되는 클래스예요
해당 메서드 실행 중에만 존재하고, 접근 제한자도 붙일 수 없어요
(메서드 안에서만 쓰이니까 의미가 없기 때문!)
그래서 중첩 클래스를 왜 쓰나요?
실무 예시가 꽤 와닿았어요
- 안드로이드/GUI의 이벤트 리스너: 버튼 클릭 로직은 그 화면 안에서만 의미가 있으니까, 익명 객체나 중첩 클래스로 처리
- 자료구조의 Node: LinkedList나 Tree를 만들 때,
Node클래스는 외부에서 직접 쓸 일이 없으니private static class Node로 숨겨버림
외부에 노출할 필요 없는 클래스를 안쪽에 감춰서 코드 복잡성을 줄인다는 게 핵심인 것 같아요
바깥 객체 접근하기
중첩 클래스 안에서 바깥 클래스에 접근할 때는 바깥클래스이름.this를 사용합니다
void print() {
System.out.println(this.field); // 내 자신(B)의 필드
System.out.println(A.this.field); // 바깥(A)의 필드
}
B와 A에 같은 이름의 변수가 있을 때 구분하는 방법이에요!
이거 처음 봤을 때 되게 신기했습니다ㅋㅋㅋ
익명 객체 ⭐
이번 주 하이라이트!!
익명 자식 객체 - 클래스를 상속받아 즉석에서 만드는 방식
Tire tire = new Tire() {
@Override
public void roll() {
System.out.println("익명 자식 Tire 객체가 굴러갑니다.");
}
};
익명 구현 객체 - 인터페이스를 즉석에서 구현하는 방식
btn.setClickListener(new Button.ClickListener() {
@Override
public void onClick() {
System.out.println("클릭!");
}
});
원래 인터페이스는 new 자체가 불가능한데,
{} 블록을 붙여서 "이 자리에서 이름 없는 구현 클래스를 즉석으로 만들겠다"는 선언을 하는 거예요
그래서 '익명 객체'라고 부르는 거고요
매번 클래스 파일을 따로 만들지 않아도 된다는 점에서 굉장히 편리한 것 같아요
안드로이드나 UI 이벤트 처리에서 많이 쓰인다는 게 바로 이해가 됐습니다!!
익명 구현 객체 vs 익명 객체
공부하다보니 익명 구현 객체와, 익명 객체의 차이점이 궁금하더라구요


대략 이런 차이점이 존재했습니다!
마무리
이번 주는 솔직히 양이 꽤 많아서 정리하면서도 머리가 핑핑 돌았어요
특히 중첩 클래스 파트에서 인스턴스 멤버 / 정적 멤버 / 로컬 클래스 세 가지를 구분하는 게
처음에는 헷갈렸는데, 핵심 기준이 "바깥 객체 필요 여부"라는 걸 파악하고 나서 정리가 됐습니다
그리고 익명 객체는... 처음엔 왜 쓰나 싶었는데
막상 활용 사례 보니까 "이거 람다랑 비슷한 느낌이다!" 싶었어요
나중에 람다 배우면서 다시 복습하게 될 것 같은 예감이 듭니다 ㅎㅎ

그동안 수업 들으면서 노션에 열심히 정리했는데
벌써 이만큼 쌓인거 보니 ... 그래도 시간이 많이 지나긴 했네요
이제 java쪽 배우면서 부족한 부분을 많이 보완할 수 있을 것 같습니다!
다음 주차도 열심히 소화해볼게요
KB IT's Your Life 수료까지 아자좟!!!!!

'EDUCATION > [KB] IT's Your Life' 카테고리의 다른 글
| [KB IT's Your Life] 10주차 후기, 람다 (0) | 2026.05.11 |
|---|---|
| [KB IT's Your Life] 9주차 후기, 백엔드 개발을 위한 자바프로그래밍 후기 (0) | 2026.05.07 |
| [KB IT's Your Life 7기] 7주차 후기, 스켈레톤 프로젝트(가계부 앱) 후기 (7) | 2026.04.20 |
| [KB IT's Your Life 7기] 6주차 교육 후기, pinia & axios (1) | 2026.04.13 |
| [KB IT's Your Life 7기] 5주차 교육 후기, Composition API (1) | 2026.04.05 |