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

p_samename·2023년 12월 29일

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

객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

초기 프로그래밍은 절차적 프로그래밍이었다. 명시된 입력을 받아서 명시된 순서로 처리한 다음, 그 결과는 내는 방식이었다. 프로그램을 어떤 논리로 어떤 순서대로 써 내려가는것이 주요한 쟁점이었다. 그러나 간단한 알고리즘이면 몰라도, 조금만 복잡해지면 순서도로 나타내지는게 불가능한 스파게티코드를 양산하게 된다. 시간이 흐를수록 복잡한 프로그램이 요구되었는데, 기존 절차적 프로그래밍으로는 도저히 작성할 수가 없었던것.

이를 극복하기 위한 대안으로 나온것이 객체지향 프로그래밍이다. 큰 문제를 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것이다. 객체를 독립성과 신뢰성이 보장되게 만들어 놓으면 재사용성도 높아지므로 개발기간과 비용 또한 줄어들게 되었다.

객체란?

객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수와 작업을 수행 할 메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.

객체지향 프로그래밍을 레고에 빗대 표현 할 수 있는데, 객체가 레고의 조각이 될 것이고 레고의 조각을 조립해서 무언가를 만드는 방식이 객체지향 프로그래밍이라고 할 수 있다.

객체는 또한 레고 조각과도 비슷하게 여러군데에서 재사용 할 수 있는데 이는 부품화 와 재사용성 이라는 객체 지향 프로그래밍의 특징을 보여주기도 한다.

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

객체 지향 프로그래밍은 크게 추상화 , 캡슐화 , 상속 , 다형성 의 네가지 특징을 가진다.

1. 추상화

객체에서 공통된 속성과 행위를 추출 하는 것
공통의 속성과 행위를 찾아서 타입을 정의하는 과정
추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것

class Animal {
    constructor(name) {
        this.name = name;
    }
}

class Dog extends Animal {
    speak() {
        return `${this.name} : 멍멍 !`;
    }
}

class Cat extends Animal {
    speak() {
        return `${this.name} : 야옹 !`;
    }
}


const dog = new Dog('강아지')
const cat = new Cat('고양이')

dog.speak() // '강아지 : 멍멍 !'
cat.speak() // '고양이 : 야옹 !'

추상화가 왜 필요할까?

'현대'와 같은 다른 자동차 브랜드가 추가될 수도 있다. 이때 추상화로 '자동차'를 구현 해놓으면 다른 곳의 코드를 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다.

2. 캡슐화

데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함)
낮은 결합도를 유지할 수 있도록 설계하는 것.

class Car {
    // 생성자
    constructor(make, model) {
        this.make = make;   // 제조사
        this.model = model; // 모델
        this.speed = 0;      // 초기 속도는 0
    }

    // Getter 메서드: 속도를 가져오는 메서드
    getSpeed() {
        return this.speed;
    }

    // Setter 메서드: 속도를 설정하는 메서드
    setSpeed(newSpeed) {
        if (newSpeed >= 0 && newSpeed <= 200) {
            this.speed = newSpeed;
            console.log(`${this.make} ${this.model}의 속도가 ${this.speed}km/h로 설정되었습니다.`);
        } else {
            console.log("유효한 속도 범위는 0에서 200까지입니다.");
        }
    }

    // 가속 메서드
    accelerate() {
        this.setSpeed(this.speed + 10);
    }

    // 감속 메서드
    decelerate() {
        this.setSpeed(this.speed - 10);
    }
}

const myCar = new Car("Hyundai", "Sonata");

console.log(myCar.getSpeed()); // 0
myCar.accelerate();
console.log(myCar.getSpeed()); // 10
myCar.decelerate();
console.log(myCar.getSpeed()); // 0
myCar.setSpeed(150); // Hyundai Sonata의 속도가 150km/h로 설정되었습니다.
console.log(myCar.getSpeed()); // 150
myCar.setSpeed(250); // 유효한 속도 범위는 0에서 200까지입니다.

3. 상속

클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말한다.
새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능.

상속의 장점과 단점

장점 단점
재사용으로 인하여 코드가 감소 상위 클래스의 변경이 어려워짐
범용적인 사용이 가능 불필요한 클래스가 증가할 수 있음
자료와 메서드의 자유로운 사용 및 추가가 가능 상속이 잘못 사용될 수 있음

// 부모 클래스
class Parent {
    constructor(name) {
        this.name = name;
    }

    sayHello() {
        return console.log(`안녕하세요, ${this.name}입니다.`);
    }
}

// 자식 클래스
class Child extends Parent {
    constructor(name, age) {
        super(name); // 부모 클래스의 생성자 호출
        this.age = age;
    }

    sayAge() {
        return console.log(`${this.name}의 나이는 ${this.age}세입니다.`);
    }
}

// 사용 예시
const childObject = new Child("John", 10);

childObject.sayHello(); // 부모 클래스의 메서드 호출: 안녕하세요, John입니다.
childObject.sayAge();    // 자식 클래스의 메서드 호출: John의 나이는 10세입니다.

4. 다형성

  • 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석 될 수 있는 것.
  • 어떠한 요소에 여러 개념을 넣어 놓는 것.

객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성이라는 특징을 갖게 된다.

오버라이딩

  • 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것

오버로딩

  • 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것

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

장점 단점
클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고 대규모 소프트웨어 개발에 적합 처리속도가 상대적으로 느림
클래스 단위로 수정이 가능하기 때문에 유지 보수가 편리 객체의 수가 많아짐에 따라 용량이 커질 수 있음
클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이 설계시 많은 시간과 노력이 필요하게 수 있음

객체 지향 프로그래밍의 반대는 절차 지향 프로그래밍이다?

객체 지향 프로그래밍은 절차 지향 프로그래밍과 장단점이 겹치는 부분이 있기 때문에 그렇게 생각이 들 수 있다. 하지만 절차지향은 순차적으로 실행에 초점이 되어있고 객체지향은 관계/조직에 초점을 맞추고 있다는 초점의 차이일 뿐이다.
절차적 프로그래밍이라고 해서 객체를 다루지 않는 것이 아니고, 객체지향 프로그래밍이라고해서 절차가 없는 것도 아니다.

profile
@p_samename

0개의 댓글