객체 지향 프로그래밍의 상속, 캡슐화, 다형성, 추상화,, 들어도 들어도 헷갈려서 정리했습니다
상속
상속은 OOP의 중요한 특징 중 하나로, 기존 클래스의 특성을 그대로 이어받아 새로운 클래스를 생성하는 메커니즘입니다
상속을 통해 코드의 재사용성을 높일 수 있고, 코드 중복을 최소화할 수 있습니다
부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용할 수 있으며, 자식 클래스에서는 필요에 따라 새로운 기능을 추가하거나 부모 클래스의 기능을 재정의할 수 있습니다
class Animal {
void speak() {
System.out.println("Animal speaks");
}
}
class Dog extends Animal {
void speak() {
System.out.println("Dog barks");
}
}
// 사용 예시
Dog myDog = new Dog();
myDog.speak(); // 출력: Dog barks
캡슐화
캡슐화는 객체의 상태와 행위를 하나로 묶고, 외부에서의 접근을 제어하는 것을 의미합니다
이는 정보 은닉을 통해 객체의 내부 구현을 외부로부터 숨기고, 오직 정의된 인터페이스를 통해서만 객체와 상호작용할 수 있도록 하는 것입니다
캡슐화는 코드의 모듈성을 높이고, 객체 간의 결합도를 낮춰 시스템을 유연하게 만듭니다
class Car {
private int speed; // 속성을 비공개로 설정
int getSpeed() {
return speed;
}
void setSpeed(int newSpeed) {
if (newSpeed > 0) {
speed = newSpeed;
}
}
}
// 사용 예시
Car myCar = new Car(60);
System.out.println(myCar.getSpeed()); // 출력: 60
myCar.setSpeed(80);
System.out.println(myCar.getSpeed()); // 출력: 80
다형성
다형성은 같은 인터페이스를 공유하면서 다양한 구현을 가질 수 있는 능력을 의미합니다
다형성은 코드의 유연성을 향상시키면, 동일한 메서드 호출에 대해 다른 동작을 수행할 수 있도록 합니다
이는 메서드 오버로딩과 메서드 오버라이딩을 통해 구현됩니다
abstract class Shape {
abstract double area();
}
class Circle extends Shape {
private double radius;
Circle(double radius) {
this.radius = radius;
}
double area() {
return 3.14 * radius * radius;
}
}
class Rectangle extends Shape {
private double length;
private double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
double area() {
return length * width;
}
}
// 사용 예시
Circle circle = new Circle(5);
Rectangle rectangle = new Rectangle(4, 6);
System.out.println(circle.area()); // 출력: 78.5
System.out.println(rectangle.area()); // 출력: 24
추상화
추상화는 복잡한 시스템에서 중요한 부분을 간추려 표현하는 과정입니다
이는 사용자에게 필요한 정보만을 제공하고 나머지는 숨겨짐으로써 시스템을 더 이해하기 쉽게 만듭니다
추상화는 클래스와 인터페이스를 통해 구현되며, 불필요한 세부사항을 숨기고 핵심 기능에만 집중할 수 있도록 도와줍니다
abstract class Shape {
abstract double area();
}
class Circle extends Shape {
private double radius;
Circle(double radius) {
this.radius = radius;
}
double area() {
return 3.14 * radius * radius;
}
}
class Rectangle extends Shape {
private double length;
private double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
double area() {
return length * width;
}
}
// 사용 예시
Circle circle = new Circle(5);
Rectangle rectangle = new Rectangle(4, 6);
System.out.println(circle.area()); // 출력: 78.5
System.out.println(rectangle.area()); // 출력: 24