개발일지

자바 기초 정리 - 객체지향 심화 (추상클래스, 인터페이스, 설계)

동훈 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를 함께 사용하면 안정적인 초기화가 가능하다 캡슐화를 통해 데이터를 안전하게 보호할 수 있다 작은 구현에서도 설계가 중요하다는 것을 확인했다 앞으로 구현 경험을 더 쌓으면서 단순히 동작하는 코드가 아니라 구조가 명확한 코드를 작성하는 연습이 필요하다. 특히 클래스 간 관계를 설계하는 연습을 반복해볼 예정이다.
목록으로