객체 지향 프로그래밍
자바는 객체 지향 프로그래밍 언어입니다. 객체 지향 프로그래밍은 필요한 데이터를 추상화 시켜 상태(state)와 행위(behavior)를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.
객체
주변에서 흔히 볼 수 있는 모든 실재(實在)하는 대상이나 논리, 사상, 개념 등과 같은 추상적인 대상들 중 자신의 속성을 가지고 있고 다른것과 식별 가능한 것을 말합니다. 즉, 소프트웨어에서 실제로 구현될 데이터를 의미합니다.
객체 지향 프로그래밍의 특징
- 추상화
- 캡슐화
- 상속
- 다형성
1. 추상화(Abstration)
추상화란 객체들의 공통된 속성이나 관계 등을 추출해서 정의하는 것을 말합니다. 데이터나 프로세스 등을 의미가 비슷한 개념이나 표현으로 정의해나가는 과정이면서 동시에 각 개별 개체의 구현에 대한 상세함은 감추는 것 이라고 할 수 있습니다. 객체를 정의할 때 어떻게 추상화 하는지에 따라 매우 다른 결과가 나올 수 있기 때문에 설계가 중요합니다.
2. 캡슐화(Encapsulation)
캡슐화란 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 말합니다. 즉, 서로 관련 있는 데이터와 이를 처리할 수 있는 기능들을 한곳에 모아 관리하는 것입니다. 자바 객체 지향 프로그래밍에서 캡슐화를 하는 이유로 크게 두 가지를 언급할 수 있습니다.
- 데이터 보호 (data protection) : 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉 (data hiding) : 내부의 동작을 감추고 외부에는 필요한 부분만 노출
내부 로직의 코드를 정확히 몰라도 기능을 알고 활용할 상황에 캡슐화된 코드를 그대로 사용할 수 있습니다. 기존의 코드를 분석하여 모듈화된 코드를 사용할 수 있으며 오류의 파급효과가 줄어듭니다.
3. 상속(Inheritance)
상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 것을 의미합니다. 추상화의 연장선에서, 상속은 클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화 시켜 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있습니다. 즉, 클래스들 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 합니다.
4. 다형성(Polymorphism)
다형성이랑 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미합니다. 대표적인 예로 메서드 오버라이딩과 메서드 오버로딩이 있습니다.
오버라이딩(Overriding) / 재정의
부모 클래스로부터 상속받은 메서드를 자식 클래스에서 재정의하는 것을 말한다. 상속받은 메서드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생긴다.
오버로딩(Overloading) / 확장
한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
GitHub
https://github.com/Qkrwnsgus0522/Java