객체지향 프로그래밍(OOP)이란?
객체지향 프로그래밍(OOP)은 소프트웨어 개발을 객체들의 상호작용으로 모델링하는 프로그래밍 패러다임입니다. 이는 현실 세계의 개념과 구조를 코드로 표현하여 문제를 해결하는 방식으로, 코드의 재사용성, 유지보수성, 그리고 확장성을 높여줍니다. 현재 많은 프로그래밍 언어들이 이를 지원하고 있습니다.
객체지향 프로그래밍의 핵심 개념
1. 클래스와 객체
클래스는 객체를 생성하기 위한 설계도이며, 객체는 해당 클래스의 인스턴스입니다. 클래스는 속성(멤버 변수)과 메서드(함수)로 구성되어 있으며, 객체는 이러한 속성과 메서드를 가지고 있습니다.
2. 메서드(Methods)
클래스 내부에 정의된 함수로, 객체의 동작을 나타냅니다. 메서드는 클래스의 인스턴스에 의해 호출됩니다.
class Car {
public string Model; // 차량 모델
public int Year; // 출시 연도
public void Start() {
// 차량 시작 로직
Console.WriteLine("Engine started for {0}", Model);
}
public void Stop() {
// 차량 정지 로직
Console.WriteLine("Engine stopped for {0}", Model);
}
}
Car myCar = new Car(); // Car 클래스의 객체 생성
myCar.Model = "Toyota"; // 객체의 속성 설정
myCar.Year = 2022;
myCar.Start(); // 객체의 메서드 호출
예시 코드에서는 Car 클래스를 정의하고, 이를 통해 myCar 객체를 생성하였습니다. 객체의 속성으로는 차량 모델(Model)과 출시 연도(Year)가 있으며, Start()와 Stop() 메서드를 통해 객체의 동작을 제어할 수 있습니다.
3. 인터페이스(Interfaces)
인터페이스는 주로 클래스가 가져야 할 동작을 정의하는 역할을 합니다. 즉, 어떤 객체가 특정 인터페이스를 구현한다는 것은 해당 객체가 인터페이스에 정의된 메서드들을 반드시 구현해야 함을 의미합니다. 인터페이스는 객체 간의 상호작용을 규정하고, 이를 통해 다형성을 지원하여 코드의 유연성을 높여줍니다.
// 전자기기 연결 인터페이스 정의
public interface IConnectable {
void Connect();
}
// 스마트폰 클래스
public class Smartphone : IConnectable {
public void Connect() {
Console.WriteLine("스마트폰을 USB로 연결합니다.");
}
}
// TV 클래스
public class TV : IConnectable {
public void Connect() {
Console.WriteLine("TV를 HDMI로 연결합니다.");
}
}
// 스피커 클래스
public class Speaker : IConnectable {
public void Connect() {
Console.WriteLine("스피커를 Bluetooth로 연결합니다.");
}
}
// 전자기기 연결 테스트
class Program {
static void Main(string[] args) {
IConnectable smartphone = new Smartphone();
IConnectable tv = new TV();
IConnectable speaker = new Speaker();
smartphone.Connect();
tv.Connect();
speaker.Connect();
}
}
위의 코드는 전자기기를 연결하는 기능을 구현한 예제입니다. 각 클래스는 IConnectable 인터페이스를 구현하고 있으며, Connect() 메서드를 재정의하여 각각의 전자기기가 연결되는 방식을 구현하고 있습니다.
Smartphone, TV, Speaker 각 클래스에서는 Connect() 메서드를 재정의하여 해당 전자기기를 연결하는 방식을 출력합니다. 이 코드를 실행하면 각 전자기기가 연결되는 방식에 따라 다른 메시지가 출력됩니다. 스마트폰은 USB로 연결되고, TV는 HDMI로 연결되며, 스피커는 Bluetooth로 연결됩니다. 이 코드는 인터페이스를 사용하여 다형성을 구현하고, 느슨한 결합을 유지하여 코드의 유연성을 높이는 좋은 예시입니다.
4. 추상클래스(Abstract class)
클래스 간의 공통된 동작을 추출하여 중복을 제거하고 코드를 재사용하고 싶을 때 사용합니다. 또한 클래스의 일부 메서드를 하위 클래스에서 강제로 구현하고 싶을 때 추상클래스를 사용합니다. 추상클래스는 추상 메서드를 포함할 수 있으며, 추상 메서드는 구현이 없는 메서드입니다. 물론 일반 메서드 또는 필드와 함께 추상 메서드를 가질 수 있습니다. 추상클래스는 객체를 직접 인스턴스화할 수 없으며, 추상 메서드는 하위 클래스에서 상속받아 구체적인 메서드를 구현해야 합니다.
using System;
// 추상 클래스 정의: 도형
public abstract class Shape {
// 추상 메서드: 도형의 면적 계산
public abstract double CalculateArea();
// 일반 메서드: 도형의 정보 출력
public void PrintInfo() {
Console.WriteLine($"도형의 면적: {CalculateArea()}");
}
}
// 사각형 클래스: 도형을 상속받음
public class Rectangle : Shape {
public double Width { get; set; }
public double Height { get; set; }
// 추상 메서드 구현: 사각형의 면적 계산
public override double CalculateArea() {
return Width * Height;
}
}
// 원 클래스: 도형을 상속받음
public class Circle : Shape {
public double Radius { get; set; }
// 추상 메서드 구현: 원의 면적 계산
public override double CalculateArea() {
return Math.PI * Radius * Radius;
}
}
// 메인 클래스
class Program {
static void Main(string[] args) {
Shape rectangle = new Rectangle { Width = 4, Height = 6 };
Shape circle = new Circle { Radius = 3 };
// 각 도형의 정보 출력
Console.WriteLine("사각형 정보:");
rectangle.PrintInfo();
Console.WriteLine("\n원 정보:");
circle.PrintInfo();
}
}
이 코드에서는 추상 클래스 Shape을 정의하고, 각 도형 클래스에서 이를 상속받아 도형의 면적을 계산하는 추상 메서드와 도형의 정보를 출력하는 일반 메서드를 구현합니다. 각 도형 클래스에서는 Shape 클래스를 상속받고, 추상 메서드인 CalculateArea()를 구현하여 각 도형의 면적을 계산합니다. 일반 메서드인 PrintInfo()를 사용하여 도형의 정보를 출력할 수 있습니다.
'이론 > 개발 지식' 카테고리의 다른 글
블록체인 기술: 분산 원장의 혁신적인 기술 (0) | 2024.04.02 |
---|---|
객체지향 프로그래밍 설계 5원칙 - SOLID (0) | 2024.03.21 |
객체지향 프로그래밍의 특징 - 캡슐화, 상속, 다형성, 추상화 (0) | 2024.03.21 |
인터페이스와 추상클래스의 차이점 (0) | 2024.03.21 |