개발일지
자바 기초 정리 - 객체지향 심화 (추상클래스, 인터페이스, 설계)
동훈
•
2026-06-30 09:11
조회수
4
들어가며
오늘은 자바의 객체지향 개념을 확장하여 추상클래스와 인터페이스를 학습하고,
이를 바탕으로 쇼핑몰 주문 시스템을 단계적으로 구현해보았다.
단순한 문법 이해를 넘어서, 실제로 클래스를 설계하고 관계를 구성하는 과정에서
여러 가지를 고민해볼 수 있었다.
추상 클래스 vs 인터페이스
두 개념은 비슷해 보이지만, 목적이 다르다.
구분 추상 클래스 인터페이스
키워드 extends implements
목적 공통 기능 공유 기능(규격) 정의
다중 상속 불가능 가능
필드 일반 변수 가능 상수만 가능
메서드 일반 + 추상 추상, default
언제 사용하는가
추상 클래스
→ "A는 B다" 관계 (is-a)
→ 공통된 속성과 기능을 함께 사용할 때
인터페이스
→ "A는 B를 할 수 있다" 관계 (can-do)
→ 서로 다른 클래스에 동일한 기능을 부여할 때
인터페이스는 구현을 교체하기 쉬워 결합도를 낮출 수 있기 때문에
실무에서 더 자주 사용된다.
생성자와 초기화 (++ 위치)
public BankAccount(String name){
this.name = name;
accountNumber = ++lastAccountNumber;
}
++lastAccountNumber처럼 증가를 먼저 수행해야 올바른 값이 들어간다
lastAccountNumber++를 사용할 경우 기존 값이 먼저 할당된다
생성자와 setter를 함께 사용하는 이유
자동 생성자를 그대로 사용할 경우 검증 로직이 빠질 수 있다.
// 자동 생성자
public Product(String id, String name, int price, int stock) {
this.id = id;
this.name = name;
this.price = price;
this.stock = stock;
}
// 개선된 방식
public Product(String id, String name, int price, int stock) {
this.id = id;
this.name = name;
setPrice(price);
setStock(stock);
}
자동 생성자 기능을 사용하면 검증 로직을 건너뛸 수 있다는 점을 깨달았다.
그래서 setter를 활용한 수동 생성자 구현으로 안정성을 높이는 것이 중요하다고 느꼈다.
캡슐화와 정보 은닉
@Override
public void inform() {
System.out.println("------상품 정보------");
// System.out.println("상품 고유 ID : " + getId()); // 내부용 정보
System.out.println("상품명 : " + getName());
System.out.println("가격 : " + getPrice());
System.out.println("재고 수량 : " + getStock());
}
내부에서만 사용하는 정보는 외부에 노출하지 않는 것이 중요하다
캡슐화를 통해 데이터의 안정성을 유지할 수 있다
Scanner 버퍼 문제
int age = sc.nextInt();
sc.nextLine(); // 버퍼 비우기
String name = sc.nextLine();
nextInt() 이후 nextLine()을 바로 사용하면 빈 문자열이 들어오는 문제가 발생한다
버퍼를 비워주는 처리가 필요하다
구현하면서 느낀 점
쇼핑몰 주문 시스템을 구현하면서
초반에는 구조가 단순해서 쉽게 진행됐지만,
클래스와 메서드가 많아질수록 관계를 관리하는 것이 어려워졌다.
특히 다음 부분에서 부족함을 느꼈다.
클래스 간 책임 분리
데이터 흐름 정리
설계 단계에서 구조를 미리 잡는 것
단순히 기능을 구현하는 것보다,
처음부터 구조를 어떻게 설계하느냐가 더 중요하다는 것을 느꼈다.
정리하며
추상 클래스와 인터페이스는 목적에 따라 선택해야 한다
생성자와 setter를 함께 사용하면 안정적인 초기화가 가능하다
캡슐화를 통해 데이터를 안전하게 보호할 수 있다
작은 구현에서도 설계가 중요하다는 것을 확인했다
앞으로
구현 경험을 더 쌓으면서
단순히 동작하는 코드가 아니라 구조가 명확한 코드를 작성하는 연습이 필요하다.
특히 클래스 간 관계를 설계하는 연습을 반복해볼 예정이다.