
안녕하세요! <코딩 자율학습 나도코딩의 자바 입문> 교재와 함께하는 코딩학습단 21기, 4주차(10장 후반부~14장) 학습을 완료했습니다.
지난 3주차까지 객체지향 프로그래밍(OOP)의 뼈대를 세웠다면, 이번 4주차는 실제 자바 개발 실무에서 자주 사용하는 핵심 기능들을 다뤘습니다. 인터페이스를 통한 유연한 설계, 대량의 데이터를 효율적으로 관리하는 컬렉션 프레임워크, 시스템의 안정성을 위한 예외 처리, 그리고 외부 파일과 소통하는 입출력(I/O)까지 5일간의 학습 기록을 공유합니다.
16일차: 참조(Reference)의 비밀과 final, enum (10장 후반)
16일차에는 자바 메모리 구조를 이해하는 데 필수적인 값과 주소의 차이(참조), 그리고 데이터의 변형을 막는 키워드들을 학습했습니다.
- 값 복사 vs 주소 복사: 기본 자료형(
int a = 10; b = a;)은 값 자체가 복사되지만, 객체(Camera c2 = c1;)는 값이 아닌 객체가 위치한 메모리의 주소값이 복사된다는 중요한 차이를 확인했습니다. 주소를 공유하기 때문에 어느 한쪽에서 값을 변경하면 다른 쪽도 영향을 받는 ‘참조’의 개념을 확실히 짚고 넘어갔습니다.
final키워드: 변수 앞에 붙이면 더 이상 값을 변경할 수 없는 ‘상수’가 됩니다. 절대 바뀌면 안 되는 설정값이나 고유 부품 정보 등을 안전하게 보호할 때 사용합니다.
- 열거형(
enum): 해상도(HD, FHD, UHD)나 옷 사이즈처럼 정해진 몇 가지 값만 가져야 하는 경우 사용하는 특별한 타입입니다. 개발자가 실수로 잘못된 값을 입력하는 것을 컴파일 단계에서 원천 차단하여 코드의 안정성을 높여줍니다.
17일차: 규격화와 유연성의 극치, 추상 클래스와 인터페이스 (11장)
17일차에는 상속을 한 단계 더 발전시켜 설계의 유연성을 극대화하는 추상 클래스와 인터페이스를 다뤘습니다.
- 추상 클래스(
abstract): 완성되지 않은 메서드(추상 메서드)를 품고 있는 미완성 설계도입니다. 자식 클래스가 반드시 특정 메서드를 강제로 오버라이딩하여 구현하도록 강제성을 부여합니다.
- 인터페이스(
interface): 자바의 클래스는 다중 상속이 불가능하지만, 인터페이스는 여러 개를 동시에 구현(implements)할 수 있습니다.
카메라 본체 코드는 건드리지 않고, 화재 감지기(Detectable)나 자동 신고기(Reportable) 같은 인터페이스 부품들을 조립하듯 갈아 끼우는 실습을 진행했습니다. 의존성을 주입(Setter 활용)하여 실행 중에 일반 부품을 고급 부품으로 유연하게 교체하는 객체지향 설계의 장점을 직접 코드로 확인했습니다.
package chap_11;
import chap_11.camera.FactoryCam02;
import chap_11.detector.AdvancedFireDetector;
import chap_11.reporter.VideoReporter;
public class _02_Interface {
public static void main(String[] args) {
AdvancedFireDetector advancedFireDetector = new AdvancedFireDetector();
VideoReporter videoReporter = new VideoReporter();
FactoryCam02 factoryCam = new FactoryCam02();
System.out.println("--- 고급 부품으로 교체 장착 ---");
factoryCam.setDetector(advancedFireDetector);
factoryCam.setReporter(videoReporter);
factoryCam.detect();
factoryCam.report();
}
}18일차: 데이터를 담는 마법의 상자, 컬렉션 프레임워크 (12장)
18일차는 실무에서 배열보다 자주 쓰이는 컬렉션 프레임워크(Collection Framework)를 집중 학습했습니다. 다양한 데이터 구조를 코드로 구현해 보았습니다.
List(순서 O, 중복 O): 인덱스를 기반으로 데이터를 관리하며, 크기가 동적으로 늘어나는ArrayList와LinkedList를 실습했습니다.
Set(순서 X, 중복 X): 데이터의 중복을 허용하지 않는 자료구조입니다.HashSet을 이용해 장바구니 메모 리스트에서 중복된 상품을 걸러내는 로직을 구현했습니다.
Map(Key-Value 쌍): 사전처럼 키(Key)와 값(Value)을 묶어 저장하는HashMap을 실습했습니다. 키는 중복될 수 없다는 특징을 이용해 고객별 누적 포인트를 갱신하는 로직을 구성해보았습니다.
Iterator: 컬렉션의 요소를 순회하며 조건에 맞는 데이터(예: 알 수 없는 사용자)를 안전하게 삭제(.remove())하는 표준화된 방법을 익혔습니다.
package chap_12;
import java.util.HashMap;
public class _04_HashMap {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("홍길동", 10);
map.put("임꺽정", 5);
map.put("전우치", 15);
if(map.containsKey("전우치")) {
int point = map.get("전우치");
map.put("전우치", ++point);
System.out.println("전우치 님의 누적 포인트: " + map.get("전우치"));
}
}
}19일차: 시스템 붕괴를 막는 방패, 예외 처리 (13장)
19일차에는 프로그램 실행 중 발생할 수 있는 에러에 대처하는 예외 처리(Exception Handling)를 배웠습니다. 원인을 파악하고 시스템 종료 없이 다음 로직으로 유도하는 안전장치입니다.
try-catch블록: 위험한 코드를try에 넣고, 예외가 발생하면catch에서 처리합니다.NullPointerException,ArithmeticException등 상황에 맞춰 다중 처리하는 방법을 배웠습니다.
throw와finally: 비즈니스 로직상 허용할 수 없는 상황일 때 개발자가 직접 예외를 발생(throw)시키는 방법과, 에러 여부와 상관없이 무조건 실행되어야 하는finally블록의 역할을 확인했습니다.
try-with-resources:AutoCloseable인터페이스를 구현한 클래스(MyFileWriter)를 사용할 때, 블록이 끝나면.close()를 명시하지 않아도 자바가 알아서 자원을 반납하여 메모리 누수를 막아주는 구조를 실습했습니다.
package chap_13;
public class _05_TryWithResources {
public static void main(String[] args) {
// try-with-resources 구문: 소괄호() 안에서 선언된 객체는 작업 완료 후 자동으로 close() 호출
try (MyFileWriter writer = new MyFileWriter()) {
writer.write("빵이 먹고 싶어요.");
} catch (Exception e) {
e.printStackTrace();
}
}
}20일차: 데이터의 영속성, 입출력과 파일 (14장)
20일차에는 프로그램 내부 데이터를 외부 파일 시스템과 연결하는 입출력(I/O)을 학습했습니다.
- 사용자 입력과 포맷 출력:
Scanner클래스로 사용자로부터 데이터를 입력받아 변수에 저장하고,System.out.printf()를 활용해 간격을 맞춘 성적표 포맷으로 출력하는 방법을 익혔습니다.
- 파일과 폴더 다루기: 자바 코드를 통해
.mkdirs()로 폴더를 생성하고, 파일 목록(listFiles())을 순회하며 구조를 파악하는 로직을 구현했습니다.
- 파일 읽고 쓰기:
BufferedWriter로 텍스트 파일에 문자를 기록하고,BufferedReader를 통해 파일 내용을 한 줄씩 읽어오는 실습을 진행하며 입출력의 기초적인 흐름을 파악했습니다.
4주차 마무리 총평
이번 4주차 학습을 통해 인터페이스를 활용한 구조 설계, 컬렉션 프레임워크를 이용한 효율적인 데이터 관리, 그리고 예외 처리와 파일 입출력까지 자바 애플리케이션 구성에 꼭 필요한 핵심 기능들을 직접 구현해 보았습니다. 단순한 문법 학습을 넘어, 실제 프로그램이 데이터를 다루고 외부 환경과 안전하게 소통하는 원리를 이해할 수 있는 시간이었습니다.
이로써 1장부터 14장까지, 4주간에 걸친 <나도코딩의 자바 입문> 교재의 모든 학습 진도를 무사히 완주했습니다! 매일 꾸준히 코드를 작성하며 자바의 기초부터 실무 필수 로직까지 탄탄하게 다질 수 있어 매우 뜻깊은 코딩학습단 스터디였습니다. 여기서 다진 튼튼한 기본기를 바탕으로, 앞으로 더욱 다양한 프로젝트와 심화 학습에 자신 있게 도전해 보겠습니다!
