본문 바로가기

프로그래밍 언어/코틀린_Kotlin_더파기

코틀린 더파기_13_class_개념과 생성

앱 또는 프로그램도 업그레이드로 문제점을 수정하고 성능을 향상시키듯이, 프로그램 코드를 작성하는 기법도 보완과 필요성에 따라 지금까지 다양하게 발전되어 왔다.

 

처음 등장한 것은 Procedural Programming (절차적 프로그래밍) 기법이다.

지금도 간단한 앱을 만들거나 코딩 초보자인 경우는 대부분 이 기법을 사용하여 코딩한다고 할 수 있다.

이 기법은 기본적으로 작업을 어떤 과정으로 하고 어떻게 끝내야 하는 지에 대한 논리적 단계를 만드는 것이다. 

 

즉, 프로그램을 procedure(프로시저) 단위로 작성한 후 procedure call(프로시저 호출)을 사용하는 개념으로 작동한다. 

procedure의 다른 이름은 routine(루틴) , function(함수)이다.

 

요약하면 절차적 프로그래밍 기법은 명령들을 만든 후 단계별로 어떤 명령을 쓸 지 컴퓨터에게 알려주는 지시문을 작성하는 것이다.

 

 

시대가 발전하면서 프로그램의 덩치도 커지고(당연히 함수 등도 많아지고 복잡해진다) 그로 인해 분업을 해야 하는 상황에 직면하자 이 문제를 해결할 수 있는 프로그래밍 기법에 대한 필요성이 생겨났다. 그래서 객체지향 프로그래밍(OOP : object-oriented programming) 개념이 등장한 것이다.

 

간단하게 말하면 프로그램을 만들 때 객체(object)를 만들어 서로 연결하는 구조로 코드를 짠다는 뜻이다.

 

이 개념의 중심에 class(클래스)가 있다.

객체지향이라는 것이 추상적인 개념이므로 class 또한 추상적인 개념이다.

클래스는 property(속성)과 function(함수, 기능)을 가진다.

 

클래스를 만드는 기본은 하나의 파일에 하나의 클래스를 만드는 것이다.

이렇게 해야 기능을 추가하거나 수정하기 편하다.

 

여기까지는 그냥 외우면 되는데 이해는 잘 안된다.

좀 더 자세하게 풀어보자.

 

객체(object)는 왜 만드나?

정확하게 말하면 '왜 객체라는 개념을 만들었나?' 이다.

예를 들어 보면 좀 더 이해하기 쉽다.

 

지금 다음 줄에 내가 적는 글자를 보자.

'개'

위 글자를 본 순간 머리 속에는 '개'라는 동물이 떠오를 것이다.

왜냐하면 머리 속에 이미 '개'가 무엇인지에 대한 개념(관념)이 기억되어 있기 때문이다.

이렇게 관념으로 자리잡고 있는 것을 유추하여 알아내는 것을 '추상(abstract)'이라고 한다.

 

설령 말티즈와 불독 처럼 색이나 크기,모양 등이 완전히 달라도 정확하게 '개'라는 것을 추상할 수 있다.

사람은 이런 추상화 할 수 있는 능력을 가지고 있다.

 

이제 즉석으로 머리 속에 원하는 '개'를 한 마리 그려보라.

그렸다면 그것이 바로 객체(object)다.

 

또 다른 '개'를 한 마리 더 그려보라.

그렸다면 그것이 바로 객체2다.

 

이번에는 객체2 (개)가 어떤 동작을 하도록 상상해 보라.

그것이 함수(function)이다.

 

그리고 '개'는 class(클래스) 이름이다.

 

그런데 '개'를 그리라고 했는데 무슨 기준으로 그렸는가?

설마 돌고래 비슷하게 그려놓고 '개'라고 우기는 건 아니겠지?

추상화 되어 있는 '개'에서 객체를 만들려면 공통적인 특징을 사용해야 한다.

 

다리는 4개 있을 것이고

어떤 색이 있을 것이고

꼬리도 있을 것이고

털도 있을 것이다.

 

다리, 색, 꼬리, 털 이런 것들이 속성(property)이다.

 

참고로 클래스에 의해 만들어진 객체를 다른 말로 instance(인스턴스)라고 한다.

class(클래스)의 구조가 어떻게 되어있는지 알 수 있을 것이다.

 

클래스를 만들어 놓으면 속성과 함수를 조합하여 객체를 자유롭게 만들어 낼 수 있다.

위에서 예로 든 것은 우리가 아는 '개'라는 동물이지만 코드 안에서는 내 마음대로 어떤 상상의 객체도 만들 수 있다.

