IMG-LOGO
공지사항 :

자바 객체 지향 프로그래밍(Object-Oriented Programming, OOP)

lmkfox - 2025-07-09 06:39:55 14 Views 0 Comment

1. 객체(Object)와 클래스(Class)

클래스(Class)

  • 객체를 만들기 위한 설계도

  • 속성(필드)과 동작(메소드)을 정의

객체(Object)

  • 클래스에 정의된 내용을 바탕으로 만들어진 실제 인스턴스

  • 메모리에 생성되어 동작

public class Car {
    String color;
    void drive() {
        System.out.println("차가 달립니다");
    }
}

// 객체 생성
Car myCar = new Car();
myCar.color = "빨강";
myCar.drive();


2. 객체 지향의 4대 특성

1) 캡슐화 (Encapsulation)

  • 객체의 상태(필드)는 외부에서 직접 접근하지 못하도록 숨기고, 메소드를 통해 접근하게 함

  • 정보 은닉과 유지보수성을 높임

public class BankAccount {
    private int balance;

    public void deposit(int amount) {
        if (amount > 0) balance += amount;
    }

    public int getBalance() {
        return balance;
    }
}

2) 상속 (Inheritance)

  • 기존 클래스의 속성과 기능을 확장하여 새로운 클래스를 만드는 것

  • 코드 재사용성과 계층 구조를 용이하게 함

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

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

3) 다형성 (Polymorphism)

  • 같은 타입의 참조 변수가 여러 형태의 객체를 가리킬 수 있음

  • 메소드 오버라이딩과 업캐스팅을 통해 구현

public class Animal {
    void sound() {
        System.out.println("소리 낸다");
    }
}

public class Cat extends Animal {
    void sound() {
        System.out.println("야옹");
    }
}

Animal a = new Cat();
a.sound(); // "야옹"

4) 추상화 (Abstraction)

  • 필요한 정보만 공개하고, 불필요한 세부사항은 감춤

  • 인터페이스 또는 추상 클래스를 통해 구현

abstract class Shape {
    abstract void draw();
}

class Circle extends Shape {
    void draw() {
        System.out.println("원을 그립니다");
    }
}


3. 클래스의 구성 요소

구성 요소

설명

필드 (Field)

객체의 속성 (멤버 변수)

메소드 (Method)

객체의 동작을 정의

생성자 (Constructor)

객체가 생성될 때 초기화하는 특별한 메소드

접근제어자

public, private, protected, default


4. 생성자(Constructor)

  • 클래스 이름과 동일

  • 객체가 생성될 때 자동 호출

  • 반환 타입 없음

public class Person {
    String name;

    // 생성자
    public Person(String name) {
        this.name = name;
    }
}


5. this 키워드

  • 자기 자신을 참조하는 키워드

  • 지역변수와 필드 이름이 같을 때 주로 사용

public class Person {
    String name;

    public Person(String name) {
        this.name = name; // this.name은 필드, name은 매개변수
    }
}


6. 객체 간의 관계

  • 집합 관계(has-a): 클래스 안에 다른 객체를 필드로 포함

  • 상속 관계(is-a): A가 B를 상속받는 경우 A는 B의 일종

// 집합 관계
class Engine {}

class Car {
    Engine engine = new Engine(); // Car has-a Engine
}


7. 인터페이스와 다형성

인터페이스는 메소드의 선언만 존재하고 구현은 하지 않음

interface Animal {
    void sound();
}

class Cat implements Animal {
    public void sound() {
        System.out.println("야옹");
    }
}

다형성을 활용하여 인터페이스 타입으로 다양한 구현 객체를 사용할 수 있음

Animal animal = new Cat();
animal.sound(); // 야옹


8. 객체 지향 설계의 장점

  • 재사용성: 상속과 모듈화를 통해 코드 중복을 줄임

  • 유지보수성: 모듈별 설계로 수정이 쉬움

  • 확장성: 새로운 기능을 쉽게 추가 가능

  • 현실 세계와의 유사성: 실제 객체와 유사한 구조로 설계 가능


9. 객체 지향 프로그래밍 요약

핵심 개념

설명

클래스

객체의 설계도

객체

클래스 기반 실체

캡슐화

데이터 은닉, getter/setter 사용

상속

코드 재사용, 계층적 구조

다형성

다양한 형태로 동작 가능

추상화

불필요한 정보 숨기고 필요한 기능만 노출


댓글