개발일지

자바 기초 정리: 멀티스레딩과 객체지향 설계 실습

동훈 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를 통해 동기화 문제를 해결할 수 있다 객체지향 설계에서는 클래스 간 역할 분리가 핵심이다 작은 실수도 결과에 큰 영향을 주므로 검증이 중요하다 앞으로 객체지향 설계 능력을 키우기 위해 클래스 구조를 먼저 설계하고 구현하는 연습 다양한 예제를 통해 관계 설계 경험 축적 을 계속해 나갈 예정이다.
목록으로