KT에이블스쿨 7기

[KT AIVLE School 7기] 객체지향 프로그래밍 기초: 클래스와 상속 이해

CodeForWelfare 2025. 5. 26. 20:34

이 글에서는 자바의 객체지향 개념 중 심화 주제를 다룹니다.

추상 클래스, 인터페이스, 예외 처리, 컬렉션은 자바 실무 프로그래밍에서 자주 사용되는 핵심 기능입니다.


1. 추상화 (Abstraction)

1-1. 추상 클래스 (abstract class)

추상 클래스는 하나 이상의 추상 메서드(구현되지 않은 메서드)를 포함하는 클래스입니다. 공통 기능은 구현하고, 특수 기능은 하위 클래스에서 구현하도록 강제할 수 있습니다. 추상 클래스는 클래스 간의 공통적인 기능을 정의하고, 구체적인 구현은 자식 클래스에 맡깁니다.

abstract class Animal {
    abstract void makeSound();  // 추상 메서드

    void eat() {
        System.out.println("먹는 중...");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("멍멍");
    }
}
  • 추상 클래스는 인스턴스를 직접 생성할 수 없습니다.
  • 추상 메서드를 포함하고 있으며, 이를 상속받은 클래스는 반드시 해당 메서드를 구현해야 합니다.
  • 일반 메서드도 포함할 수 있어 공통 동작을 정의할 수 있습니다.

예: 동물(Animal)은 소리를 내는 방식이 다르므로 makeSound()는 추상 메서드로, 먹는 방식은 동일하므로 eat()은 일반 메서드로 정의합니다.


1-2. 인터페이스 (interface)

인터페이스는 순수한 추상 메서드의 집합으로, 클래스가 반드시 구현해야 하는 동작(규칙)을 정의합니다. 클래스는 implements 키워드를 사용해 인터페이스를 구현합니다. 하나의 클래스가 여러 인터페이스를 구현할 수 있어, 다중 상속이 가능합니다.

interface Flyable {
    void fly();
}

interface Swimmable {
    void swim();
}

class Duck implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("오리가 납니다");
    }

    @Override
    public void swim() {
        System.out.println("오리가 헤엄칩니다");
    }
}
  • 자바 8부터 default 메서드(구현 포함)와 static 메서드를 인터페이스에 선언할 수 있습니다.
  • 인터페이스를 통해 느슨한 결합(Loosely Coupled) 구조를 만들 수 있습니다.

인터페이스는 설계의 핵심으로, 클래스가 어떤 기능을 제공할지를 명확히 정의할 수 있습니다.


2. 예외 처리 (Exception Handling)

예외(Exception)는 프로그램 실행 중 발생하는 비정상적인 상황입니다. 자바는 try-catch-finally 구조로 예외를 안전하게 처리하고, 프로그램이 중단되지 않도록 합니다.

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다.");
} finally {
    System.out.println("항상 실행됩니다");
}
  • try: 예외가 발생할 수 있는 코드 블록
  • catch: 특정 예외가 발생했을 때 실행할 코드
  • finally: 예외 발생 여부와 관계없이 무조건 실행됨

2-1. 주요 예외 클래스

예외 종류설명

ArithmeticException 수학적 계산 오류 (예: 0으로 나누기)
NullPointerException null 객체에 접근했을 때
ArrayIndexOutOfBoundsException 배열 인덱스 초과 접근 시
ClassCastException 잘못된 형변환 시 발생
IOException 파일, 스트림 등 입출력 작업 오류

2-2. 예외 던지기

예외를 직접 발생시키거나, 상위 메서드로 전가할 수도 있습니다.

public void divide(int a, int b) throws ArithmeticException {
    if (b == 0) {
        throw new ArithmeticException("0으로 나눌 수 없습니다");
    }
    System.out.println(a / b);
}

예외 처리는 프로그램의 안정성과 유지보수성을 높이는 중요한 기법입니다.


3. 컬렉션 프레임워크 (Collection Framework)

컬렉션은 데이터를 효율적으로 저장하고 관리할 수 있는 자료구조입니다. 배열보다 유연하고 다양한 기능을 제공합니다. 컬렉션은 List, Set, Map 인터페이스를 중심으로 구성됩니다.

3-1. List (순서 O, 중복 O)

순서가 유지되며, 동일한 값을 여러 개 저장할 수 있습니다. 대표 클래스: ArrayList, LinkedList

import java.util.ArrayList;

ArrayList<String> fruits = new ArrayList<>();
fruits.add("사과");
fruits.add("바나나");
System.out.println(fruits.get(0));  // 사과

3-2. Set (순서 X, 중복 X)

중복을 허용하지 않는 집합 형태입니다. 대표 클래스: HashSet, TreeSet

import java.util.HashSet;

HashSet<String> names = new HashSet<>();
names.add("철수");
names.add("철수");  // 중복 무시
System.out.println(names.size());  // 1

3-3. Map (Key-Value 쌍 저장)

고유한 key에 value를 매핑하여 저장합니다. 대표 클래스: HashMap, TreeMap

import java.util.HashMap;

HashMap<String, Integer> price = new HashMap<>();
price.put("콜라", 1500);
price.put("사이다", 1400);
System.out.println(price.get("콜라"));  // 1500

3-4. 반복문과 함께 사용

컬렉션은 향상된 for문과 함께 자주 사용됩니다.

for (String fruit : fruits) {
    System.out.println(fruit);
}

컬렉션은 실무에서 데이터를 저장, 탐색, 수정, 삭제할 때 매우 자주 사용됩니다. 상황에 맞는 컬렉션 구조 선택이 중요합니다.