본문 바로가기
[이직 면접] 질의 응답

[Java] 객체지향 프로그래밍이란 무엇인지 설명하세요.

by 막개발자 2020. 12. 27.

# 질의 응답 상황

[면접관]

지원자님 Java를 주로 사용하셨는데 객체지향 프로그래밍에 대해서 간략하게 설명해주세요.

 

[막개발자] 

객체지향 프로그래밍(OOP)은 애플리케이션을 구성하는 요소들을 객체로 바라보고, 그 객체들을 유기적으로 연결하여 프로그래밍하는 방식입니다. Java나 C#이 대표적인 객체지향 프로그래밍 언어입니다. 가장 큰 특징은 클래스를 이용해 메서드와 변수를 하나로 묶어서 객체를 생성하고 사용하는 점입니다.

장점

  1. 코드 재사용
    동료 개발자가 개발한 클래스를 사용하거나 상속받아 확장하여 재사용할 수 있습니다.
  2. 유지보수 용이
    객체지향 프로그래밍에서는 수정이 필요한 부분이 클래스 내부의 변수나 메서드에 한정되므로, 해당 부분만 수정하면 됩니다.
  3. 생산성 향상
    클래스로 모듈화하여 개발하므로 생산성이 향상되고, 대형 프로젝트에서 효과적입니다.
  4. 자연적인 모델링
    객체지향 프로그래밍은 실생활의 구조를 모델링하기 때문에 이해하고 구현하기가 자연스럽습니다.

단점

  1. 실행 속도
    객체지향 프로그래밍은 절차지향 프로그래밍보다 실행 속도가 느린 경우가 많습니다.
  2. 설계 시간
    설계 단계에서 많은 시간이 소요될 수 있습니다.
  3. 메모리 사용량 증가
    객체가 많아지면 메모리 용량이 커집니다.

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

  1. 추상화
    공통된 속성이나 행위를 추출하여 클래스를 정의하는 것입니다. 예를 들어, 사과, 배, 딸기 등의 공통된 특성을 '과일' 클래스로 추상화할 수 있습니다.
  2. 캡슐화
    관련된 변수와 메서드를 하나로 묶어 클래스라는 캡슐로 분류하고, 접근제어자를 사용하여 외부에서 접근할 수 없도록 정보은닉을 합니다.
  3. 상속
    부모 클래스의 변수와 메서드를 자식 클래스가 물려받아 사용할 수 있습니다. 또한, 다형성을 통해 필요한 부분을 재정의하여 사용할 수 있습니다. 다만, 다중 상속은 지원하지 않습니다.
  4. 다형성
    같은 이름의 메서드가 상황에 따라 다르게 동작할 수 있도록 하는 능력입니다. 오버로딩과 오버라이딩을 통해 구현됩니다. 오버로딩은 같은 이름의 메서드를 다양한 매개변수로 정의하는 것이고, 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것입니다.

 

 

# 상세 설명

 

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

OOP는 프로그램을 **객체(Object)**라는 단위로 나누어 설계하고 구현하는 프로그래밍 패러다임입니다. 객체는 **데이터(속성)**와 **동작(메서드)**을 포함하고 있으며, 현실 세계를 모델링하는 데 적합합니다. OOP는 재사용성, 유지보수성, 확장성을 높이고, 코드를 체계적으로 관리할 수 있도록 도와줍니다.

1. 객체지향 프로그래밍의 핵심 개념

  • 클래스(Class)
    클래스는 객체를 생성하기 위한 설계도입니다. 속성(필드)과 동작(메서드)을 정의하며, 객체의 틀을 제공합니다.
class Car {
    String brand;
    int speed;

    void drive() {
        System.out.println(brand + " is driving at " + speed + " km/h");
    }
}
  • 객체(Object)
    객체는 클래스의 인스턴스이며, 메모리에 할당된 데이터입니다.
Car myCar = new Car();
myCar.brand = "Tesla";
myCar.speed = 100;
myCar.drive();  // Tesla is driving at 100 km/h
  • 캡슐화(Encapsulation)
    데이터(필드)와 메서드를 하나의 단위(클래스)로 묶고, 외부에서 접근할 수 없도록 보호합니다.
class Account {
    private double balance;

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

    public double getBalance() {
        return balance;
    }
}
  • 상속(Inheritance)
    기존 클래스(부모 클래스)의 속성과 메서드를 물려받아 새로운 클래스를 정의합니다.
class Animal {
    void eat() {
        System.out.println("This animal eats food.");
    }
}

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

Dog dog = new Dog();
dog.eat();  // 부모 클래스의 메서드 호출
dog.bark();

 

  • 다형성(Polymorphism)
    같은 이름의 메서드가 다양한 동작을 수행하도록 하는 능력입니다. 오버로딩과 오버라이딩을 통해 구현됩니다.
  • 오버라이딩(Overriding):
class Animal {
    void sound() {
        System.out.println("Some sound...");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Meow");
    }
}
  • 오버로딩(Overloading):
class MathUtils {
    int add(int a, int b) {
        return a + b;
    }
    double add(double a, double b) {
        return a + b;
    }
}

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

  • 코드 재사용성
    상속을 통해 중복 코드를 줄이고, 코드의 재사용성을 높일 수 있습니다.
  • 유지보수성
    코드의 구조가 잘 분리되어 있어 수정이 용이합니다.
  • 확장성
    기존 코드를 수정하지 않고 새로운 기능을 추가할 수 있습니다.
  • 현실 세계 모델링
    현실 세계의 객체와 유사하게 모델링할 수 있어 이해하기 쉽고 직관적입니다.
  • 보안성
    캡슐화로 인해 데이터를 보호하고, 외부에서 데이터에 대한 무분별한 접근을 차단할 수 있습니다.

3. 객체지향 설계 원칙 (SOLID 원칙)

  • 단일 책임 원칙(SRP)
    각 클래스는 하나의 책임만 가져야 합니다.
  • 개방-폐쇄 원칙(OCP)
    클래스는 확장에는 열려 있어야 하지만, 수정에는 닫혀 있어야 합니다.
  • 리스코프 치환 원칙(LSP)
    서브클래스는 부모 클래스의 기능을 대체할 수 있어야 합니다.
  • 인터페이스 분리 원칙(ISP)
    클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 합니다.
  • 의존 역전 원칙(DIP)
    상위 모듈은 하위 모듈에 의존하지 않고, 둘 다 추상화에 의존해야 합니다.

4. 객체지향 프로그래밍의 한계

  • 복잡성 증가
    설계가 지나치게 복잡해질 수 있습니다.
  • 성능 문제
    다형성과 캡슐화로 인해 성능 저하가 발생할 수 있습니다.
  • 과잉 설계
    단순한 문제에 객체지향 방식을 적용할 때 불필요한 코드가 증가할 수 있습니다.

5. 객체지향 프로그래밍 예제

class Shape {
    void draw() {
        System.out.println("Drawing a shape");
    }
}

class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("Drawing a circle");
    }
}

class Rectangle extends Shape {
    @Override
    void draw() {
        System.out.println("Drawing a rectangle");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape shape1 = new Circle();
        Shape shape2 = new Rectangle();

        shape1.draw(); // Drawing a circle
        shape2.draw(); // Drawing a rectangle
    }
}

6. 객체지향 프로그래밍 언어

대표적인 객체지향 언어: Java, C++, Python, C#, Ruby

객체지향 프로그래밍은 현대 소프트웨어 개발에서 가장 널리 사용되는 프로그래밍 패러다임입니다.