Java

명품자바 프로그래밍의 기초: 4장

통촏하여주시옵소서 2024. 8. 14. 05:27

객체 지향 프로그래밍의 핵심 개념 정리

이 글에서는 자바의 객체 지향 프로그래밍(OOP)에서 중요한 개념인 객체, 클래스, 상속, 다형성, 캡슐화 등을 소개합니다. 자바에서 이 개념들을 어떻게 구현하고 활용하는지 다양한 예제와 함께 설명합니다.


1. 객체와 클래스

  • 객체(Object): 실세계의 사물이나 개념을 컴퓨터 프로그램에서 표현한 것. 객체는 상태(state)와 행동(behavior)을 가집니다.
  • 클래스(Class): 객체를 만들기 위한 설계도. 클래스는 객체의 속성(필드)과 동작(메소드)을 정의합니다.
  • class Circle { int radius; // 필드 String name; // 필드 double getArea() { // 메소드 return 3.14 * radius * radius; } }
  • 예제:

2. 캡슐화 (Encapsulation)

캡슐화는 객체의 내부 구현을 외부에서 볼 수 없도록 숨기는 개념입니다. 객체 내부의 데이터는 외부에서 직접 접근할 수 없으며, 공개된 메소드를 통해서만 접근이 가능합니다.

예제:

class Circle {
    private int radius; // private 필드
    private String name; // private 필드

    public double getArea() { // public 메소드
        return 3.14 * radius * radius;
    }
}

3. 상속 (Inheritance)

상속은 기존 클래스(부모 클래스)의 속성과 동작을 새로운 클래스(자식 클래스)에 물려주는 개념입니다. 자식 클래스는 부모 클래스의 모든 특성을 상속받아 확장하거나 변경할 수 있습니다.

예제:

class Animal {
    void sound() {
        System.out.println("소리를 냅니다.");
    }
}

class Dog extends Animal {
    void sound() { // 메소드 오버라이딩
        System.out.println("멍멍");
    }
}

4. 다형성 (Polymorphism)

다형성은 같은 이름의 메소드가 서로 다른 클래스에서 다르게 동작하도록 하는 개념입니다. 대표적인 예로 메소드 오버로딩과 오버라이딩이 있습니다.

  • 메소드 오버로딩: 같은 이름의 메소드를 매개변수의 타입이나 개수에 따라 다르게 정의하는 것.
  • class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } }
  • 예제:
  • 메소드 오버라이딩: 부모 클래스의 메소드를 자식 클래스에서 재정의하는 것.
  • class Animal { void sound() { System.out.println("소리를 냅니다."); } } class Cat extends Animal { void sound() { // 오버라이딩 System.out.println("야옹"); } }
  • 예제:

5. 생성자 (Constructor)

생성자는 객체가 생성될 때 초기화를 담당하는 특별한 메소드입니다. 생성자는 클래스 이름과 동일해야 하며, 반환 타입이 없습니다.

예제:

class Circle {
    int radius;
    String name;

    // 매개변수가 없는 생성자
    public Circle() {
        radius = 1;
        name = "Unnamed Circle";
    }

    // 매개변수가 있는 생성자
    public Circle(int r, String n) {
        radius = r;
        name = n;
    }
}

6. this 키워드

this 키워드는 객체 자신을 참조하는 레퍼런스입니다. 주로 객체의 필드와 메소드 매개변수의 이름이 동일할 때, 객체 자신의 필드를 가리킬 때 사용됩니다.

예제:

class Circle {
    int radius;

    public Circle(int radius) {
        this.radius = radius; // this.radius는 객체의 필드를 가리킴
    }
}

7. static 키워드

static 키워드는 클래스의 모든 객체가 공유하는 클래스 멤버(필드와 메소드)를 정의할 때 사용됩니다. static으로 정의된 필드와 메소드는 객체를 생성하지 않고도 클래스 이름으로 직접 접근할 수 있습니다.

예제:

class MathUtil {
    public static int abs(int a) {
        return (a < 0) ? -a : a;
    }
}

// static 메소드 호출
int result = MathUtil.abs(-10);

8. 가비지 컬렉션 (Garbage Collection)

자바는 사용되지 않는 객체(가비지)를 자동으로 메모리에서 회수하는 가비지 컬렉션을 지원합니다. 개발자는 객체를 명시적으로 삭제할 필요가 없으며, System.gc() 메소드를 통해 가비지 컬렉션을 요청할 수 있습니다.