등장배경
순차적 (비구조적) 프로그래밍
- 정의한 기능의 흐름에 따라 순서대로 동작을 추가하며 프로그램을 완성하는 방식
GOTO
문을 이용하여 흐름제어
- A → B → C 라는 동작을 구현하다가, C 에서 A 로 돌아가야할 상황이라면
GOTO
를 활용
- 무분별하게 사용시 스파게티 소스가 될 가능성이 높다
- 유지보수가 어렵고, 흐름이 복잡해져 코드의 파악이 어려우며, 코드 재사용성을 떨어뜨린다
절차적 (구조적) 프로그래밍
-
비구조적 프로그래밍의 문제점을 보완하고자 등장한 패러다임
-
프로그램이 실행될 때 코드의 위에서 아래 방향(Top-Down)으로만 진행되도록 절차와 순서를 갖게 하는 패러다임
-
순차, 선택, 반복의 구조를 반복해나가면 코드를 진행한다
- 순차: 코드를 순서대로 진행한다.
- 선택: 조건문, 선택문 (if 문, switch~case 문)
- 반복: 반복문 (for, while, do~while 문)
-
흐름 제어를 사용하지 않음으로써 코드 가독성을 높인다
-
기능을 함수 등으로 모듈화시키면서 비구조적 프로그래밍 방식보다 유지보수가 더 쉽고, 코드 의미 파악이 쉬우며, 코드의 재사용성도 높여준다
-
속성과 행위가 개별로 분리된다
- 갈수록 협업이 중시되며 여러 사람이 함께 작업을 하고, 코드가 점점 거대화 되면서 속성과 행위의 연관 여부를 바로 알아내기 힘들어졌다
- 이에 대한 대책으로 이들을 하나의 개념으로 묶어서 표현하자는 개념인 객체지향 프로그래밍이 등장하게 된다
객체지향 프로그래밍
*객체(object)를 주된 관심(Oriented)으로 삼는 프로그래밍 방법론
- 컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임
ex) 수 많은 부품들의 결합과 연결로 하나의 완전한 자동차가 만들어진다
- Bottom-Up 방식을 지향
- 어떤 프로그램의 일부분에 해당하는 작은 부품, 즉 객체를 먼저 만들고 이렇게 만들어진 여러 객체들을 조립해서 하나의 완성된 프로그램을 만드는 프로그래밍 방법론
- 장점
- 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다
- 컴퓨터 부품을 갈아 끼울 때, 해당하는 부품만 쉽게 교체하고 나머지 부품들을 건드리지 않아도 되는 것처럼 소프트웨어를 설계할 때 객체 지향적 원리를 잘 적용해 둔 프로그램은 각각의 부품들이 각자의 독립적인 역할을 가지기 때문에 코드의 변경을 최소화하고 유지보수를 하는 데 유리하다
- 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현할 수 있다
💡 객체(object)란?
- “모든 실재(實在)하는 대상”을 객체 지향 프로그래밍 언어에서는 객체라고 부른다 ex) 사물, 사상, 철학, 개념, 공식
- 객체 지향 프로그래밍에서는 이와 같은 각각의 객체를 추상화시켜 속성(state)과 기능(behavior)으로 분류한 후에 이것을 다시 각각 변수(variable)와 함수(function)로 정의하고 있다
객체지향 프로그래밍의 4가지 특징
1. 추상화 (Abstraction)
- 중요한 부분을 강조하기 위해 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현하는 것
- 객체 지향 프로그래밍에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는것
- 인터페이스(interface)
- 역할과 구현의 분리
- 객체의 역할만을 정의하여 객체들 간의 관계를 보다 유연하게 연결하는 역할을 담당
- 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것
2. 캡슐화 (Encapsulation)
- 정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것
- 목적
- 외부로부터 클래스에 정의된 속성과 기능들을 보호한다
- 필요한 부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지킨다
- 구현 방법
- 외부에서 접근할 필요 없는 것들은 접근 지정자를
private
으로 두어 접근에 제한을 둔다
🎈 객체 각각은 독립적으로 작용할 수 있도록 응집도는 강해야 하고 다른 모듈을 참조하는 결합도는 낮아야 한다!
3. 상속 (Inheritance)
- 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종
- 클래스 간 공유될 수 있는 속성과 기능들을 부모 클래스로 추상화 시켜 해당 부모 클래스로부터 확장된 여러 개의 자식 클래스들이 모두 부모 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다
- 클래스 상속
- 상속받고자 하는 자식 클래스명 옆에
extends
키워드를 붙이고, 상속할 부모 클래스명을 적는다
- 자바는 다중 상속을 허용하지 않으므로,
extends
뒤에는 하나의 부모 클래스만 와야한다
- 각각의 클래스의 맥락에 맞게 메서드 오버라이딩(method overriding)을 사용하여 기능을 재정의할 수도 있다. (
@Override
)
public Class Parent{ .... }; // 부모 클래스
public Class Child extends parent { .... }; // 자식 클래스
🍞 추상화 vs 상속
추상화 |
상속 |
부모 클래스-자식 클래스의 관계를 전제하면서 공통적인 속성과 기능을 공유한다. |
인터페이스를 통한 구현은 반드시 인터페이스에 정의된 추상 메서드의 내용이 하위 클래스에서 정의되어야 한다. (강제) |
부모 클래스의 속성과 기능들을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩을 통해 선택적으로 재정의하여 사용한다 인터페이스를 사용하는 구현에 비해 추상화의 정도가 낮다 |
4.다형성 (Polymorphism)
출처
객체지향 프로그래밍 제대로 이해하기
[객체지향] Object-Oriented Programming 핵심 개념의 이해
비구조적 프로그래밍과 구조적 프로그래밍
객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화