객체 지향 프로그래밍은 현실 세계의 모든 사물들을 소프트웨어의 코드로 표현하기 위해 각 사물들을 객체(Object)로 보고, 해당 객체의 핵심적인 개념 및 기능만을 추출하는 추상화(Abstraction)를 통해 소프트웨어를 모델링하는 패러다임을 말한다.
객체 지향적 설계를 통해 소프트웨어를 설계 및 개발하면, 코드의 재사용을 통해 반복적인 코드를 최소화하고, 보다 유연하고 변경에 용이한 프로그램을 작성할 수 있다.
서로 연관이 있는 속성과 기능들을 하나의 캡슐로 만들어 외부로부터 데이터를 보호하는 것
1. 데이터 보호 - 외부로부터 클래스에 정의된 속성과 기능들을 보호
2. 데이터 은닉 - 내부의 동작은 감추고 외부에는 필요한 부분만 노출
클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화하여, 해당 상위 클래스로부터 상속받은 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용하도록 하기 위한 기능
- 객체 is a 클래스 - 김연아 is a 사람 -> 김연아는 한 명의 사람이다. - 하위 클래스 is a kind of 상위 클래스 - 펭귄 is a kind of 동물 -> 펭귄은 동물의 한 분류이다.
특정 사물이나 표상을 해당 표상의 성질, 공통성, 본질에 착안하여 소프트웨어의 모델로 추출
# 전자제품
public class Electronics {
// 전원기능
power() {}
}
# 통신기기 (전자제품을 상속)
public class CommunicationDevice extends Electronics {
// 통화기능
call() {}
}
# 휴대폰 (통신기기를 상속)
public class MobilePhone extends CommunicationDevices {
// 카메라 기능
camera() {}
// 게임 기능
game() {}
}
# 스마트폰 (휴대폰을 상속)
public class SmartPhone extends MobilePhone {
// 추가 기능
additionalFunction() {}
// 스마트폰은 상위 객체의 기능을 상속을 통해 모두 사용할 수 있다.
// 사용 가능 기능
// power, call, camera, game
}
SmartPhone phone = new SmartPhone;
phone.power();
// 전원을 켜거나 끄기 위한 기능을 사용하는데
// Electronic power()의 내부 로직을 알아야 할 필요가 없음
어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질
public class Animal {
public String name; // 이름
public void showInfo() {
System.out.println(name); // 이름 출력
}
}
public class Penguin extends Animal { public String habitat; // 서식지 public Penguin(String name) { this.name = name; } // 오버로딩 - 중복 정의 : 같은 메서드 이름, 다른 인자 리스트 public Penguin(String name, String habitat) { this.name = name; this.habitat = habitat; } }
class Overloading {
// 리턴 타입이 달라도 오버로딩은 성립
int print(int a, int b) {
return a + b;
}
// 매개변수는 같지만 리턴 타입이 다른 경우
// 오버로딩이 성립하지 않음
void print(int a, int b) {
System.out.println(a + b);
}
// 리턴 타입이 다른 경우
// 위 경우는 매개변수의 타입이 다르므로 오버로딩 성립
double print(double a, double b) {
return a + b;
}
}
public class Penguin extends Animal {
public String habitat; // 서식지
// 오버라이딩 - 재정의 : 상위 클래스의 메서드와 같은 이름, 같은 인자 리스트
@Override
public void showInfo() {
System.out.println(name + " " + habitat);
}
}