사용자 삽입 이미지
  • 클래스란

    프로그램에서 객체를 구현한 것을 클래스라고 합니다. 클래스는 다르게 말하자면 구조체의 확장이라고도 할 수 있습니다. 원래 구조체라는게 관련 있는 변수들만 모아놓은 거지만, 클래스는 관련있는 함수들까지 모아놓을 수 있죠. 클래스에 캡슐화 된 데이터는 클래스 자신이 처리, 관리하도록 함으로써 능동적인 객체를 만들 수 있습니다. 이렇게 함수와 data를 모아 놓으면 한 클래스에서 관련된 기능들을 한 클래스 내에서 일괄적으로 수행하도록 캡슐화를 할 수 있는 것이죠.

    이렇게 클래스를 만들어서 실제로 프로그램에서는 인스턴스라는 것을 만들어서 사용해야 하죠. 인스턴스에 대해 그림으로 설명을 하겠습니다.

    사용자 삽입 이미지

    [그림4] Dog 클래스에 대한 인스턴스들

    자바에서는 위 처럼 클래스를 구성할 수 있습니다. 멤버 변수는 더욱더 추가될 수 있겠죠? 병에 걸렸다든가, 나이든가. 함수 역시 짖기와 꼬리흔들기 외에도, 집지키기, 고양이 잡기 등등. 이제 이것으로 인스턴스를 생성하면 밑에 처럼 됩니다.

    사용자 삽입 이미지

    [그림5] Dog 클래스에 대한 인스턴스들

    음.. 약간 비유가 이상하긴 하지만, Dog에 대한 인스턴스를 세 개 생성했을 때의 결과라고 볼수 있습니다. 자세한 클래스 정의 방법과 인스턴스 생성방법은 이번 강좌 맨 끝의 자바에서의 클래스에서 코드로 자세히 말씀드릴겠습니다.

    클래스에서 매우 중요한 요소. 객체지향이라면 갖춰야 할 요소. 바로 상속(Inheritance)이 있습니다. 상속이란 무엇이냐면요, 간단한 비유로 나무 같은 개념입니다. 개는 포유류의 한 종류죠? 그렇다면 개는 포유류의 특징을 지니고 있어야 합니다. 하지만 사람도 포유류죠? 하지만 개와는 분명히 다른점이 있습니다. 밑에 그림으로 간단히 나타내 보았습니다.

    사용자 삽입 이미지

    [그림6] 상속

    위의 그림을 보시면, 사람과 개는 포유류로부터 상속을 받은 클래스라고 할 수 있습니다. 즉 사람이라는 클래스는 포유류 로부터 상속을 받을수 있다는 것이죠. 하지만 이 상속의 개념을 자세히 설명하는 것은 이 강좌와 성격이 맞지 않으므로 간략히 소개만 하는걸로 하겠습니다.

  • 클래스를 이루는 구성요소

    클래스의 구성요소에는 생성자, 소멸자, 멤버 변수, 메소드 가 있습니다. 하나씩 설명하도록 하죠.

    -생성자 함수
    주로 클래스 변수들의 초기화 작업에 쓰이게 됩니다. 인스턴스를 선언하면 해당 클래스의 생성자 함수가 가장 먼저 호출되죠.
    -소멸자 함수
    소멸자 함수는 생성자와 반대되는 개념으로, 해당 인스턴스가 메모리에서 삭제될 때 호출되는데요, 자바에서는 Garbage Collector가 알아서 소멸자 호출을 하게 됩니다.
    -멤버 변수
    처음 등장하는 용어죠. 클래스 내에 있는 변수입니다.
    -메소드(멤버 함수)
    클래스 내에 있는 함수들을 가리킵니다.

    자바에서의 클래스는 위의 네가지로 구성되게 됩니다.

  • 클래스의 이점

    클래스를 사용하는 객체지향적 언어를 사용하시다 보면 자연적으로 느끼실수 있을 것입니다.

    -빠르게 구별이 가능하다.
    좋은 예를 하나 들자면 스택의 경우가 아닐까 합니다. 클래스 기반이 아닌 언어로 스택을 짜려면 배열같은 것들을 전역변수로 하거나 메인 함수 안에 넣어준 후 그에 해당하는 pop이나 push같은 함수를 작성하게 됩니다. 스택이 하나라면 문제가 덜 하지만 두 개라면 어떤 push가 어떤 배열에 적용되는지가 명시적으로 나타나기 힘이 들게 됩니다. 하지만 클래스로 stack 클래스를 구성하여 그에 대한 인스턴스를 생성하면 해당 인스턴스 뒤에 함수명이 나타나게 되므로 명시적인 구별이 가능해 지게 됩니다.

    -관리가 쉽다.
    클래스를 사용하지 않는 언어에서 프로그래밍을 하다가 버그가 있어서 디버깅을 해야 할 때가 있습니다. 이런 경우에 클래스로 짜여진 프로그램이라면 이상이 있는 클래스의 코드로 접근해서, 그 클래스만 건드려 주면 프로그램의 버그를 잡아낼 수 있습니다. 하지만 클래스로 짜여진 것이 아니라면 어디를 어떻게 고쳐야 할지 막막해지는 경우가 있습니다. 그러다가 엉뚱한 곳을 건드려 난감해지는 경우도 생기죠. 게다가 클래스별로 일의 분배가 이루어지기 때문에 작업의 분할이 더욱 쉬워지게 됩니다. 이렇게 작업별로 분화를 하는 것을 Module화 한다고 하죠.


  • Posted by 영웅기삼
    ,