객체지향 프로그래밍이란?
객체지향 프로그래밍 (OOP, Object-Oriented Programming)은 소프트웨어 설계 패러다임으로, 프로그램을 객체의 집합으로 구조화하는 방법론이다.
객체 (Object)
- 객체는 실세계의 개체를 소프트웨어적으로 모델링한 것이다.
- 객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수와 작업을 수행 할 메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.
객체 지향 프로그래밍 언어
객체 지향 프로그래밍을 지원하는 언어로는 C++, C#, Java, Python, JavaScript, Ruby, Swift 등이 있다.
객체 지향 프로그래밍 특징
추상화
- 객체에서 공통된 속성과 행위를 추출하는 것
- 공통의 속성과 행위를 찾아서 탑을 정의하는 과정
- 추상화는 불필요한 정보는 숨기고 중요한 정보만 표현하여 프로그램을 간단하게 만드는 것
캡슐화
- 캡슐화는 데이터와 메서드를 하나의 단위로 묶고, 외부로부터 내부의 구현을 숨기는 것입니다.
- 객체의 내부 상태를 외부에서 직접 접근하지 못하도록 하고, 접근 메서드를 통해서만 조작하도록 합니다.
캡슐화의 장점
- 데이터 보호 : 외부에서 객체의 내부 상태를 직접 변경할 수 없으므로 데이터의 무결성이 유지된다.
- 코드의 응집도 향상 : 데이터와 메서드가 하나의 단위로 묶여 있어 유지보수가 용이하다.
상속
- 상속은 기존 클래스를 기반으로 새로운 클래스를 만드는 것이다. 새로운 클래스는 기존 클래스의 속성과 메서드를 상속받는다.
- 상속을 통해 코드의 재사용성을 높이고, 클래스 간의 관계를 명확히 할 수 있습니다.
상속의 장점
- 코드 재사용 : 기존 클래스의 기능을 재사용할 수 있다.
- 계층적 관계 : 클래스 간의 계층적 관계를 통해 코드 구조를 명확히 할 수 있습니다.
다형성
- 다형성은 하나의 인터페이스나 클래스가 여러 형태를 가질 수 있는 능력이다. 같은 메서드 이름이 다양한 객체에서 다르게 동작할 수 있다.
- 다형성은 오버라이딩 (Overriding)과 오버로딩 (Overloading)을 통해 구현된다.
오버라이딩 (Overriding)
- 부모 클래스의 메서드를 자식 클래스가 재정의 하는것이다.
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound();
myCat.makeSound();
}
}
실행결과

오버로딩 (Overloading)
- 같은 이름의 메서드를 여러 개 정의하지만, 매개변수의 타입이나 개수가 다른 경우이다.
public class MathUtils {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
OOP의 장점
- 모듈화 : 각 객체가 독립적이므로 코드의 모듈화가 용이합니다.
- 재사용성 : 상속과 다형성을 통해 코드의 재사용성이 높아집니다.
- 유지보수성 : 객체 단위로 코드를 관리하므로 유지보수가 용이합니다.
- 유연성 : 다형성과 추상화를 통해 코드를 유연하게 작성할 수 있습니다.
OOP의 단점
- 복잡성 : 객체지향 설계는 초기 학습과 이해가 어려울 수 있습니다.
- 과도한 설계 : 작은 프로그램에서는 OOP의 장점이 드러나지 않을 수 있습니다.
- 성능 : 객체 생성과 메서드 호출에 대한 오버헤드가 발생할 수 있습니다.