객체지향
OOP라고 부르기도 하는 객체지향 프로그래밍(Object-Oriented Programming)은 현실 세계를 모방해서 프로그램을 구현하는 방식입니다. 현실의 사물처럼 데이터와 기능을 하나로 묶어서 표현하는 방식 입니다. 예를 들어 현실에 '자동차'라는 객체가 있다면 그 객체의 속성으로 '색상', '브랜드', '속' 등과 같은 속성이 있을 것입니다. 또한 '달리기', '멈추기', '경적 울리기' 같은 기능이 있을 것입니다. OOP 에서는 이런 식으로 하나의 객체에 속성과 기능을 묶어서 코드를 구성하게 됩니다.

객체지향 언어
• Java: 100% 객체지향을 사용하는 언어입니다.

• C++: C언어를 기반으로 하고 객체지향을 추가하여 클래스와 포인터를 사용하는 언어 입니다.

• Python: 매우 유연한 객체지향으로, 클래스 없이도 프로그래밍이 가능한 언어 입니다.

• C#: Java와 비슷한 구조이고, NET 기반에서 강력한 객체지향을 지원합니다.

• Swift: 클래스뿐만 아니라 구조체도 객체처럼 사용이 가능한 안전성과 캡슐화를 강조하는 언어 입니다.

• Ruby: 철저한 객체지향을 사용하는 언어로, 간결하고 직관적인 문법을 사용한다는 특징이 있습니다.

• Kotlin: Java보다 간결한 문법을 사용하며, 강력한 객체지향을 지원합니다.

• JavaScript: 전통적인 클래스 기반이 아닌 프로토타입을 기반으로 하는 객체지향 입니다.

