객체 지향 프로그래밍 (Object Oriented Programming)
JAVA나 C#,C++과 같은 언어를 다뤄보신 분들이라면 어디선가 무조건 한번이상은 들어 보셨을것이다.
근데 말로만 들었지 면접때 객체 지향 프로그래밍이 뭔가요? 라고 물어본다면 뭐라 정의를 내리기가 애매하고 생각이 나지 않는다.
그래서 다시 한번 공부하고 정리를 해봤다.
내가 정의해보는 객체 지향 프로그래밍
당장 내 책상위에 올려져있는 물건들만 봐도 한 두개가 아니다.
나는 공부를 위해 책상위에 노트와 펜을 올려놨다.
공부를 하려면 노트라는 객체에 펜이라는 객체를 이용해 필기를 하며,
키보드라는 객체를 이용해 정보를 검색하고 모니터라는 객체를 이용해 검색한 결과물들을 시각적으로 확인 할 수있다.
이 처럼 현실세계에서도 여러 객체들간의 유기적인 상호작용들을 통해 어떤 일들이 일어나며, 내가 원하는 행동을 할 수 있다.
우리가 하는 프로그래밍도 마찬가지이다.
위의 코드에서 아래로 내려가는 절차지향 프로그래밍과는 다르게
객체 지향 프로그래밍은 클래스라는 틀을 이용해 속성(프로퍼티)과 행동(함수==메서드)이 담긴 데이터를 추상화 하고,
하나하나의 뚜렷한 객체(인스턴스,오브젝트)로 만든다.
그리고 이 클래스로 찍어낸 객체들간의 상호작용을 통한 로직을 만들어 내는 것
이라고 정의를 한번 해본다.
객체 지향 프로그래밍의 장점과 단점
장점
1. 코드 재사용이 용이하다.
- 남이 만든 클래스(틀을 만들어 두었으니)를 가져와서 그대로 사용가능하고, 상속을 통해 확장해서 사용할 수도 있다.
2.유지 보수가 쉽다.
- 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버변수나 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
3. 대형 프로젝트에 적합.
- 클래스 단위로 모듈화 시켜 개발 할 수 있으므로 큰 프로젝트에서 업무를 분담하여 개발하기 용이하다.
단점
1. 처리속도가 상대적으로 느리다.
2. 객체가 많으면 용량이 커질 수 있다.
3. 설계시 많은 시간과 노력이 필요하다.
클래스 ? 객체?
클래스
클래스라고는 매번 그냥 써보기만 했지 클래스가 뭔가요? 라고 물어보면 할말이 없었다.
우리가 보통 클래스 안에 무엇을 만드는지 생각해보자.
많은 변수들과 함수들을 만들어서 사용한다.
변수 == 속성 , 함수 == 행동 이라고 생각하면 될 것 같다.
속성과 행동들로 만들어진 클래스들을 이용해 이 값을 가지고 행동을 할 수 있는 새로운 객체들을 만들어 내서 사용한다.
한마디로 정리하면 객체를 찍어내는 틀이라고 볼 수 있다.
객체
오브젝트,인스턴스라고도 불리며 클래스라는 틀을 이용하여 생성한다.
우리가 A라는 클래스로 A-1,A-2라는 오브젝트 2개를 생성했다면, 이 A-1이라는 오브젝트와 A-2라는 오브젝트는 전혀 다른 각각의 개체이다.
클래스로 틀을 찍어 객체를 생성하고(메모리 할당), 이 객체는 틀은 같지만 각자의 속성 값들을 가지며 다르게 행동 할 수 있다.
객체지향 프로그래밍의 추상화 , 캡슐화 , 상속, 다형성
추상화
만약 우리가 사람 5명을 불러놓고 "자동차를 한대씩 그려주세요" 라는 요청을 한다고 가정해보자.
그러면 이 사람들은 어떤 자동차를 그릴까?
누군가는 작고 귀여운 경차를 그릴수도 있고, 누군가는 자신의 드림카인 스포츠카를 그릴수도 있다.
자동차라는 개념은 추상적이다.
누구나 머리속에 자동차 라는 개념과 추상적으로 자신이 생각하는 모양과 형태는 존재하지만,
뚜렷하게 '문은 몇개, 색깔은 검정색인게 자동차' 라고 생각하진 않는다.
프로그래밍으로 돌아와서,
우리가 몬스터를 만들기위해 몬스터라는 클래스를 만들었다고 가정해보자.
이 몬스터 클래스 안에는
HP도 있을것이며, 공격력, 이동속도 등등 많은 데이터들이 있다.
그리고 이 몬스터들의 행동을 정의하기위한 메서드들도 존재 할 것이다.
그래서 이 몬스터라는 클래스를 이용하여 각각 다른 속성값을 가지는 슬라임,고블린,좀비 등등
전혀 다른 객체들을 생성 할 수 있다.(인스턴스화)
이런식으로 추상화시켜 클래스를 만들어 공통의 속성이나 기능들을 묶는것 이것이 추상화이다.
캡슐화
1. 정보 은닉
캡슐화라고 생각하면 나는 이상하게 아기를 보호해주는 인큐베이터가 생각난다.
프로그래밍에서 우리는 Private,Protected,Public과 같은 접근제어자들을 통해 변수와 메서드들을 정의한다.
우리가 정의해둔 접근제어자로 외부에서 변경이 되면 안되는 속성값들을 Private로 보호하고,
public을 이용하여 우리의 의도에 맞게 속성값들을 건드릴 수 있는 메서들을 만들어 놓는다면,
외부에서는 직접 변수로 접근하는것이 아니라 public으로 만든 메서드를 이용해서만 접근해서 우리의 의도에 맞게 이용 할 수 있는것이다.
아기를 보호하는것처럼 외부에 노출하면 안되는 정보들을 접근 불가능하게 막고 보호 할 수 있다.
2. 코드를 재수정 없이 재활용 가능
위에 정보 은닉이라는 캡슐화의 특성을 이용해 정말 보호해야 할 정보는 보호를 해놓은 상태이기 때문에,
코드의 수정이 일어났을때 책임이 있는 객체만 수정을 하면 되기때문에 수정이 수월해졌으며
관련된 기능들이 한곳에 모여있기 때문에 객체 재활용이 원활해졌다.
상속
상속이란 다른 클래스를 상속받아 부모 클래스로 만들고, 그 클래스에 있는 기능들을 사용 할 수 있게 한다.
만약 자식별로 다른 기능이 필요하다면 override를 통해 그 기능만 자식클래스에서 재 정의하여 사용 할 수있다.
인터페이스와는 다르게 클래스는 1개의 부모클래스만 가질 수 있다.
다형성
하나의 변수명이나 함수명이 상황에 따라 다른 의미로 해석이 될 수 있다는 것이다.
예를들면 상속하여 부모클래스에서의 함수를 재정의 하여 사용하는
Override가 있고,
함수명은 같지만 매개변수를 다르게 하여 상황에 따라 다르게 호출 할 수 있게하는 Overloading이 있다.
제가 공부한 내용과 아래 블로그를 참고하여 작성했습니다.
객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP) (tistory.com)
'프로그래밍 공부 > C# 프로그래밍' 카테고리의 다른 글
[Unity_C#] Switch문 & Switch 식 (0) | 2022.08.21 |
---|---|
클래스와 구조체 / 배열과 리스트 / awake와 start의 차이 (0) | 2022.08.11 |
가비지 컬렉터(garbage collector) (0) | 2022.08.08 |
Object 형식과 박싱 & 언박싱 (0) | 2022.08.08 |
코루틴(Coroutine)에 관한 고찰 (0) | 2022.06.12 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!