Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java) 클래스의 6가지 유형 완벽 정리: 구체 클래스부터 내부 클래스까지

자바(Java)에서는 용도와 선언 방식에 따라 다양한 유형의 클래스를 활용할 수 있습니다. 각 클래스 유형은 고유한 특징과 목적을 가지며, 이를 제대로 이해하면 더 깔끔하고 효율적인 코드를 작성하는 데 큰 도움이 됩니다. 이번 글에서는 자바의 대표적인 클래스 유형 6가지를 예제 코드와 함께 자세히 살펴보겠습니다.

1. 구체 클래스(Concrete Class)

구체 클래스는 추상 메서드를 하나도 포함하지 않은 일반적인 클래스를 말합니다. 부모 클래스나 인터페이스의 모든 메서드를 완전히 구현했거나, 자신이 가진 모든 메서드에 대한 구현 내용을 포함하는 클래스도 구체 클래스에 해당합니다. 구체 클래스는 별도의 제약 없이 직접 객체를 생성할 수 있다는 것이 가장 큰 특징입니다.

예제

public class Concrete { // Concrete Class
    static int product(int a, int b) {
        return a * b;
    }
    public static void main(String args[]) {
        int p = product(2, 3);
        System.out.println("Product: " + p);
    }
}

실행 결과

Product: 6

2. 추상 클래스(Abstract Class)

abstract 키워드로 선언되며, 하나 이상의 추상 메서드를 포함하거나 추상 메서드 없이 선언만 된 클래스를 추상 클래스라고 합니다. 추상 클래스는 미완성(incomplete) 클래스이기 때문에 그 자체로 객체를 생성할 수 없으며, 반드시 구체 클래스가 이를 상속(extends)하여 나머지 부분을 구현해야만 사용할 수 있습니다.

예제

abstract class Animal { //abstract parent class
    public abstract void sound(); //abstract method
}
public class Dog extends Animal { //Dog class extends Animal class
    public void sound() {
        System.out.println("Woof");
    }
    public static void main(String args[]) {
        Animal a = new Dog();
        a.sound();
    }
}

실행 결과

Woof

3. 최종 클래스(Final Class)

final 키워드로 선언된 클래스를 최종(final) 클래스라고 하며, 다른 클래스가 이를 상속(확장)할 수 없습니다. 대표적인 예로 자바 표준 라이브러리의 java.lang.System 클래스가 있습니다. 상속을 통한 변경을 원천적으로 차단하여 클래스의 동작을 보장하고 싶을 때 사용합니다.

예제

final class BaseClass {
    void Display() {
        System.out.print("This is Display() method of BaseClass.");
    }
}
class DerivedClass extends BaseClass { //Compile-time error - can't inherit final class
    void Display() {
        System.out.print("This is Display() method of DerivedClass.");
    }
}
public class FinalClassDemo {
    public static void main(String[] arg) {
        DerivedClass d = new DerivedClass();
        d.Display();
    }
}

위 예제에서 DerivedClass가 BaseClass(final)를 상속하려고 시도하고 있습니다. final 클래스는 상속될 수 없으므로 컴파일러가 오류를 발생시키며, 해당 프로그램은 실행되지 않습니다.

실행 결과

cannot inherit from final BaseClass
Compile-time error - can't inherit final class

4. POJO 클래스(Plain Old Java Object)

POJO(Plain Old Java Object) 클래스는 private 변수와 해당 변수에 접근하기 위한 setter/getter 메서드만으로 구성된 클래스입니다. 내부 데이터를 외부에 직접 노출하지 않고 메서드를 통해서만 접근하도록 설계되므로, 완전히 캡슐화된(encapsulated) 클래스라고 할 수 있습니다. 주로 데이터를 담는 DTO나 엔티티 클래스로 널리 활용됩니다.

예제

class POJO {
    private int value = 100;
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}
public class Test {
    public static void main(String args[]) {
        POJO p = new POJO();
        System.out.println(p.getValue());
    }
}

실행 결과

100

5. 정적 클래스(Static Class)

정적 클래스는 중첩 클래스(nested class)의 한 종류로, 다른 클래스 내부에 static 멤버 형태로 선언된 클래스를 의미합니다. 정적 클래스는 외부 클래스의 인스턴스 생성 없이 독립적으로 사용할 수 있다는 장점이 있습니다.

예제

import java.util.Scanner;
class staticclasses {
    static int s; // static variable
    static void met(int a, int b) { // static method
        System.out.println("static method to calculate sum");
        s = a + b;
        System.out.println(a + "+" + b); // print two numbers
    }
    static class MyNestedClass { // static class
        static { // static block
            System.out.println("static block inside a static class");
        }
        public void disp() {
            int c, d;
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter two values");
            c = sc.nextInt();
            d = sc.nextInt();
            met(c, d); // calling static method
            System.out.println("Sum of two numbers-" + s); // print the result in static variable
        }
    }
}
public class Test {
    public static void main(String args[]) {
        staticclasses.MyNestedClass mnc = new staticclasses.MyNestedClass(); // object for static class
        mnc.disp(); // accessing methods inside a static class
    }
}

실행 결과

static block inside a static class
Enter two values 10 20
static method to calculate sum
10+20
Sum of two numbers-30

6. 내부 클래스(Inner Class)

내부 클래스는 또 다른 클래스나 메서드 안에 선언된 클래스를 말합니다. 외부 클래스의 멤버에 손쉽게 접근할 수 있어, 특정 클래스와 밀접하게 연관된 로직을 함께 묶어 관리할 때 유용합니다.

예제

public class OuterClass {
    public static void main(String[] args) {
        System.out.println("Outer");
    }
    class InnerClass {
        public void inner_print() {
            System.out.println("Inner");
        }
    }
}

실행 결과

Outer

마무리

지금까지 자바의 대표적인 클래스 유형 6가지를 알아보았습니다. 구체 클래스는 일반적인 구현에, 추상 클래스는 공통 기능의 설계에, final 클래스는 상속 제한이 필요한 경우에 적합합니다. 또한 POJO는 데이터 캡슐화에, 정적 클래스와 내부 클래스는 클래스 간의 논리적 결합이 필요한 상황에서 활용하면 좋습니다. 각 유형의 특징을 잘 이해하고 상황에 맞게 선택한다면, 더욱 견고하고 유지 보수하기 쉬운 자바 애플리케이션을 개발할 수 있습니다.