처음 질문으로 돌아가서 '왜 객체라는 개념을 만들었을까?' 에 대한 답이 떠오르는가?

 

나는 RPG 게임의 캐릭터가 떠오른다.

 

클래스 생성하기

 

이제 클래스를 만들어보자.

'코틀린 더파기' 시작할 때 부터 예로 만들었던 코드를 이용해 보자.

 

게임을 만들기 위해 Game.kt라는 파일을 만들고 main함수 안에 Wraven 이라는 주인공을 만들었다.

생명 에너지가 70

물을 가지고 있고

파워는 가지고 있지 않았다.

등의 코드를 작성했었다.

 

이제 이 코드를 기준 삼아 player(플레이어) 라는 클래스를 만들어 보자.

 

새 코틀린 파일을 만들고 파일명을 player라고 붙인다.

그리고 파일에 player라는 클래스를 만든다.

 

게임을 시작하면 main함수가 실행될 것이다.

만약 게임을 시작하고 플레이어(캐릭터)를 만들어 낸다고 하자.

방금 Player라는 클래스를 만들었으므로 이 클래스를 불러와서 플레이어(캐릭터) 객체를 만들 수 있을 것이다.

 

플레이어 클래스를 이용하여 객체(Instance ; 인스턴스)를 만들 때는 클래스의 생성자(constructor)를 호출하게 된다.

 

플레이어 클래스의 객체(인스턴스)를 만드는 코드는 다음과 같다.

 

player라는 변수를 만들고 여기에 인스턴스(객체)를 저장하는 것이다.

인스턴스(객체)를 만드는 방법은 '클래스명( )' 을 적으면 된다.

 

괄호()는 Player클래스의 기본 생성자(primary constructor)를 호출한다는 뜻이다.

 

primary(프라이머리)는 '기본의, 주요한, 첫째의' 뜻이므로 기본 생성자는 '주 생성자' '첫번째 생성자'라는 뜻으로 이해하면 되겠다. 또한 construct는 '건설하다, 구성하다, 그리다' 등의 뜻이고 끝에 붙은 ~or 은 물건이나 도구, 사람 등을 나타내는 말이다.

 

그러므로 생성자(constructor)는 인스턴스(객체)를 만들고 사용할 수 있도록 하는 역할을 한다.

매개변수가 있다면 괄호 안에 표시하면 된다.

 

클래스 구성하기

 

이제 인스턴스(객체)를 제대로 작동하도록 하려면 클래스에 내용(속성과 함수)을 만들어 넣어야 한다.

이전에 main함수 아래(15번줄)에 플레이어(Wraven)가 돌을 던지는 함수(castStone)를 만들었다.

 

이 함수는 플레이어가 전투에 참가하여 할 수 있는 행동(동작)을 나타내는 함수이다.

그러므로 플레이어의 속성과 함수를 가질 수 있는 Player라는 클래스를 만들었으므로 이곳으로 castStone 함수를 옮길 수 있다. 여기에 옮겨 두면 이 Player라는 클래스를 사용하여 만들어지는 인스턴스(객체) 플레이어는 누구라도 이 castStone함수를 호출하여 사용할 수 있게 되는 것이다.

 

main함수 아래에 만들었던 castStone함수를 잘라내어 Player 클래스 안으로 옮긴다.

또한 12번줄에서 실행했던 castStone()함수도 삭제한다.

 

 

정보 숨기기(information hiding)과 캡슐화(encapsulation)

castStone함수는 main함수 아래에 있는 코드와 Player클래스로 옮긴 코드에 다른 곳이 있다.

fun 앞에 있던 private을 클래스 안에서는 지웠다.

 

쌩초보 기초26(가시성 제한자)에서 다루었던 내용인데 private은 가시성 제한자이다.

 

속성이나 함수에 가시성 제한자(visibility modifier)가 붙지 않으면 기본적으로 public 이 된다. 즉, 클래스 외부에서 마음대로 호출할 수 있다는 뜻이 된다. 그러므로 속성이나 함수를 클래스 내부에서만 사용할 때는 private을 붙여 감추는 것이 예상치 못한 문제가 발생하는 것을 막고 유지 보수 등에도 도움이 된다.

한마디로 클래스를 만들 때는 꼭 필요한 것만 외부에 노출하도록 한다.

 

가시성 제한자는 다음과 같은 것이 있다.

 

  • public
  • private
  • protected
  • internal

 

자세한 설명은 아래 링크를 확인한다.

 

http://쌩초보: 가시성 제한자 https://fiftiesstudy.tistory.com/67