- 캡슐화 (Encapsulation)
- 데이터와 메서드를 하나의 단위인 객체로 묶어 관리하는 개념입니다. 이를 통해 데이터가 외부에서 직접 접근하지 못하도록 보호하고, 필요한 기능만 제공하여 코드의 안전성을 높입니다.
- 추상화 (Abstraction)
- 복잡한 시스템을 단순화하여, 중요한 정보만을 제공하고 불필요한 세부 사항을 숨기는 개념입니다. 추상화를 통해 객체가 외부와 상호작용할 때 중요한 부분만 제공하고, 내부 구현은 숨겨집니다.
- 상속 (Inheritance)
- 기존의 클래스를 기반으로 새로운 클래스를 만드는 방식입니다. 상속을 통해 코드의 재사용성을 높이고, 새로운 기능을 추가할 수 있습니다. 자식 클래스는 부모 클래스의 특성과 메서드를 상속받아 사용하고, 필요에 따라 재정의할 수 있습니다.
- 다형성 (Polymorphism)
- 동일한 메시지(또는 메서드 호출)가 다른 객체에서 다르게 동작하도록 만드는 개념입니다. 다형성을 통해 하나의 메서드나 인터페이스로 다양한 방식으로 행동할 수 있게 합니다. 주로 메서드 오버로딩이나 오버라이딩을 사용하여 구현됩니다
이렇게 나오는데 너무 어려워서 하나하나 쉽게 설명을 해보자면,
1. 캡슐화 : " 데이터가 외부에서 직접 접근하지 못하도록 보호하고, 필요한 기능만 제공하여 코드의 안전성을 높인다" 이것만 보면 데이터를 보호 ? 하는 의미를 가지고 있는 것 같은데

학생 클래스를 만들어 주고 나이와 이름은 중요한 정보이기 때문에 외부에서 접근할 수 없게 public이 아니라 private설정을 합니다. 이렇게 하면 값을 가지고 올 수 없기 때문에 get,set 을 이용해 조회, 수정할 수 있도록 제공합니다.
결론 : 캡슐화는 private라는 키워드를 이용해 접근을 막고 데이터를 캡슐로 싼다 , 보호한다는 의미 입니다.
캡슐화를 하는 이유
1. 데이터 보호 (Encapsulation)
캡슐화의 가장 중요한 목적 중 하나는 데이터를 보호하는 것입니다. 클래스 내부의 데이터를 **private**으로 선언하여 외부에서 직접 접근할 수 없게 함으로써, 데이터가 잘못된 값으로 변경되는 것을 방지할 수 있습니다.
2. 정보 은닉 (Information Hiding)
캡슐화는 정보 은닉을 통해, 객체 내부의 세부 구현을 외부에서 숨길 수 있게 합니다. 외부에서는 객체의 내부 구현에 대한 세부사항을 알 필요가 없고, 오직 메서드를 통해서만 데이터를 조작하거나 접근할 수 있습니다.
3. 코드의 유연성과 유지보수성 향상
캡슐화는 변경을 유연하게 할 수 있게 해줍니다. 객체 내부의 데이터를 숨기고, 이를 조작하는 방법을 메서드를 통해 제공하면, 객체의 내부 구현을 변경하더라도 외부 코드에 영향을 미치지 않도록 할 수 있습니다. 예를 들어, 클래스 내부에서 데이터를 처리하는 방법을 변경하더라도, 메서드만 동일하게 유지하면 외부에서 사용하는 코드는 수정할 필요가 없습니다.
4. 객체 간의 독립성 유지
캡슐화는 객체가 자기 자신을 독립적으로 관리하게 합니다. 각 객체는 자신의 데이터를 직접 관리하고, 외부 객체가 내부 데이터에 직접 접근하는 것을 방지하여 자기 자신을 책임지는 객체를 만들 수 있습니다. 이를 통해 객체 간의 결합도를 낮추고, 재사용성과 유지보수성을 높일 수 있습니다.
2. 추상화 : 필요한 기능만 외부에 제공하고, 내부적인 복잡한 구현은 감추는 것.

Animal이라는 클래스(설계도를) 구성만 하고 '소리를 낸다' 라는 개념만 정리하고 구체적으로 어떤 소리가 나는지는
Dog, Cat이라는 클래스를 따로 만들어서 구현하도록 했습니다.
이게 왜 추상화라는 개념일까 ?
추상화의 핵심은 **"구체적인 세부사항은 숨기고, 필요한 핵심 기능만 외부에 제공하는 것"**입니다. "소리 낸다"는 동작은 공통적이고, 어떻게 소리를 내는지는 각 동물마다 다를 수 있죠. 그런데 사용자나 다른 코드에서는 "소리를 낸다"는 기능만 알고 있으면 되고, 구체적으로 소리가 어떻게 나는지는 알 필요가 없습니다. 이처럼 공통된 개념을 추상화하고 구체적인 구현은 따로 다룬 것이 바로 추상화입니다.
3. 상속성 : 상속성은 객체지향 프로그래밍에서 중요한 개념중 하나인데요, 상속성은 하위 클래스(자식 클래스)가 상위 클래스(부모 클래스)의 속성과 메서드를 물려받는 방식입니다. 이렇게 부모 클래스의 속성과 메서드를 자식 클래스가 물려받으면, 자식 클래스는 부모 클래스의 기능을 재사용할 수 있으며, 추가적인 기능을 확장하거나 수정할 수 있습니다.
상속의 주요 개념
- 부모 클래스(Parent Class): 다른 클래스에서 상속받을 수 있는 속성이나 메서드를 정의한 클래스.
- 자식 클래스(Child Class): 부모 클래스의 속성과 메서드를 물려받는 클래스.
- extends 키워드: 자식 클래스가 부모 클래스를 상속받을 때 사용하는 키워드

- Animal이라는 부모 클래스를 만들어서 make sound메서드를 만들었다.
- Dog는 Animal이라는 부모클래스에서 속성과 메서드를 물려받아 만들어진 자식클래스이다.
@Override는 public void makeSound()라는 메서드가 부모클래스에도 있는지 재정의를 (확인)을 하는 것이다. 만약 부모 클래스에 ↗위 메서드가 없다면 오류를 발생시킴.
4. 다양성 : 메서드 오버라이딩이라는 방식을 정리를 해 보겠습니다.
메서드 오버라이딩은 자식 클래스가 부모 클래스의 메서드를 재정의하는 것입니다. 자식 클래스는 부모 클래스에서 정의된 메서드를 자기 클래스에 맞게 변경할 수 있습니다. 이를 통해, 부모 클래스의 기능을 확장하거나 변경할 수 있습니다.
다형성의 핵심인 오버라이딩을 통해 같은 메서드가 다양한 클래스에서 다르게 동작할 수 있습니다.

Dog,Cat이라는 클래스는 Animal이라는 부모 클래스에서 makeSound라는 동일한 메서드를 부여 받았습니다. 하지만
"Bark" 라는 같은 소리가 아닌 고양이클래스는 Meow라는 자기만의 소리가 호출됩니다.
이것이 바로 다형성입니다.
다형성은 하나의 메서드가 다양한 클래스에서 다르게 동작을 할 수 있게 해주는 개념입니다.
"같은 메서드가 다양한 클래스에서 다르게 동작"