객체 지향 프로그래밍(Object-Oriented Programming, OOP) 은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 또한 유연하고 변경이 용이하게 객체 지향 프로그래밍을 만들고는 한다.
한편, 객체 지향을 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임이라고 설명하기도 하는 데 이는 비현실적이나 객체 지향의 다양한 측면을 이해하고 학습하는 데 유용한 점이 있기 때문이다.
이러한 장점을 알기 위해서는 객체 지향에서의 역할과 구현이라는 측면을 이해할 필요가 있다.
클래스는 '객체를 정의해놓은 것' 또는 '객체의 설계도 혹은 틀' 이러한 클래스는 객체를 정의하는 데 사용이 되며 객체는 클래스에 정의된 대로 생성된다.
실제로 존재하는 것 사물 또는 개념이며 클래스에 정의된 내용을 기반으로 메모리에 생성된 것이다.
객체의 공통된 특성을 묶어 주는 것 불필요한 차이점을 배제하는 것. 이는 객체지향 설계에서 중요한 유연성을 확보하기 위한 과정과 동일하다고 볼 수 있다. 즉, 공통 요약본을 만드는 과정이란 것
공통점을 추출하였고,
불필요한 공통점을 제거하였다.
캡슐로 만든다는 의미로 공통점을 묶어 대상화한다고 생각하면 된다. 다음과 같이 캡슐화의 의미는 크게 3가지로 나눌 수 있다.
공통점들의 묶음에 명칭을 부여한다. 이 "묶음"은 다룰 수 있는 "대상"이 된다.
속성과 행위를 하나로 묶는다.
실제 구현 내용 일부를 은닉한다.
추상화와 캡슐화를 통해 공통점에 대해 확인을 했다면 다양한 요구 사항들의 차이점에 대해 집중을 해야할 때이다. 상속은 이미 만들어져 있는 타입을 다른 객체가 물려 받아 이용하는 것을 말한다.
// 추상 클래스로 상속을 구현해봄
abstract class Animal{
abstract void crawling();
}
class Dog extends Animal{
void crawling(){
System.out.println("왈왈~");
}
}
class Cat extends Animal{
void crawling(){
System.out.println("야옹~");
}
}
public class Main{
public static void main(String[] args) {
Cat c = new Cat(); //인스턴스 생성
Dog d = new Dog();
d.crawling();
c.crawling();
}
}
객체 지향에서 가장 중요한 특징이라고 할 수 있다. 쉽게 말해서 하나의 대상이 여러 개의 타입을 가진다는 것을 의미한다.
interface Car{
void move();
void stop();
}
class K3 implements Car{
@Override
public void move()
{
System.out.println("go k3");
}
@Override
public void stop()
{
System.out.println("stop k3");
}
}
class Tesla implements Car{
@Override
public void move()
{
System.out.println("go Tesla");
}
@Override
public void stop()
{
System.out.println("stop Tesla");
}
}
위키백과 - 객체지향 설계
인프런 김영한 스프링 기본 - 객체 지향 설계와 스프링 편