개발 이론/JAVA

객체지향이란?

jeonghoe21 2025. 2. 1. 00:23

객체지향이란?

객체지향(Object-Oriented Programming, OOP)이란 프로그램을 객체의 집합으로 바라보고, 이 객체들이 서로 상호작용하며 동작하는 프로그래밍 패러다임입니다. 객체지향의 핵심 개념은 다음과 같습니다.

  1. 캡슐화(Encapsulation): 데이터와 메소드를 하나로 묶고, 데이터를 외부에서 직접 접근하지 못하도록 제한합니다.
  2. 상속(Inheritance): 기존 클래스의 속성과 동작을 새로운 클래스에서 재사용할 수 있도록 합니다.
  3. 다형성(Polymorphism): 같은 인터페이스를 공유하는 여러 개의 클래스가 서로 다른 동작을 수행할 수 있습니다.
  4. 추상화(Abstraction): 불필요한 세부 사항을 숨기고 중요한 부분만을 드러내어 객체를 설계하는 개념입니다.

객체지향 프로그래밍을 사용하면 코드의 재사용성과 유지보수성이 높아지고, 프로그램의 구조를 더 명확하게 만들 수 있습니다.

Chapter 1: 클래스(Class)와 객체(Object)

클래스(class)란?

클래스는 객체를 정의하는 청사진(템플릿)입니다. 객체의 상태(필드)와 동작(메소드)을 포함합니다.

class Car {
    String model; // 자동차 모델명
    int year; // 자동차 연식
}

객체(Object)란?

객체는 클래스를 기반으로 생성된 실체(instance)로, 클래스에서 정의한 속성과 동작을 가집니다.

Car myCar = new Car();
myCar.model = "Tesla";
myCar.year = 2023;

추상화

추상화란 객체의 본질적인 특징만을 추출하고 불필요한 세부사항은 제거하는 과정입니다.

abstract class Animal {
    abstract void makeSound(); // 구체적인 동작은 하위 클래스에서 정의
}

Chapter 2: 캡슐화(encapsulation)

데이터와 메소드의 결합

캡슐화는 데이터(필드)와 메소드(행위)를 하나로 묶고, 데이터의 직접 접근을 제한하는 기법입니다.

class Person {
    private String name; // 직접 접근 불가
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

접근 가시성 제어

  • private: 클래스 내부에서만 접근 가능
  • public: 어디서든 접근 가능
  • protected: 같은 패키지 또는 하위 클래스에서 접근 가능

객체 데이터

객체의 데이터를 캡슐화하여 불필요한 변경을 방지하고 보안성을 향상시킵니다.

Person p = new Person();
p.setName("John");
System.out.println(p.getName()); // John

Chapter 3: Java와 객체지향

Hello, World Revisited

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

단순한 클래스 정의

class Dog {
    String breed; // 견종
}

새 객체 인스턴스화

Dog myDog = new Dog();

this 키워드

this 키워드는 현재 객체를 참조하는 데 사용됩니다.

class Car {
    String model;
    
    Car(String model) {
        this.model = model; // 인스턴스 변수와 지역 변수를 구분
    }
}

포함된 클래스 생성 및 접근

class Outer {
    class Inner {
        void display() {
            System.out.println("Inner class");
        }
    }
}
Outer.Inner obj = new Outer().new Inner();
obj.display();

Chapter 4: 객체지향 시스템 정의

상속(Inheritance)

상속은 기존 클래스의 속성과 메소드를 새 클래스가 재사용할 수 있도록 하는 기법입니다.

class Animal {
    void eat() {
        System.out.println("Eating...");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Barking...");
    }
}

다형성(Polymorphism)

다형성은 같은 인터페이스를 공유하는 여러 개의 클래스가 서로 다른 동작을 할 수 있도록 하는 기법입니다.

class Animal {
    void makeSound() {
        System.out.println("Some sound...");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("Bark");
    }
}

Animal myDog = new Dog();
myDog.makeSound(); // Bark

추상 클래스(Abstract Class)

추상 클래스는 인스턴스를 생성할 수 없으며, 하위 클래스가 반드시 구현해야 할 추상 메소드를 가질 수 있습니다.

abstract class Shape {
    abstract void draw();
}

인터페이스(Interface)

인터페이스는 클래스가 반드시 구현해야 할 메소드 목록을 정의하는 역할을 합니다.

interface Animal {
    void makeSound();
}

class Dog implements Animal {
    public void makeSound() {
        System.out.println("Bark");
    }
}

바인딩(Binding) 개념

바인딩(Binding)이란, 프로그램에서 호출된 메소드나 변수의 실제 메모리 위치를 연결하는 과정입니다.

  • 이른 바인딩(Early Binding): 컴파일 타임에 메소드가 결정됨.
  • 늦은 바인딩(Late Binding): 실행 시점에서 메소드가 결정됨 (동적 바인딩).

이른 바인딩(Early Binding)

이른 바인딩은 컴파일 시점에 메소드 호출이 결정되며, 일반적으로 정적 메소드나 private 메소드 호출 시 사용됩니다.

class Parent {
    void show() {
        System.out.println("Parent class");
    }
}

Parent obj = new Parent();
obj.show(); // 컴파일 시점에 결정됨 (이른 바인딩)

늦은 바인딩(Late Binding)

늦은 바인딩은 실행 시점에서 메소드가 결정되며, 주로 다형성(Polymorphism)에서 사용됩니다.

class Parent {
    void show() {
        System.out.println("Parent class");
    }
}

class Child extends Parent {
    void show() {
        System.out.println("Child class");
    }
}

Parent obj = new Child();
obj.show(); // 실행 시점에 Child 클래스의 show() 호출 (늦은 바인딩)

늦은 바인딩을 활용하면 객체의 실제 타입에 따라 메소드가 동적으로 결정되므로 유연한 프로그램 설계가 가능합니다.

'개발 이론 > JAVA' 카테고리의 다른 글

Collection  (0) 2025.02.02
상속  (0) 2025.02.01
배열  (0) 2025.02.01
메소드  (0) 2025.01.31
Statement와 Exception  (0) 2025.01.30