2011년 5월 2일 월요일

자바의 생성자(Constructor)와 생성자 오버로딩(Overloading)

자바에서 생성자(Constructor)란 무엇인가? 생성자라는 이름에서 볼수 있듯이 뭔가를 새로 만드는 저절로 생겨나는 작업을 하는 것이다. 그림은 생성자를 호출하는 과정인데 클래스의 인스턴스를 만들때 다시 말해 new 키워드를 통해서 객체를 생성할때 실행되는 명령어들이 있는 장소를 말한다. 아래 그림을 보면 이해가 쉬울 것이다. 잘 안보이면 클릭하고 보기 바란다.


예를 들어 클래스 이름이 Television이라고 하자.

class Television
{
...
}

그럼 클래스 Television의 객체를 a라 하고 객체를 생성하면

Television a=new Television();

바로 이 코드를 실행시킬때 자바는 생성자를 찾고 실행한다. 생성자는 다음과 같은 형태를 지닌다.

클래스이름(받는인자인 입력값은 있을수도 있고 없을수도 있다)
{
...
}

한마디로 이름은 항상 클래스명과 같고 보통 이름의 첫글자는 알아보기 쉽게 대문자로 표기하며 메소드의 형태에서 메소드이름 앞에 붙는 리턴값이 없는 형태를 우리는 생성자라고 하는데 메소드이긴 하지만 아주 특별한 형태의 메소드라고 할수 있겠다. 물론 void라는 리턴값조차 없는거다. 리턴값이 있는지 없는지에 따라서 메소드인지 생성자인지 구별할수 있다.

아직 배우지않아 이해가 안되더라도 지금 단락은 그냥 가볍게 읽어두기 바란다. 정리도 할겸 이왕 생성자에 대해 공부하는 김에 몇자 더 적어보기로 하겠다. 생성자는 상속(inheritance)되지 않는다. 또한 메소드에 접근할수 있는 제어자(Modifiers)인 abstract, final, static, native, synchronized 같은 제어자들을 앞에다가 붙일수 없다. 자바의 명령키워드 중에 this나 super라는게 있는데 생성자안에서 this를 쓸경우에는 같은 클래스안의 다른 생성자를 부르는 것이고 즉 매개변수값(parameter)이 다른 생성자를 부르는 것이고 super를 쓸경우에는 부모클래스의 생성자를 부르는 것이다. this나 super 모두 생성자안에서 쓸때는 첫번째줄에다가 써야한다. 생성자안에서 this( )나 super( )를 쓰는 원칙이다.

위의 설명들을 읽으면서 한숨을 내쉬는 이들이 있을 것이라 본다. 아직 배우지 않은 상속같은거나 언급하고 있으니 말이다. 나중에 여러분이 복습할때는 다 이해하게 될것이니 그렇다고만 알고 편안하게 넘어가기 바란다. 어차피 저런거 몰라도 이번 토픽을 이해하는데 전혀 문제가 없다. 그렇지만 여러분의 궁금증을 풀어주기 위해 앞으로 진행될 강의에 반드시 반영하도록 할테니 염려 푹 놓으시라.^^

모든 클래스에는 최소한 하나이상의 생성자가 있다. 하지만 여러분은 이제껏 예제에서 생성자(리턴값이 없는 메소드)를 볼수 없었을 것이다. 왜냐면 필자가 아직까지 한번도 생성자를 만들어서 쓰지 않았기 때문이다. 그런데 이렇게 얘기하면 모순이다. 방금 모든 클래스에는 생성자가 있다고 하지 않았는가? 자바에서는 생성자가 클래스안에 없을경우 입력값도 없고 안에 명령코드도 없는 빈껍데기의 생성자를 자동으로 만들고 실행한다. 물론 실행할게 없으니 눈에 보이지 않고 결과도 없을 뿐이다. 반대로 기본 생성자든 인자가 있는 생성자든 클래스에 생성자가 하나라도 있다면 자바에서는 아래와 같은 텅빈 기본 생성자를 만들지 않는다.

Television( )
{
}

