객체(Object)들이 모여서 상호 협력하면서 데이터를 처리하는 방식
// 프로그램을 묶음 단위로 쪼개서, 추후에 가져다 쓰기 편하게 만들어 놓은 프로그램 방식
!!무엇!!을 중심으로 프로그래밍
객체 지향은 설계가 핵심!
함수를 이용해서 틀을 만들고 이를 결합해서 프로그램을 만들어 나가는 방식
//프로그램을 함수의 집합으로 구성하며, 데이터와 함수가 분리되어 있음
!!어떻게!!를 중심으로 프로그래밍

'자동차'라는 일반적인 개념(추상 클래스 또는 인터페이스)가 있고, 이를 상속 받아서 아래 자동차 모델들(하위 클래스)이 구현되는 것이다.
프로그래밍을 빠르게 설계하고 구현하기 위함
클라이언트는 대상의 역할(인터페이스)만 알면 되고, 내부 구조는 몰라도 된다.
package poly.car0;
public class K3Car {
public void startEngine() {
System.out.println("K3Car.startEngine");
}
public void offEngine() {
System.out.println("K3Car.offEngine");
}
public void pressAccelerator() {
System.out.println("K3Car.pressAccelerator");
}
}
package poly.car0;
public class Driver {
private K3Car k3Car;
public void setK3Car(K3Car k3Car) {
this.k3Car = k3Car;
}
public void drive() {
System.out.println("자동차를 운전합니다.");
k3Car.startEngine();
k3Car.pressAccelerator();
k3Car.offEngine();
}
}
package poly.car0;
public class CarMain0 {
public static void main(String[] args) {
Driver driver = new Driver();
K3Car k3Car = new K3Car();
driver.setK3Car(k3Car);
driver.drive();
}
K3Car 클래스:
startEngine: 엔진을 켜는 기능을 시뮬레이트한다.
offEngine: 엔진을 끄는 기능을 시뮬레이트한다.
pressAccelerator: 가속기를 누르는 기능을 시뮬레이트한다.
Driver 클래스:
setK3Car: Driver 객체에 K3Car 객체를 할당하는 메소드이다.
drive: 운전을 시뮬레이션하는 메소드로, K3Car의 startEngine, pressAccelerator, offEngine 메소드를 차례대로 호출한다.
CarMain0 클래스:
프로그램의 시작점인 main 메소드를 포함한다.
Driver 객체를 생성하고, K3Car 객체를 생성한 뒤, Driver 객체에 K3Car 객체를 할당하고, drive 메소드를 호출하여 운전을 시작한다.

아이폰을 예로 들어 보면, 아이폰,휴대폰,통신기기,전자제품으로 추상화가 이어진다.
// 추상 클래스로 '전자제품' 정의
abstract class ElectronicProduct {
abstract void turnOn();
abstract void turnOff();
}
// '전자제품'을 상속받는 '통신기기' 클래스
class CommunicationDevice extends ElectronicProduct {
void turnOn() {
// 통신기기를 켜는 코드
}
void turnOff() {
// 통신기기를 끄는 코드
}
}
// '전자제품'을 상속받는 '휴대폰' 클래스
class MobilePhone extends ElectronicProduct {
void turnOn() {
// 컴퓨터를 켜는 코드
}
void turnOff() {
// 컴퓨터를 끄는 코드
}
}
// '전자제품'을 상속받는 '아이템' 클래스
class Iphone extends ElectronicProduct {
void turnOn() {
// 아이템을 켜는 코드
}
void turnOff() {
// 아이템을 끄는 코드
}
}
이렇게 전자제품에는 전원기능, 통신기기에는 통화기능, 휴대폰에는 카메라 기능 등이 있다. 그리고 가장 하위 클래스인 아이폰 클래스는 위 기능들을 상속 받았기 때문에, 따로 구현을 하지 않아도 된다. 따라서 새로 개발할 때, 편리하고 빠르게 개발이 가능하다.

추상화를 통해 분리한 추상 개념 정보들을 서로 이어주는 것
extends 사용
상속 되는 클래스 = super/parent 클래스
새롭게 생성된 클래스 = sub/child 클래스
public class Super {
public static void main(String[] args) {
Animal myAnimal = new Animal();
myAnimal.breath();
Fish myFish = new Fish();
myFish.breath();
}
}
//Super class
class Animal{
void breath(){
System.out.println("This animal breathes air");
}
}
//Sub class
class Fish extends Animal{
void breath(){
System.out.println("This fish breathes underwater with gills");
}
}
'Animal' 클래스는 상위 클래스이다. 'Fish' 클래스는 Animal 클래스의 하위 클래스이고, 상속(extends)을 받았기 때문에 Animal 클래스에 속하는 메서드(breathe())를 사용 가능하다.
public class VehicleMain {
public static void main(String[] args) {
Car myCar = new Car("Toyota", 1985);
myCar.honk();
System.out.println(myCar.brand + " " + myCar.modelYear);
}
}
class Vehicle{
String brand;
//Vehicle 클래스 생성
Vehicle(String b){
brand =b;
}
void honk(){
System.out.println("bang bang");
}
}
//Vehicle 클래스를 상속받는 Car 클래스
class Car extends Vehicle{
int modelYear;
//Car 클래스 생성자
Car(String b, int year){
super(b); //부모 클래스의 생성자 호출(반드시 먼저 호출되야 한다.)
modelYear = year;
}
}