객체 지향 프로그래밍의 장점 (실세계를 보고 경험을 바탕으로!)
프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다는 장점이 있습니다. 마치 컴퓨터 부품을 갈아 끼울 때, 해당하는 부품만 쉽게 교체하는 것처럼요. 또한 코드의 재 사용을 통해 반복적인 코드를 최소화합니다.
객체(Object)
모든 실재하는 대상을 의미합니다.
객체는 속성과 기능으로 나누며 각각은 변수(variable)와 메서드(Method)로 정의하고 있습니다.
[ 메서드 오버라이딩과 메서드 오버로딩 ]
1. 메서드 오버라이딩 (Method Overriding)
- 상속받는 클래스 메서드의 내용을 재정의
2. 메서드 오버로딩 (Method Overroading)
- 같은 이름의 메서드를 중복하여 정의하는 것
메서드 오버로딩의 예시 - 생성자
public class User {
private String id;
private String name;
public User(){
}
public User(String name){
this.name = name;
}
public User(String id, String name){
this.id = id;
this.name = name;
}
}
객체 지향 프로그래밍 4가지 특징
추상화, 상속, 다형성, 캡슐화
특징 | 간단한 설명 | 관련 |
추상화 | 공통적인 속성과 기능을 추출 | interface |
상속 | 클래스 재활용하여 하위 클래스 작성 | extend |
다형성 | 상황에 따라서 여러가지 형태 | interface |
캡슐화 | 클래스 내부의 정보 은닉과 보호 |
1. 추상화
“객체의 공통적인 속성과 기능을 추출하여 정의하는 것”
세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 모아놓은 것
인터페이스 (Interface)와 구현 (Implement)
인터페이스는 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정합니다.
실제 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 합니다.
Vehicle 탈 것의 인터페이스
public interface Vehicle {
public abstract void start();
void moveForward(); // public abstract 키워드 생략 가능
void moveBackward();
}
Vehicle인터페이스를 구현한 Car 클래스
public class Car implements Vehicle {
@Override
public void moveForward() {
System.out.println("🚖가 앞으로 전진합니다⏩");
}
@Override
public void moveBackword(){
System.out.println("🚖가 뒤로 후진합니다");
}
}
2. 상속 (Inheritance)
“기존의 클래스를 재활용하여 새로운 클래스를 작성하는 문법 요소”
클래스 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의
Vehicle 상위 클래스
public class Vehicle {
String model;
String color;
int wheels;
void moveForward() {
System.out.println("전진합니다");
}
void moveBackward() {
System.out.println("후진합니다");
}
}
Car 하위 클래스
public class Car extends Vehicle {
boolean isConvertible; // Car 클래스에만 존재하는 옵션
void openWindow(){
System.out.println("모든 창문을 엽니다");
}
}
MotorBike 하위 클래스
public class MotorBike extends Vehicle {
boolean isRaceable;
// 메소드 오버라이딩 -> 기능 재정의
@Override
void moveForward(){
SYstem.out.println("부릉 부릉 부르르르릉");
}
}
3. 다형성 (多形性)
“어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질”
이동수단은 자동차가 될 수도, 오토바이가 될 수도 있습니다.
Vehicle 인터페이스
public interface Vehicle {
void moveForward(); // public abstract 키워드 생략 가능
void moveBackward();
}
Car 클래스
public class Car implements Vehicle {
@Override
public void moveForward() {
System.out.println("🚖가 앞으로 전진합니다⏩");
}
@Override
public void moveBackward(){
System.out.println("🚖가 뒤로 후진합니다");
}
}
MotorBike 클래스
public class MotorBike implements Vehicle {
boolean isRaceable;
// 메소드 오버라이딩 -> 기능 재정의
@Override
void moveForward(){
SYstem.out.println("부릉 부릉 부르르르릉");
}
@Override
public void moveBackward(){
System.out.println("오토바이가 뒤로 후진합니다");
}
}
메서드 오버라이딩을 사용하면 modeForward()와 moveBackward()를 각각의 구현체에 맞게 재정의하여 사용할 수 있습니다.
즉, 같은 이름의 메서드가 상황에 따라 다른 역할을 수행한다는 것입니다.
주의점, Vehicle Interface에 정의되어 있는 메서드는 하위 구현체에서 필수로 구현해야 하기 때문에 Interface에는 공통적인 부분만 담아야 합니다.
4. 캡슐화 (Encapsulation)
"클래스"라는 캡슐로 안에 서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 외부로부터 보호
데이터 보호(data protection)
- 외부로부터 클래스에 정의된 속성과 기능들을 보호합니다.
데이터 은닉(data hiding)
- 내부의 동작을 감추고 외부에는 필요한 부분만을 노출합니다.
접근 제한자
- public
- default
- protected
- private
Abstract와 Interface의 기능 및 차이
인터페이스와 추상 클래스는 존재 목적이 다릅니다. 추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장하는 데 있습니다. 반면에 인터페이스는 메서드의 껍데기만 있는데, 그 메서드의 구현을 강제하기 위해서입니다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장합니다.
1. abstract (추상 클래스)
추상클래스는 0~n개의 추상메서드를 가지고 있습니다.
abstract class는 객체 지향의 특징 중 하나인 상속과 관련이 있습니다.
[ 추상메서드 ]
메서드의 바디가 아직 구현되어 있지 않은 abstract로 정의된 메서드를 말합니다.
아래 예시 코드와 같이 클래스 내부에 단 한 개라도 추상 메서드가 있으면 클래스 앞에는 반드시 abstract 클래스로 선언해야 합니다.
public class Car{
public abstract void drive(); // 컴파일 에러
public void start(){
System.out.println("시동을 켭니다.");
}
}
abstract 선언한 클래스
public abstract class Car{
public abstract void drive(); // 컴파일 에러
public void start(){
System.out.println("시동을 켭니다.");
}
}
2. interface (인터페이스)
interface (인터페이스)는 객체 지향의 특징인 추상화와 관련이 있습니다. 추상화의 특징을 다시 볼까요??
추상화란?? 객체의 공통적인 속성과 기능을 추출하여 정의하는 것입니다.
Vehicle Interface에 정의되어 있는 메서드는 하위 구현체에서 필수로 구현해야 하기 때문에 Interface에는 공통적인 부분만 담아야 합니다.