본문 바로가기
Computer Science/Object Oriented

[OOP] 객체 지향 프로그래밍이란?

by parkkingcar 2022. 12. 5.

 

 

이 글에서는 객체 지향 프로그래밍에 대한 내용을 다룹니다.

( 객체 지향 프로그래밍 = 프로그래밍 언어 + 객체지향 규칙(개념) )

 

 

객체 지향 설계 (SOLID원칙)에 관한 내용은 아래 글을 참고해주세요

 

먼저 아래 객체 지향 설계 을 본 후, 이 카테고리에 있는 글을보면 좋을 것 같습니다.

 

 

 

 

[Java] 객체 지향 설계란? (SOLID)

이번 시간은 객체지향의 4대특성인 캡슐화, 상속, 추상화, 다형성 을 이용하여 객체 지향을 올바르게 설계할 수 있도록 도와주는 원칙들을 알아 볼까 한다. 객체 지향을 공부해봤고, 객체 지향으

limkydev.tistory.com

 

객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목

ko.wikipedia.org


 

객체 지향 프로그래밍

 

 

객체 지향 프로그래밍은 영어로 Object oriented programming (이하 OOP)이라 하며,

 

객체는 실생활에서 쓰는 모든 것인데,

프로그래밍에서는 클래스라는 틀에서 생겨난 실체(instance)를 말합니다.

 

 

 

그래서 OOP는 프로그램 구현에 필요한 객체를 파악하고 

 

이 객체들이 무슨 역할을 하는지 정의하여  그 객체 간 상호작용을 통한 프로그램을 만드는 것 입니다.

 

따라서 객체 지향 프로그램은 객체와 객체 간의 연결로 되어 있으며, 각각의 객체 안에 자료구조와 알고리즘이 들어있는 것 입니다.

 

 

 

 

인스턴스

 

인스턴스는 클래스로부터 생성된 실체(객체)를 의미합니다. 클래스는 객체의 설계도이며, 인스턴스는 그 설계도를 바탕으로 실제로 메모리에 할당된 객체를 말합니다. 즉, 인스턴스는 클래스의 구체적인 실체입니다.

 

예를 들어, "사람" 클래스로부터 "철수", "영희", "민수" 등의 여러 개의 인스턴스를 생성할 수 있습니다. 각각의 인스턴스는 이름, 나이, 성별 등과 같은 속성을 가지며, 각각 다른 값을 갖게 됩니다.

 


객체 지향 프로그래밍의 특징

 

크게 4가지로 나뉘며, 캡슐화 (Encapsulation), 상속성 (Inheritance), 다형성 (Polymorphism), 추상화 (Abstraction)을 나타냅니다.

 

 

 

 

1. 추상화 (abstraction)

 

자료 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것입니다.

 

 

-  객체들의 공통적인 특징(기능, 속성)을 도출하는 것

- 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.

 

// 추상 클래스
abstract class Shape {
    // 추상 메서드
    public abstract void draw();

    // 구체적인 메서드
    public void display() {
        System.out.println("도형을 표시합니다.");
    }
}

// 추상 클래스를 구현한 구체 클래스
class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("원을 그립니다.");
    }
}

// 추상 클래스를 구현한 구체 클래스
class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("사각형을 그립니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        circle.draw();
        circle.display();

        Shape rectangle = new Rectangle();
        rectangle.draw();
        rectangle.display();
    }
}

 



 

 

2. 캡슐화 (encapsulation)

 

캡슐화는 실제 구현 내용 일부를 내부에 감추어 은닉하는 것 입니다.

 

 

-  객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것

- 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶음

 

class Person {
    private String name;
    private int age;

    // Getter 메서드
    public String getName() {
        return name;
    }

    // Setter 메서드
    public void setName(String name) {
        this.name = name;
    }

    // Getter 메서드
    public int getAge() {
        return age;
    }

