본문 바로가기

app/java

java 생성자에 대한 고찰

재미있는 퀴즈를 내겠습니다.


public class  typetest {


public static void main(String[] args) {

typetest tt = new typetest();

}

public void typetest(){

System.out.println("void");

}

public typetest(){

System.out.println("null");

}

}


1. 위의 소스를 컴파일 한다면 에러나 날까요?

2. 만일 에러가 안난다면 결과값은 무엇일까요?


생각해 보셨나요?  아래의 정답과 비교해 보시기 바랍니다.


1번 물음은 클래스안에 똑같은 함수의 이름이 두개가 있습니다. 물론 오버로딩도 오버라이딩도 아닙니다.

단지 리턴표시만 다름니다. 어떻게 컴파일이 가능할까요?


먼저 생성자에 대해서 생각해봅시다. 생성자의 생성 규칙은 무엇일까요?  접근제한수식어인 public, protected, private는 사용가능하지만 static, final, synchronized 등의 수식어는 사용불가능합니다. 이는 접근제어를 통한 인스턴스를 할수 있지만 생성자는 해당 클래스의 고유한것으로 상속할수 없으므로 static, final 등은 사용이 불가능합니다. 또한 리턴값이 허용되지 않습니다. 


그렇다면 아래 보기중 생성자는 어떤것일까요?

1. public void typetest(){}

2. public typetest(){}


네 정답은 위의 첫번째 질문에서 2번 문항의 답과 같습니다. 2번입니다.

여기서 생각해야 될것은 void 는 리턴값이 없다는것을 나타내는 클래스입니다.(하지만 객체로 만들수 없습니다. API참조.) 함수 앞에 boolean, int, string 등 리턴값이 없을때 나타내는 값이 void 입니다. "이 함수는 리턴값이 없어!" 라는 예약어와 같습니다. 만일 함수 앞에 리턴을 표기 하지 않는다면 에러가 발생하게 됩니다.


 다시 의문이 듭니다. 앞에서 "리턴을 표기 하지 않는다면 에러가 발생하게 됩니다."라고 했습니다. 그렇다면 "리턴값이 없는 생성자는 함수인가?" 라는 의문이요. 

 이번엔 함수의 정의에 대해서 생각해 봅시다. 함수란 일정한 파라미터가 들어갔을때(파라미터가 없는것도 포함) 리턴값이 있는것을 함수라 합니다. 또한 객체지향언어에서는 오버라이딩이 가능하며, 정적메소드,synchronized (동기화)가 가능합니다. 또한 함수는 접근가능한곳에서 몇번이고 불러올수 있습니다.

 결국 생성자는 함수가 아닙니다. 그냥 흘러가는 , 무조건 표기되어야 하는 코드라 생각하면된다. (무조건이란말은 우리가 생성자를 작성하지 않아도 컴파일러가 자동으로 생성해 줍니다.) 변수의 초기화 및 선행되어야 하는 행동에 해서 보기 쉽게 묶어 놓은 코드덩어리 라 생각하면 됩니다.


 마지막으로 처음의 코드에 대해서 설명드리겠습니다. 클래스와 이름이 같은 void 형 함수 하나와 생성자 하나로 이루어진 클래스입니다. void 형 함수로 오버라이딩 또한 가능합니다.(한번 실습해 보세요.) 

 void 는 리턴값이 없다는것을 알려준다는 예약어라는것. 생성자는 함수가 아니라는것. 그리고 생성자가 아니더라도 함수 이름은 클래스와 똑같이 표기 가능하다는것을 기억해주시기 바랍니다. 




- 만일 

  public void typetest(){

System.out.println("void");

 } 

 이함수를 호출해야 겠다면? tt.typetest(); 로 불러오면됩니다.


- 아마 C를 먼저 배우신 분들은 이문제를 저와 같이 헷갈렸을 겁니다. c에서는 void* v; 이런 형식으로 선언 가능하지만 java 에서는 void 자체는 인스턴스화를 하지 못합니다.

  http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html api를 보면 함수리턴에 대한 명시 일뿐 다른 기능이 전혀 없다.


- 솔직히 void를 쓰고 생성자라 생각하고 진행하다가 하루동안이나 프로그램이 실행되지 않아서 끙끙댔습니다. 생성자라고 생각했던 놈이 함수였던 것이지요.  결론은 기초를 튼튼히 하자.