객체지향 프로그래밍이란?
객체지향 프로그래밍 (object-oriented programming, oop)
객체의 기본형태는 쉽게 말해 클래스로 정의한 아이템(변수)과 동작(함수)들 처럼 속성과 함수들이 클래스로 캡슐화된 것이라 할 수 있습니다.
특징 4가지
- 추상화
- 상속
- 다형성
- 캡슐화
특징 4가지를 살펴보기 앞서 인터페이스에 대해 알아보겠습니다.
인터페이스란?
인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것입니다.
하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않습니다.
하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.
자바에서 추상클래스(abstract class)는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있습니다.
하지만 인터페이스(interface)는 오로지 추상 메소드와 상수만을 포함할 수 있습니다.
추상메소드에는 메소드명만 존재하고 내용은 정의할수 없습니다.
1. 추상화
추상화란 공통적인 부분을(속성 및 함수) 추출하는 것을 뜻합니다. 그렇게 추출 해놓은 추상클래스 및 인터페이스를 상속 및 구현을 하여 사용합니다. 추상문법에는 추상클래스를 사용할수도 있지만 인터페이스를 사용하여 예를 들어보겠습니다.
청소담당이라는 인터페이스를 구현하여 바닥쓸기, 창문닦기 클래스를 만들었습니다. 인터페이스 안에 정의된 함수는 구현된 클래스 안에서 오버라이드로 구현이 강제화 되어 있습니다. 그래서 청소담당이라는 인터페이스를 구현한 바닥쓸기, 창문닦기 클래스에서 청소() 함수를 오버라이드 하여 구현해야 합니다.
여러클래스가 있고 같은 함수를 호출해야 할때 편하게 사용할수 있는데, 바닥쓸기와 창문닦기 각 클래스에 청소()라는 같은 명칭의 함수가 있기 때문에 리스트로 ArrayList<청소담당>을 생성하여 바닥쓸기, 창문닦기 클래스를 리스트에 추가 하고 반복문을 돌려 청소() 함수를 실행시키면 각 클래스에 해당하는 청소() 함수를 실행시킬수 있습니다.
ArrayList<청소담당> list = new ArrayList<>();
list.add(new 바닥쓸기());
list.add(new 창문닦기());
for (청소담당 e : list) {
e.청소();
}
2. 상속
기존 클래스를 재활용하여 다른 클래스에서 사용할 수 있는 것을 뜻합니다. 즉 부모클래스의 속성과 함수들을 자식클래스에서도 쉽게 사용이 가능합니다. 클래스간의 공통적으로 쓰이는 속성과 반복되는 기능들을 일일이 만들 필요 없이 부모클래스에 한번만 정의해놓고 상속받아 사용하면 편리 합니다.
- 상속과 추상화의 차이점
상속은 클래스를 상속 받아서 속성과 함수들을 사용하며 부모클래스에서 속성과 기능이 추가되어 확장되는 느낌이라면, 반면 추상화는 껍데기만 있는 추상메소드의 구현을 강제화하여 동작을 보장할수 있다는 점입니다.
3. 다형성
한 객체의 속성이나 함수가 상황에 따라 여러가지 형태를 할수 있는것이 다형성입니다. 대표적인 예로 오버라이드가 있습니다.
4. 캡슐화
캡슐화란 서로 연관있는 속성과 기능들을 캡슐로 만들어 데이터들을 외부로부터 보호 하는것을 뜻합니다.
- 데이터 보호 : 외부로부터 클래스에 정의된 속성과 기능들을 보호
1. 접근 제어자 private을 사용하여 외부로부터 속성값에 바로 접근이 불가하도록 합니다.
2. getter/setter를 사용 하여 속성값에 접근할수 있도록 합니다.
- 데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출
참고자료 출처
https://www.youtube.com/watch?v=vrhIxBWSJ04&t=511s