다시 말하지만 생성자를 만들지 않으면 위와 같은 형태의 생성자가 자동으로 처리된다. 그러면 생성자는 언제 만드는게 필요할까? 예를 들어 텔레비젼을 만드는 공장이 있다고 생각하자. 이 공장에서는 보통 20인치 사이즈의 검정색 TV를 생산하는데 소비자가 원할경우 제품색상을 하얀색이나 은색을 선택할수 있고 사이즈도 기술력이 있어 40인치 크기의 패널까지는 업그레이드가 가능하다고 한다. 그러나 평상시에는 20인치 검정색 TV를 일률적으로 생산한다. 이를 자바의 생성자를 이용해서 프로그램을 만들면 아래와 같다.


그럼 예제풀이를 진행하겠다. 본 프로그램은 생성자가 총 3개 있다. 아무 입력값 넣지 않고 객체 a 생성하면 자동으로 실행되는 기본 생성자, 인자에 제품 사이즈를 넣으면 그 크기만 변경해서 실행되는 b라는 객체명을 통하는 생성자, 인자에 사이즈와 색상을 함께 넣으면 크기와 색깔 둘다 변경해서 실행하는 인스턴스 c에 관련된 생성자, 이렇게 세종류가 있다. 예제에서처럼 생성자는 리턴값이 없고 생성자끼리의 구분은 받는 인자 즉 ( )안의 입력값이 다른걸로 구별한다. 클래스 이름을 사용하는 객체의 생성자 이름은 같은데 이렇게 매개변수가 다른 생성자를 두고 우리는 생성자 오버로드(Overload) 혹은 생성자 오버로딩(Overloading)이라고 표현한다. 실행해보면 알겠지만 결과값을 화면에 출력하는데도 메인메소드안의 명령어들을 보면 메소드를 부른 흔적이나 출력하는 명령어가 없다. 단지 a,b,c라는 객체 생성(인스턴스 생성)을 했을 뿐이다. 이렇게 new라는 키워드로 객체 생성만 해도 실행되는 생성자를 통해 객체가 가장 기본적으로 가지고 있어야할 요소들을 자동으로 초기화시키고 실행시킬수 있다.

생성자는 이렇게 객체를 생성할때 꼭 가지고 있어야할 값을 매번 입력할 필요없이 자동으로 실행하게 만들어 놓은 장치이다. 예에서 생성자를 통해 생산된 TV를 이쪽이나 저쪽라인으로 운반하게끔 만든다든지 제대로 작동하는지 시제품을 검사하는 메소드들을 구현하여 프로그램을 완성시켜가면 더 좋은 프로그램이 될 것이다. 예제의 결과는 아래와 같다.

TV 생산을 시작합니다
20인치 검정색 TV 제작완료
TV 생산을 시작합니다
30인치 검정색 TV 제작완료
TV 생산을 시작합니다
40인치 은색 TV 제작완료

예제를 보면 초기화 블록(Initializer blocks)을 만들어 놓았는데 생성자보다 먼저 실행하고 싶은 것이 있을때 쓸수 있는 명령방식으로 { } 안에 실행코드만 적어놓으면 객체를 생성할때 생성자 종류에 관계없이 어떤 생성자가 있든지간에 한발 앞서서 실행을 한다. 예제 결과를 보면 초기화 블록안에 있었던 "TV 생산을 시작합니다"라는 문구가 매번 생성자보다 먼저 출력된 것을 확인할수 있다. 따라서 어떤 생성자가 실행되든지 공통적으로 앞서서 해야할일이 있다면 초기화 블록(인스턴스 블록)을 이용해 예제처럼 써먹을수 있다. 오늘 강좌를 통해 여러분은 리턴값이 없는 생성자와 리턴값이 있는 메소드를 구별할수 있게 되기를 바라면서 이만 마치겠다.^^