OOP의 핵심 개념
1. 클래스 (Class)
클래스는 객체를 만들기 위한 설계도라고 볼 수 있습니다.
클래스는 속성(변수)과 기능(메서드)을 정의하여 객체가 어떤 상태와 행동을 가질지 결정하게 됩니다.
예를 들어 자동차라는 클래스를 만들면, 속성은 색상, 속도 등이 있고, 기능은 달리기, 멈추기가 될 수 있다.
클래스 자체는 실행되지 않지만, 클래스를 기반으로 객체를 생성함으로써 동작할 수 있습니다.
public class Car {
String color;
int speed;
void drive() {
System.out.println("자동차가 달립니다.");
}
}
위 코드는 클래스를 사용한 Java 예문 코드 입니다. Car가 자동차 객체를 만들기 위한 클래스 이고 속성과 기능의 정의되어 있는 걸 볼 수 있습니다.
2. 객체 (Object)
객체는 클래스를 바탕으로 만들어진 실제 실체입니다. 메모리에서 생성되어 동작한다는 특징이 있습니다.
예를 들어, 자동차 클래스에서 만들어진 "빨간색 람보르기니"는 하나의 객체입니다.
객체는 클래스에 정의된 속성과 메서드를 가지고 있으면서도 자신만의 고유한 상태를 유지할 수 있게 됩니다.
같은 클래스에서 만들어졌더라도 서로 다른 데이터를 가질 수 있기 때문에 객체는 독립적으로 존재하게 됩니다.
public class Main {
public static void main(String[] args) {
Car myCar = new Car(); // 객체 생성
myCar.color = "빨강";
myCar.drive(); // "자동차가 달립니다." 출력
}
}
위 코드는 객체를 설명하기 위한 Java 예문 코드 입니다. myCar는 Car 클래스에서 만들어진 실제 자동차 객체 입니다.
3. 추상화 (Abstraction)
추상화는 복잡한 시스템의 내부 동작을 숨기고 꼭 필요한 정보만 사용자에게 제공하는 개념입니다.
예를 들어, 자동차 운전자는 엑셀과 브레이크만 알면 되지 엔진 내부 구조까지는 알지 않아도 자동차를 사용할 수 있습니다.
또한 프로그래밍에서는 인터페이스나 추상 클래스를 사용하여 추상화를 구현할 수 있습니다.
이를 통해 사용자는 복잡한 내부 구현을 몰라도 기능을 쉽게 사용할 수 있다는 특징이 있고, 소프트웨어를 단순하고 이해하기 쉽게 만들어 유지보수와 개발 속도를 높여줄 수 있다는 장점이 있습니다.
abstract class Animal {
abstract void makeSound(); // 구체적 구현은 없음
}
class Dog extends Animal {
void makeSound() {
System.out.println("멍멍!");
}
}
위 코드는 추상화의 개념을 설명하기 위한 Java 코드인데, Animal은 동물이라는 공통 개념만 추상적으로 정의하고 실제 동작은 Dog 클래스에서 구현되게 됩니다.
4. 캡슐화 (Encapsulation)
캡슐화는 데이터와 그 데이터를 처리하는 메서드를 하나로 묶고, 외부에서 직접 접근하지 못하게 막는 방식입니다.
예를 들어서 계좌 객체는 잔액 정보를 외부에서 바로 변경하지 못하고 입금, 출금 메서드를 통해서만 조작되게 됩니다.
이를 위해 변수는 보통 private로 선언하고, 접근자인 getter나 setter 메서드를 통해 조작하게 만듭니다.
캡슐화를 사용하면 프로그램의 보안성이 높아지고 데이터 오류나 불일치가 줄어든다는 장점이 있습니다.
또한 내부 구현이 변경되어도 외부에는 영향을 주지 않아 유지보수에 유리한 방식 입니다.
public class BankAccount {
private int balance = 0;
public void deposit(int amount) {
if (amount > 0) balance += amount;
}
public int getBalance() {
return balance;
}
}
위 코드는 캡슐화의 개념이 들어있는 Java 예문 코드입니다. balance는 private로 선언 되어있기 떄문에 외부에서 접근을 못하고 메서드로만 조작 할 수 있습니다.
5. 상속 (Inheritance), 다형성 (Polymorphism)
상속은 기존 클래스를 물려받아 새로운 클래스를 만드는 기능으로 코드의 재사용성을 높입니다.
예를 들어 '동물' 클래스를 상속한 '개'나 '고양이' 클래스는 공통 기능을 공유하면서 고유 기능도 추가할 수 있습니다.
다형성은 같은 이름의 메서드가 상황에 따라 다르게 작동하는 능력을 말합니다.
예를 들어 sound()라는 메서드를 각 동물이 다르게 구현하면, 같은 메서드를 호출해도 각각 다른 소리를 낼 수 있다.
이러한 다양성 덕분에 코드의 유연성이 증가하고, 확장성과 유지보수성이 뛰어난 프로그램을 만들 수 있게 됩니다.
class Animal {
void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Cat extends Animal {
void makeSound() {
System.out.println("야옹!");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Cat(); // 부모 타입으로 자식 객체 사용 (다형성)
a.makeSound(); // "야옹!" 출력
}
}
위의 코드는 상속과 다양성의 개념이 들어있는 Java 에문 코드 입니다. Cat 클래스는 Animal 클래스를 상속받은 것을 볼 수 있습니다. 또한 makeSound()를 다르게 재정의 한 것입니다. 부모타입으로 자식 객체를 다루는 것이 다형성 입니다.
각 개념을 한 문장으로 설명하자면
클래스: 객체의 설계도 (자동차의 설계도)
객체: 클래스의 객체 (실제 자동차 한 대)
추상화: 중요한 것만 보여줌 (운전자가 알아야 하는 조작법)
캡슐화: 데이터를 숨기고 메서드로만 조작함 (자동차 내부 기능은 내부에 있는 버튼으로만 조작 가능)
상속: 기존의 것을 재활용해서 확장시킴 (자동차 -> 전기차)
다형성: 같은 메서드 이름으로 다른 동작을 만듬 (start() 메서드는 비행기오아 자동차에서 각각 다르게 작동함)
그럼 왜 객체지향을 사용할까?
1. 코드를 재사용 하기 좋다.
2. 프로그램을 현실적으로 설계할 수 있다.
3. 유지보수와 확장에 유리하다.
이상으로 블로그를 마치겠습니다. 읽어주셔서 감사합니다.
'BackEnd' 카테고리의 다른 글
| [BackEnd] 우리가 Spring으로 백엔드를 시작하는 이유 (0) | 2025.10.01 |
|---|---|
| [BackEnd]클린 아키텍쳐가 뭐임? (1) | 2025.09.17 |
| [BackEnd] 객체지향 설계의 SOLID 원칙 (2) | 2025.07.22 |
| [BackEnd] REST API (0) | 2025.07.02 |
| [BackEnd] 데이터베이스와 CRUD (0) | 2025.06.16 |