안녕하세요. 씨위드입니다.
오늘은 객체지향을 주제로 가지고 왔습니다.
사실 가장 먼저 포스팅했어야 하는 개념이기도 합니다.
대표적인 객체지향언어가 바로 자바이기 때문이죠.
그럼 객체지향이란 무엇인지 알아볼까요?
객체지향이란?
객체지향 언어는 1960년대 처음 등장했다는 것을 알고 계신가요?
Simula라는 최초의 객체지향 언어와 C++ 등의 언어들을 거쳐 1995년 Java가 탄생합니다.
Java를 기점으로 객체지향언어는 프로그래밍 언어의 주류가 되었습니다.
그럼 객체지향 언어는 기존의 언어와 무엇이 다를까요?
사실 크게 몇 가지 규칙을 추가한 것이고 기존의 언어와 크게 다르지는 않습니다.
하지만 객체지향을 통해 코드의 재사용성과 관리의 측면에서 많은 이점을 가지게 됩니다.
코드 중복 제거 및 접근제어와 메서드를 이용해 더 신뢰도 있는 코드를 작성할 수 있게 되었을 뿐만 아니라 유지보수를 용이하게 만들어주었습니다.
객체지향 프로그래밍
객체지향 프로그래밍을 위해선 어떻게 해야 할까요?
이 글을 보시는 분들은 코딩을 처음 시작하신 분들이 많으실 것이라고 생각합니다.
저도 비전공자로서 객체지향의 개념을 스스로 공부하기 전까지는 객체지향이란 뭐지..?라는 생각을 많이 했습니다.
이 부분은 같이 일하던 전공자인 동료도 고민을 하던 부분이었습니다.
그 동료의 고민은 바로 이것이었습니다.
클래스를 언제 만들어야 할지 모르겠다.
제 코드를 보여준 적이 있는데, "클래스를 되게 잘 만든다. 함수를 잘 쪼갠다."라는 감상평을 들은 적이 있습니다.
물론 기분 좋으라고 해준 말일수도 있지만 저는 개인적으로 지저분한 것을 매우 싫어합니다. (빨래통에 빨래 개서 넣습니다.)
때문에 최대한 깔끔한 코드를 작성하려고 노력하고 많이 고치는 편입니다.
잠시 찔려서 고백하는데 저는 아직 개발을 시작한 지 오래되지 않았습니다.
하지만 때로는 시니어들의 조언보다 같은 주니어의 입장에서 하는 조언이 도움이 될 때도 있지 않나요?
객체지향을 공부하시는 여러분께 드리고 싶은 조언은 많은 코드를 보시면 좋을 것 같습니다. 중요해서 볼드체입니다.
저는 업무상 오픈소스 코드를 볼 일이 많은데 코드 분석과정에서 자연스럽게 '이런 단위로 클래스를 쪼개고 메서드를 이렇게 만드는구나...'라는 생각을 할 기회가 많았습니다.
옆의 동료가 짠 코드도 물론 훌륭하지만 다양한 오픈소스 코드를 보며 처음에는 외계어 같이 느껴졌던 코드들이 점점 눈에 익고 또 '이런 구조도 있구나'라는 생각도 하게 되었습니다.
또 클린 코드 책도 도움이 많이 되었는데요.
- 하나의 클래스는 하나의 역할만 한다.
- 하나의 메서드는 하나의 기능만 한다.
라는 것이 클린코드의 정신이었죠.
해당 정신을 지키려고 노력하다 보면 객체지향적인 코드를 작성하는데 도움이 되는 것 같습니다.
저의 경우 객체지향 그리고 클린코드를 위해서 메서드 하나는 20줄을 넘기지 않으려고 노력하는 편입니다. (10 줄 이내의 메서드도 많아요.)
처음부터 객체지향적 코딩이 어려우시다고요? 당신은 정상입니다!
일단 코드를 작성해 보세요.
그리고 바라보며 고민을 해보시는 것을 추천합니다.
어떤 단위로 나누어야 할지, 어떻게 개선하면 코드가 더욱 깔끔해질 수 있을지에 대하여 고민하다 보면 조금 더 객체지향적인 코드를 짤 수 있지 않을까요?
물론 그 안에서 시행착오도 분명 존재할 것입니다.
저의 경우 코드를 줄이는 것에 집중해 클린코드 포스팅에서 언급했던 기차충돌 코드를 작성해보기도 하고 가독성에 집착한 나머지 효율을 고려하지 않은 경험도 있었죠.
하지만 중요한 것은 그러한 시행착오를 거치며 조금씩 성장했다는 것입니다! (아직 갈 길이 멉니다.)
사설이 길었습니다.
여러분도 더 좋은 코드를 위해 많은 고민을 하고 계시기에 이렇게 긴 글을 읽고 계신 것이라고 생각합니다.
그러려면 다양한 개념들에 대해서 알고 가는 것도 중요합니다!
먼저 객체지향의 가장 핵심적인 개념인 객체에 대하여 알아봅시다.
객체(Object)란?
객체지향은 알았습니다.
그럼 객체란 무엇일까요?
객체는 실제로 존재하는 것, 개념이라고 생각하시면 됩니다.
클래스는 이런 객체를 생성하고 정의하는 데 사용합니다.
객체지향 관점에서 바라보면 객체는 아래 두 가지로 이루어져 있습니다.
- 속성 : 변수를 뜻합니다. member라고도 합니다.
- 기능 : 메서드를 뜻합니다.
어렵게 말했지만 간단하게 객체는 변수와 메서드로 이루어져 있다는 이야기였습니다.
그럼 왜 속성과 기능이라고 표현했을까요?
Seaweed라는 클래스가 있다고 생각해 봅시다.
Seaweed의 속성으로는 아래와 같은 것들이 존재합니다.
- 이름
- 나이
- 키
- 몸무게
Seaweed의 기능에는 어떤 것들이 있을까요?
- 걷기
- 먹기
- 코딩하기 -> 중요해요 ^^
- 자기
이해에 도움이 되었을까요?
하지만 이 개념은 객체지향적인 개념에서 바라본 객체(클래스)입니다.
프로그래밍적 관점에서 바라본 클래스에 대해서는 차후 포스팅에서 더욱 자세하게 설명하겠습니다.
인스턴스(instance) 란?
그럼 인스턴스(instance)는 무엇일까요?
객체는 인스턴스를 포함하는 더 큰 의미입니다.
클래스로 객체를 만드는 과정을 인스턴스화라고 합니다.
그 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 할 수 있습니다.
Seaweed라는 클래스가 있다고 가정해 봅시다.
해당 클래스로 객체를 생성해 보겠습니다.
Seaweed sw = new Seaweed();
sw는 Seaweed 클래스의 인스턴스입니다.
이해가 가셨나요?
인스턴스의 생성
그럼 인스턴스는 어떻게 생성할까요?
지난 포스팅에서 생성자에 대하여 이야기했었죠?
생성자에 대한 정보가 필요하신 분들은 아래 포스팅을 참고해 주세요.
인스턴스는 생성자를 이용해 만들 수 있습니다.
아래의 코드를 보시면 이해가 쉬우실 겁니다.
//먼저 참조변수를 만들어줍니다.
//메모리에 참조변수 sw 를 위한 공간이 생성되었습니다.
Seaweed sw;
//객체를 생성하고 생성된 객체의 주소를 참조변수에 저장하겠습니다.
sw = new Seaweed();
//아래와 같이 줄일 수 있겠죠?
Seaweed sw = new Seaweed();
더 자세한 내용은 생성자 포스팅을 참고해 주세요.
오늘 포스팅에서는 객체지향이란 무엇인지 또 객체지향을 이해하기 위해 알아야 하는 개념에 대하여 훑어보았습니다.
다음 포스팅에서는 객체를 조금 더 깊게 파고들어 보겠습니다.
클래스와 메서드 그리고 변수 등 객체를 이루는 구성요소들에 대하여 조금 더 자세하게 살펴보고 이해할 수 있도록 말이죠.
그럼 다음 포스팅에서 만나요~