세상 모든 것이 객체
객체
란 보고 만질 수 있는 것, 지성적으로 이해할 수 있는 것, 생각이나 행동이 추구하는 바를 말한다.
다시 말해서 객체는 우리 주변에서 쉽게 볼 수 있는 핸드폰, 노트북, 리모컨, TV 등 모든 것이 될 수 있다.
그리고 이들은 자신만의 특성과 행동으로 다른 객체들과 상호작용하고 있다.
예를 들면, 리모컨은 TV를 작동시키기 위한 다양한 버튼이 있다는 특성(state, attribute)
이 있고,
리모컨의 버튼을 누르면 TV가 작동하는 행동(behavior)
이 일어난다.
객체 지향 프로그래밍에서는 리모컨의 특성과 행동을 변수와 메서드로 정의한 것을 클래스
라고 부르며,
이 클래스에서 정의한 것을 바탕으로 실제 생산된 리모컨을 인스턴스(객체)
라고 부른다.
객체 지향 프로그래밍(Object-Oriented Programming, OOP)
객체 지향
이라는 말의 뜻처럼 객체 지향 프로그래밍은 객체들의 집합으로 프로그램의 상호 작용을 표현하는 방식이다.
즉, 프로그래밍의 설계 패러다임 중 하나로 현실세계를 프로그래밍에 적용하는 것이다.
이제 객체 지향 프로그래밍이 뭔지는 알겠다. 하지만 왜 이런 게 탄생하게 된 걸까?
객체 지향 프로그래밍, 왜 등장했어?
객체 지향 프로그래밍이 등장할 당시 범용으로 사용됐던 것은 절차 지향 프로그래밍이다.
절차 지향 프로그램
이란, 실행하고자 하는 절차를 정하고 이 절차대로 프로그래밍하는 방법을 말한다.
플로우 차트와 같은 개념이라고 생각하면 쉬울 것 같다. 절차 지향 프로그래밍은 일의 흐름(flow)
에 중점을 둔다.
하지만 절차 지향 프로그래밍의 경우 흐름의 시작부터 끝까지 하나로 쭉 연결되어있기 때문에 이 흐름 중 한 군데라도 문제가 생기면 흐름 전체에 문제가 발생한다.
또한, 흐름 중 일부를 수정할 경우 결과가 달라질 가능성이 매우 높기 때문에 흐름 전체를 수정해야 한다는 단점이 있다.
즉, 유지보수가 굉장히 어렵고, 재사용성이 낮으며 디버깅이 어렵다는 단점이 있다.
과거에는 단순한 수학 계산이나 통계 처리 등을 주로 했기에 절차 지향 프로그래밍을 사용해도 큰 문제가 없었지만
점차 컴퓨터가 발전함에 따라 현실세계에서 일어나는 일을 컴퓨터가 처리해야 하는 경우가 많아지게 되었다.
하지만 현실세계의 일에 절차 지향 프로그래밍을 적용하는 것은 위에서 언급한 절자 지향의 단점들로 인해 굉장히 비효율적이다.
따라서 현실세계의 일을 보다 쉽게 표현할 수 있는 객체 지향 프로그래밍이 등장하게 되었다.
객체 지향 언어의 특징
1️⃣ 캡슐화(Encapsulation)
캡슐화
란 객체를 캡슐로 싸서 내부를 보호하고 외부에서 볼 수 없게 하는 것으로, 객체 지향 언어의 가장 본질적인 특성이다.
이렇게 생긴 알약을 생각하면 쉽다.
뜯어보지 않는 이상 우리는 이 알약 안에 무엇이 들었는지 알 수 없고,
캡슐로 쌓여 있기 때문에 안의 내용물은 오염이나 변질로부터 안전하다.
캡슐화를 왜 사용할까?
캡슐화를 사용하면 객체가 외부에 노출하지 않아야 할 정보 또는 기능을 접근제어자를 통해 제어 권한이 있는 객체에서만 접근하도록 할 수 있기에 코드의 수정이 일어났을 때 책임이 있는 객체만 수정하면 된다. 따라서 영향 범위를 예측하는 것이 수월해진다.
또한, 관련된 기능과 특성을 한 곳에 모아 사용하기 때문에 객체의 재사용성이 높아진다.
2️⃣ 상속(Inheritance)
절차 지향 프로그래밍에서도 라이브러리를 통해 남이 작성한 코드를 재사용하는 것은 가능하지만 추가 또는 확장은 불가능하다.
잘 짜인 코드를 내가 원하는 대로 수정하고 확장하기 위해 객체 지향 프로그래밍에서 상속이라는 개념이 등장했다.
상속
은 상위 클래스의 특성을 하위 클래스가 물려받아 재사용하거나 추가 또는 확장하는 것을 말한다.
이렇게 하면 코드의 재사용성
이 높아지고 계층적인 관계를 형성할 수 있으며 유지보수가 쉽다는 장점이 있다.
3️⃣ 다형성(Polymorphism)
다형성
은 같은 이름의 메서드가 클래스 또는 객체에 따라 다르게 동작하도록 구현되는 것이다.
상속과 약간 비슷한 개념이지만 하위 개체가 상위 개체의 속성을 그대로 가지는 게 아니라 자신의 특성에 맞춰서 다르게 갖게 된다.
다형성에는 대표적으로 오버로딩
과 오버라이딩
이 있다.
오버로딩과 오버라이딩에 대해서는 아래 글을 참고하면 좋을 것 같다.
4️⃣ 추상화(Abstraction)
추상화
란, 복잡한 시스템으로부터 핵심적인 개념이나 기능을 간추려내는 것을 의미한다.
예를 들어, Student와 Professor, Researcher 이렇게 3개의 클래스를 작성한다고 하자.
각 클래스에는 굉장히 다양한 속성이 포함될 수 있지만 공통된 속성으로는 말하기, 먹기, 잠자기 정도가 있을 것이다.
만약 공통된 속성들을 세 클래스 각각에서 구현하게 된다면 코드의 길이도 길어질뿐더러 중복된 부분이 엄청나게 발생할 것이다.
여기서 우리는 추상화라는 개념을 사용한다.
말하기, 먹기, 잠자기는 세 클래스의 공통된 속성이기도 하지만 세 클래스의 큰 범주인 사람의 속성이기도 하다.
따라서 Person이라는 상위 클래스를 생성하여 말하기, 먹기, 잠자기의 속성을 집어넣고
세 클래스는 이 Person이라는 클래스를 상속받아 자신에게 필요한 속성만 추가하면 된다.
객체 지향 프로그래밍의 장점
1. 소프트웨어의 생산성 향상
2. 재사용성 증가
3. 실세계에 대한 쉬운 모델링
4. 높은 보안성
객체 지향 프로그래밍의 단점
1. 느린 개발 속도
2. 느린 실행 속도
References
JaeYeopHan/Interview_Question_for_Beginner
📖 명품 Java Programming
'CS > 개발상식' 카테고리의 다른 글
TDD(Test-Driven Development) (0) | 2022.09.15 |
---|---|
RESTful API (0) | 2022.09.09 |
객체 지향 프로그래밍의 설계원칙, SOLID (0) | 2022.09.07 |
오버로딩(Overloading) vs 오버라이딩(Overriding) (0) | 2022.09.07 |
좋은 코드란 무엇인가 (0) | 2022.08.31 |