개발일지
자바 기초 정리: 멀티스레딩과 객체지향 설계 실습
동훈
•
2026-06-30 09:11
조회수
5
들어가며
오늘은 자바 기초 내용을 퀴즈로 복습하고,
파일 입출력, 스트림, 멀티스레딩과 동기화 기초를 학습했다.
또한 객체지향 설계를 적용한 Page 실습 프로그램을 구현하면서,
단순 구현을 넘어 클래스 간의 역할과 관계를 고민해볼 수 있었다.
프로세스와 스레드
프로세스 (Process)
실행 중인 프로그램 하나를 의미하며,
각 프로세스는 독립적인 메모리 공간을 가진다.
스레드 (Thread)
프로세스 내부에서 실제 작업을 수행하는 단위이다.
하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
멀티스레딩이 필요한 이유
싱글 스레드는 하나의 작업이 끝날 때까지 다른 작업을 수행할 수 없다.
하지만 멀티스레딩을 사용하면
하나의 작업(예: 다운로드)을 별도 스레드에서 처리하면서
메인 스레드는 동시에 다른 작업을 수행할 수 있다
→ 사용자 경험과 성능이 크게 향상된다.
스레드 생성 방법
Thread 상속
class MyThread extends Thread {
public void run() {
// 작업 내용
}
}
Runnable 구현 (권장)
class MyTask implements Runnable {
public void run() {
// 작업 내용
}
}
Thread는 단일 상속 제한
Runnable은 다른 클래스 상속 가능 + 재사용성 높음
→ 실무에서는 Runnable 방식이 더 많이 사용된다.
start() vs run()
t.run(); // 일반 메서드 호출 (싱글 스레드)
t.start(); // 새로운 스레드 생성
→ 반드시 start()를 사용해야 멀티스레딩이 동작한다.
동기화와 Race Condition
멀티스레딩 환경에서는 여러 스레드가 동시에 같은 데이터에 접근하면서 문제가 발생할 수 있다.
Race Condition
여러 스레드가 동시에 공유 자원 접근
실행 순서에 따라 결과가 달라짐
예: 계좌 잔액이 음수가 되는 문제
synchronized
public synchronized void withdraw() {
// 한 번에 하나의 스레드만 실행
}
특정 영역을 잠궈서 동시에 접근하지 못하도록 함
데이터 안정성을 보장
[실습] Page 프로그램 설계
이번 실습에서는 하나의 프로그램을 여러 클래스로 분리하여 구현했다.
핵심 구조
Page currentPage = new MainPage(sc);
while (currentPage != null) {
currentPage = currentPage.run();
}
설계 포인트
공통 기능 → Page 추상 클래스
각 페이지 → MainPage, HelloPage, InfoPage
run()을 통해 페이지 전환
→ 다형성을 활용하여 어떤 페이지든 동일한 방식으로 실행 가능
느낀 점 (설계 관점)
초반에는 한 클래스에서 절차적으로 만드는 것이 훨씬 쉬웠다.
하지만 객체지향으로 분리하려고 하니:
클래스가 많아지고
관계가 복잡해지고
흐름이 한눈에 안 보이기 시작했다
이 부분에서 난이도가 크게 올라갔다.
→ 객체지향에서는 코드 작성보다 설계가 더 중요하다는 것을 체감했다.
트러블슈팅
할인 금액 계산 오류
// 잘못된 코드
int gradeDiscountAmount = totalPrice - getTotalPrice();
// 수정
int gradeDiscountAmount = totalPrice - getFinalPrice();
→ 변수명과 메서드명을 혼동한 실수
교훈
이름을 명확하게 짓는 것이 중요하다
계산 로직은 한 번 더 검증해야 한다
long 타입 리터럴
long num = 10000000000L;
int 범위를 초과하면 L을 붙여야 함
Setter 사용 신중
Setter는 무분별하게 만들면 위험
필요한 경우에만 제한적으로 사용
정리하며
멀티스레딩은 성능과 사용자 경험을 개선하는 중요한 개념이다
synchronized를 통해 동기화 문제를 해결할 수 있다
객체지향 설계에서는 클래스 간 역할 분리가 핵심이다
작은 실수도 결과에 큰 영향을 주므로 검증이 중요하다
앞으로
객체지향 설계 능력을 키우기 위해
클래스 구조를 먼저 설계하고 구현하는 연습
다양한 예제를 통해 관계 설계 경험 축적
을 계속해 나갈 예정이다.