객체 지향 프로그래밍 (OOP) 정리

개발자 베니·2021년 6월 27일
1
post-thumbnail

드디어 한번쯤은 정리를 해야할 그 친구를 데려왔습니다. 자세히 정리를 하기 위해서 정아마추어님 블로그를 상당 부분 인용하게 되었습니다!

출처: https://jeong-pro.tistory.com/95 [기본기를 쌓는 정아마추어 코딩블로그]

객체 지향 프로그래밍(OOP)이란?

객체지향 프로그래밍이란 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜서 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 방법이다.

강아지를 이용해서 객체지향 프로그래밍을 한다면 강아지의 기본 프로퍼티들은 강아지의 털 색깔, 눈동자의 색상, 크기와 길이 무게등의 상태와 강아지가 할 수 있는 행위등을 가진 베이스가 되는 클래스를 만들 수 있다. 우리는 이 점에서 필요한 데이터를 추상화 시켜서 상태와 행위를 가진 객체를 만들었다.

이제 여기서 우리는 생각을 해볼 질문들이 몇 가지가 있다!

1. 객체 지향 프로그래밍을 했을 때 장점이 뭔가요?
2. 객체 지향 프로그래밍의 특징이 뭔가요?
3. 객체(또는 클래스)가 뭔가요?

=> 이는 결국 객체 지향 키워드 5가지에 관한 장단점을
알고 있는지에 대해서 물어보는 것이다.

객체 지향 프로그래밍의 장점은?

코드 재사용이 용이하다.

남이 만든 클래스를 가져와서 사용할 수 있고, 상속을 통해 확장해서 사용할 수 있다.

유지보수가 쉽다.

절차지향 프로그래밍은 코드를 일일이 찾아서 수정해야하는 반면에, 객체 지향 프로그래밍은 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 됨.

대형 프로젝트에 적합.

클래스 단위로 모듈화시켜서 개발할 수 있으므로, 대형 프로젝트처럼 여러 명, 여러 회사에서 개발이 필요할 시 업무 분담이 쉽다.

객체 지향 프로그래밍의 단점은?

처리속도가 상대적으로 느리다.

객체가 많아지면 용량이 커진다.

설계시 많은 시간과 노력이 필요하다.

객체 지향 프로그래밍의 5가지 키워드

1) 클래스와 인스턴스(객체)

2) 추상화

3) 캡슐화

4) 상속

5) 다형성

1) 클래스와 인스턴스

클래스 : 어떤 문제를 해결하기 위해서 데이터를 만들기 위한 추상화를 거쳐서 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것.

위의 강아지 예시를 들어보면, 강아지의 털 색깔, 눈동자의 색상, 크기와 길이 무게등의 상태와 강아지가 할 수 있는 행위등이 있다.

인스턴스 : 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터

위의 강아지 예시에서 왼쪽은 클래스고 오른쪽을 인스턴스라고 볼 수있는데, 왼쪽의 클래스는 실제로 존재하는 데이터가 아닌, 베이스로 만들어 놓은 청사진이라고 볼 수 있다. 이 청사진을 이용해서 실제 프로그램에 사용할 수 있는 데이터로 만들어 주는 것이 인스턴스다.

2) 추상화

불필요한 정보는 숨기고 필요한 정보들만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것.

(= 객체지향 관점에서 클래스를 정의하는 것)

(= 청사진의 강아지)

3) 캡슐화

만약에 우리에게 자동차의 데이터를 만들라는 명령이 들어왔고, 만들어야 할 자동차는 티코, 아우디, 모닝, 포르쉐.... 등등 총 20가지의 자동차를 만들어야 하는 과제가 주어졌다고 하자.

각각의 자동차는 제조사와 모델명, 누가 소유하고 있고 속력은 어디까지 올라가는지에 대한 데이터가 있는 가 이러한 정보들이 있을 것이다.

하나 하나 이런 정보들을 구현하는 것은 우리에게 너무 힘든일이다. 그리하여 우리는 자동차의 공통적인 속성과 행위를 모아놓고 객체로써 데이터를 생성하는 방법을 구현했다. 여기서 공통적인 속성과 행위를 모아놓은 행위가 캡슐화라고 볼 수 있다.

4) 상속

절차지향 프로그래밍에서도 다른 라이브러리를 통해서 남이 구현한 소스 코드를 이용해서 사용할 수 있었다. 이것을 내 의도에 맞게 수정하게 되면 다른 라이브러리가 되어서 버전에 따라서 구현이 안 될수가 있고, 불필요한 코드의 수정작업을 하게 될 수가 있다.

이러한 부분을 해결하기 위해서 상속이라는 방법이 도입되었다.

상속은 부모 클래스에서 속성과 기능을 그대로 이어받아 사용할 수 있고, 기능의 일부분을 수정해야한다면, 상속받은 자식 클래스에서 기능의 일부분만 수정해서 사용할 수 있게 하는 것이다.

5) 다형성

하나의 변수명, 함수명 등이 상황에 따라 다르게 해석이 될 수 있다는 것이다.

게임으로 보자면, 리그 오브 레전드라는 게임은 각각의 캐릭터마다 스킬을 가지고 있고 가장 강한 스킬은 R버튼의 궁극기를 눌러야 발동이 된다.

각 영웅들은 공통적인 특징으로 R을 누르면 궁극기가 나간다는 점을 모두 가지고 있지만, 그렇다고 해서 모든 캐릭터가 같은 궁극기가 나가진 않는다. 누구는 발로 차고 누구는 뭔가를 발사하고 누구는 뛰어다닌다.

공통적인 특징을 가지고 있지만 상황에 따라서 다르게 해석이 되는 것이 다형성이다.

내용 정리에 도움 받은 블로그

출처: https://jeong-pro.tistory.com/95 [기본기를 쌓는 정아마추어 코딩블로그]

출처 : https://evan-moon.github.io/2019/08/24/what-is-object-oriented-programming/ [Evans Library]

출처 : https://velog.io/@piecemaker/2.-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-4%EB%8C%80-%ED%8A%B9%EC%84%B1 [piece maker]

profile
https://github.com/VVSOGI

0개의 댓글