    // Setter 메서드
    public void setAge(int age) {
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();

        // 데이터 설정
        person.setName("John");
        person.setAge(30);

        // 데이터 읽기
        String name = person.getName();
        int age = person.getAge();

        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

 

위의 코드에서,  Person 클래스는 name과 age라는 두 개의 멤버 변수를 가지고 있습니다. 

이 변수들은 private 접근 제어자를 사용하여 외부에서의 직접적인 접근을 제한합니다. 

Person 클래스에는 각각 getName(), setName(), getAge(), setAge()라는 네 개의 메서드가 정의되어 있습니다. 

이들 메서드는 각각 name과 age 멤버 변수에 대한 접근을 제공합니다.

 

 

 

 

 

3. 상속성 (inheritance)

 

상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능입니다.

 

 

- 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것

- 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것

- 기존 코드를  재사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.

 

// 부모 클래스
class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating.");
    }
}

// 자식 클래스
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void meow() {
        System.out.println(name + " is meowing.");
    }
}

// 자식 클래스
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void bark() {
        System.out.println(name + " is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat("Kitty");
        cat.eat();
        cat.meow();

        Dog dog = new Dog("Buddy");
        dog.eat();
        dog.bark();
    }
}

 

 

 

 

 

4-1. 다형성 (polymorphism)

 

다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것입니다.

 

- 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것

- 일반적으로 오버라이딩이나 오버로딩을 의미합니다.

 

 

오버라이딩 : (같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)

부모 클래스의 메서드를 자식 클래스에서 필요에 맞게 수정하거나 추가 기능을 구현할 수 있습니다.

 

오버로딩 : (같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)

오버로딩(Overloading)은 같은 이름의 메서드를 여러 개 정의하되 매개변수의 개수나 타입을 다르게 함으로써 다양한 상황에 대응하는 것을 말합니다.

 

 

 

오버라이딩

// 부모 클래스
class Animal {
    public void makeSound() {
        System.out.println("동물이 소리를 낸다.");
    }
}

// 자식 클래스
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("강아지가 짖는다. 멍멍!");
    }
}

// 자식 클래스
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("고양이가 운다. 야옹~");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        animal1.makeSound();  // 강아지가 짖는다. 멍멍!
        animal2.makeSound();  // 고양이가 운다. 야옹~
    }
}

 

 

오버로딩

class Calculator {
    public int add(int num1, int num2) {
        return num1 + num2;
    }

    public double add(double num1, double num2) {
        return num1 + num2;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        int sum1 = calculator.add(2,

 

 

 

 

 

 

4-2. 동적바인딩 (Dynamic Binding)

 

동적 바인딩은 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현합니다.

 

- 가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것

- 함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버라이딩 된 함수가 실행

 - 프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장(다형 개념 실현)

 

 

동적 바인딩은 다형성을 효과적으로 구현할 수 있게 해주며, 실행 시간에 객체의 실제 타입을 파악하여 적절한 메서드를 호출하는 데 사용됩니다.

 

 

 

 


 

객체 지향 프로그래밍을 하는 이유

 

소프트웨어의 생산성 향상시키고, 실세계에 대한 쉬운 모델링을 가능하게 하며, 보안성을 향상시킵니다.

 

- 신뢰성 있는 소프트웨어를 손쉽게 작성할 수 있다

- 코드를 재사용하기 쉽다

- 업그레이드가 쉽다

- 실세계의 대한 것을 객체들의 상호작용으로 생각

 - 캡슐화, 데이터 은닉, 다형성으로 필요한 정보를 재정의하여 보안성을 가짐

 

 

 

 

객체 지향 프로그래밍의 단점

 

- 절차지향 프로그래밍에 비해 느린 실행 속도

- 필요한 메모리양의 증가

 

 


 

다음은 대표적인 객체 지향 프로그래밍 언어들입니다

 

'Computer Science > Object Oriented' 카테고리의 다른 글

SOLID 원칙  (0) 2023.05.17

댓글