댓글 15개:

  1. 생성자와 객체에 대해서 많이 해깔려했었는데 정말 도움이 많이 되었네요
    고맙습니다 ㅎ

    답글삭제
  2. 감사합니다 ㅠㅠ
    정말 쉽게 설명해주셨네요 ㅎㅎ

    답글삭제
  3. 와...정말 감사합니다.
    생성자의 개념 때문에 너무 힘겨웠는데...
    책을 수 번 읽어도 난 머리가 안 되나, 싶었는데
    이거 보고 겨우 감을 잡았습니다.
    감사합니다.

    답글삭제
  4. I visiteԁ multiple ωеb pageѕ but the аudio quality for audiο sоngs present at this
    wеb page is actually maгvеlous.
    httρ://sоundcloud.сom/uѕer962896094/survіvοг-season-25-epіsode-11
    Also visit my web blog Survivor Season 25 Episode 11

    답글삭제
  5. Αttгactivе sectіon of content.
    ӏ just stumbled upon your weblοg and in aсcesѕіοn capital tο assеrt that Ι
    get in fact enjοyed аccount your blоg postѕ.

    Anyway I will bе ѕubѕcribing tο уοur аugmеnt and еvеn I achievement you aсcesѕ consistentlу quickly.
    http://tomsriver.pаtch.com/events/beauty-and-thе-beast-season-1-episοdе-8-trappеd-watch-it-for-frее-οnlinе-ѕtгeam
    my website: Watch Beauty and the Beast Season 1 Episode 8 Online

    답글삭제
  6. Hi thеre! Quiсk question that's entirely off topic. Do you know how to make your site mobile friendly? My weblog looks weird when browsing from my iphone 4. I'm trуing tο
    find a template or plugin that mіght be able to rеsolvе
    thіs іssuе. If you haѵe any recommеndationѕ,
    please share. Appгeciate it!httρ://blоgs.
    reԁiff.com/vannialford2590/2013/01/03/person-of-intеrest-seasοn-2-episοde-11-2-pi-r-ωatch-free-οnlіne-strеam/
    Also visit my blog ... watch person of interest season 2 episode 11

    답글삭제
  7. I sеlԁom lеaνe a reѕponse, but i did a few
    seaгchіng and wound up herе "자바의 생성자(Constructor)와 생성자 오버로딩(Overloading)".
    And I actuаllу do haѵе a couple οf questiοnѕ for you іf іt's allright. Could it be simply me or does it look like a few of these responses appear like they are left by brain dead visitors? :-P And, if you are posting on other online social sites, I'ԁ like
    tο fоlloω anуthing frеsh уou hаve tο
    post. Сould you list оf the comρlete uгls of all your communal pаgeѕ lіke your twitter feed,
    Faсеboοκ pаge oг linkedіn prοfile?


    mу blog: Scandal s2e13 Nobody Likes Babies
    Feel free to visit my blog post - Scandal s2e13 Nobody Likes Babies

    답글삭제
  8. Bravo for http://ωww.blogger.com, ӏ found bу searchіng for
    " fashion " into Google, if you want to know all my neωs, that
    is : http://ωww.nabіla-allo.com/ . A video aѕ a gіft waiting for you on the homеpage .
    Sеe you soon . u003c3 Αrchie

    Feel free to surf to my blog pοst - Nabilla Benattia

    답글삭제
  9. Thanks very interesting blog!

    Look into my web-site: natural cellulite treatment

    답글삭제
  10. Amazing blog! Is your themee custom made or did you download it from somewhere?
    A theme like yours with a feww simple adjustements would really
    make my blog jump out. Please lett mme know where you got your theme.
    Thanks a lot

    My weblog ... Browse Around This Site

    답글삭제
  11. What's up to all, it's really a good for me to pay a
    quick visit this site, it contains precious Information.

    My web-site: http://www.freshseocompany.com

    답글삭제
  12. 들을 수록 명강의이네요.. 잘 보고 있습니다..

    답글삭제
  13. 작성자가 댓글을 삭제했습니다.

    답글삭제
  14. 혼자 생성자때문에 고민하고 또 고민하던 참에 이 글을 우연히 보게 됐어요 예제만 10번은 정독한거같은데 비로소 이해가 됐습니다. 어떻게 보면 전부 편의를 위해 만들어진거네요?!

    답글삭제