TIL - 20251025

juni·2025년 10월 24일

TIL

목록 보기
163/316

1025 Java 기초 복습 (2/4): 객체 지향 프로그래밍 (OOP)의 핵심


✅ 1. 객체 지향 프로그래밍 (OOP - Object-Oriented Programming)이란?

  • OOP는 현실 세계의 사물이나 개념을 "객체(Object)"로 모델링하고, 이 객체들 간의 상호작용을 통해 프로그램을 설계하는 방식입니다.
  • 부품에 해당하는 객체들을 먼저 만들고, 이것들을 조립하여 전체 프로그램을 완성하는 상향식(Bottom-up) 개발 방식입니다. 이를 통해 코드의 재사용성을 높이고, 유지보수를 용이하게 만듭니다.

✅ 2. 클래스(Class)와 객체(Object)

  • 클래스 (Class): 객체를 만들어내기 위한 설계도 또는 템플릿입니다. 객체가 가질 속성(상태)행위(동작)를 정의합니다.

  • 객체 (Object): 클래스라는 설계도를 바탕으로, 메모리에 실제로 구현된 실체입니다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(Instance)라고 합니다.

    // 클래스 (설계도)
    class Car {
        // 속성 (멤버 변수, 필드)
        String color;
        int speed;
    
        // 행위 (메서드)
        void drive() {
            System.out.println("차가 달립니다.");
        }
    }
    
    // 객체 생성 (인스턴스화)
    Car myCar = new Car(); // Car 클래스의 인스턴스(객체)를 생성하여 myCar 변수에 할당
    myCar.color = "Red";   // 객체의 속성에 접근
    myCar.drive();         // 객체의 행위를 호출

✅ 3. OOP의 4대 핵심 특징

➕ 3-1. 캡슐화 (Encapsulation)

  • 개념: 관련된 데이터(속성)와 기능(메서드)을 하나의 클래스로 묶고, 외부에서 데이터에 직접 접근하는 것을 막아 정보를 은닉(Information Hiding)하는 것입니다.

  • 구현:

    1. 멤버 변수는 private 접근 제어자로 선언하여 외부 접근을 차단합니다.
    2. 외부에서는 public으로 공개된 메서드(Getter/Setter)를 통해서만 데이터에 접근하고 수정할 수 있도록 허용합니다.
  • 장점:

    • 데이터 보호: 잘못된 값이나 의도치 않은 변경으로부터 데이터를 보호할 수 있습니다. (e.g., setSpeed 메서드에서 음수 값이 들어오지 못하게 막을 수 있음)
    • 유지보수성 향상: 내부 구현이 변경되어도, 외부에 공개된 메서드는 그대로 유지되므로 다른 코드에 미치는 영향을 최소화할 수 있습니다.
    public class Person {
        private int age; // private으로 정보 은닉
    
        // public 메서드를 통해 데이터에 접근
        public int getAge() {
            return this.age;
        }
    
        public void setAge(int age) {
            if (age > 0) { // 데이터 보호
                this.age = age;
            }
        }
    }

➕ 3-2. 상속 (Inheritance)

  • 개념: 기존의 클래스(부모/슈퍼 클래스)를 재사용하여, 그 속성과 메서드를 물려받는 새로운 클래스(자식/서브 클래스)를 만드는 것입니다. (extends 키워드 사용)

  • 장점:

    • 코드 재사용: 중복되는 코드를 줄일 수 있습니다.
    • 계층 구조: 클래스 간의 관계를 명확하게 하여 프로그램을 체계적으로 구성할 수 있습니다.
  • super 키워드: 자식 클래스에서 부모 클래스의 멤버(생성자, 메서드)에 접근할 때 사용합니다.

    class Animal { // 부모 클래스
        void eat() { System.out.println("먹는다"); }
    }
    
    class Dog extends Animal { // 자식 클래스
        void bark() { System.out.println("짖는다"); }
    }
    
    Dog myDog = new Dog();
    myDog.eat();  // 부모의 메서드를 물려받아 사용 가능
    myDog.bark();

➕ 3-3. 다형성 (Polymorphism)

  • 개념: "여러 가지 형태를 가질 수 있는 능력". 하나의 타입(부모 클래스 타입)으로 여러 다른 형태의 객체(자식 클래스 객체)를 참조할 수 있는 성질입니다.

  • 구현:

    1. 메서드 오버라이딩 (Method Overriding): 자식 클래스가 부모 클래스로부터 물려받은 메서드를 자신에게 맞게 재정의하는 것입니다.
    2. 업캐스팅 (Upcasting): 자식 클래스의 객체를 부모 클래스 타입의 변수에 할당하는 것.
  • 장점: 코드를 더 유연하고 확장성 있게 만듭니다. 객체를 부품처럼 쉽게 교체할 수 있습니다.

    Animal animal1 = new Dog(); // 업캐스팅
    Animal animal2 = new Cat(); // 업캐스팅
    
    animal1.makeSound(); // Dog의 makeSound() 호출: "멍멍"
    animal2.makeSound(); // Cat의 makeSound() 호출: "야옹"
    // 동일한 animal.makeSound() 코드가, 실제 객체가 무엇이냐에 따라 다르게 동작함

➕ 3-4. 추상화 (Abstraction)

  • 개념: 객체들의 공통적인 속성과 기능을 추출하여 추상적인 개념으로 정의하는 것입니다. 불필요한 세부 사항은 숨기고, 핵심적인 부분만 드러내는 과정입니다.
  • 구현: 추상 클래스(Abstract Class)인터페이스(Interface)를 통해 구현됩니다.
    • 추상 클래스: 하나 이상의 추상 메서드(구현부가 없는 메서드)를 포함하는 클래스. abstract 키워드 사용.
    • 인터페이스: 모든 메서드가 추상 메서드이고, 모든 변수가 상수인, "순수한 설계도". interface 키워드 사용.
  • 목적: 객체를 사용하는 쪽에서는 내부의 복잡한 구현을 알 필요 없이, 외부에 공개된 인터페이스(메서드)만으로 객체를 사용할 수 있게 합니다.

📌 요약

  • 객체 지향 프로그래밍(OOP)은 현실 세계를 객체로 모델링하여 프로그램을 설계하는 방식입니다.
  • 클래스는 객체를 만들기 위한 설계도, 객체는 그 설계도로 만들어진 실체입니다.
  • 캡슐화는 데이터와 기능을 묶고, 외부로부터 데이터를 보호하는 정보 은닉 기술입니다.
  • 상속은 기존 코드를 재사용하고 클래스 간의 계층 구조를 만드는 기술입니다.
  • 다형성은 하나의 타입으로 여러 객체 형태를 다루어 코드의 유연성을 높이는 기술입니다.
  • 추상화는 공통점을 추출하여 핵심 기능만 정의하고, 불필요한 세부 사항을 숨기는 기술입니다.

0개의 댓글