ajax로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

ajax로 검색한 결과
등록일:2008-03-12 11:12:11
작성자:
제목:생성자 (Constructor) 그리고 this 예약어


생성자 (Constructor) 그리고 this 예약어 JAVA

2007/07/01 17:44

복사 http://blog.naver.com/nirvana200/140039555588

생성자는 클래스로부터 객체가 생성될 때 객체의 초기화 과정을 기술하는 특수한 메소드이며

객체가 생성될 때 무조건 수행된다.

단, 생성자는 객체가 생성될 때 한번만 수행된다는 특징을 가지고 있다.

생성자는 프로그램에 의해 명시적으로 호출되지 않고 객체를 생성하는 new 연산자에 의해 자동으로 실행된다.

따라서 위의 코드에서 10번,11번행에서 default생성자가 실행되어 int형의 멤버변수a는 0으로 초기화해주며

String형의 멤버변수b는 null으로 초기화해준다.

(생성자의 꼬라지를 확실하게 알고 넘어가자 void 요런거 오면 안된다. 무조건 클래스이름() 이다. 물론 public 은 상관없다.)

 

이렇게 생성자 메소드가 없는 경우에는 default생성자메소드가 멤버변수들을 초기화해주며

만약 생성자메소드를 하나라도 정의해줄 경우 default생성자메소드는 수행되지 않는다.

위에 그림 51행에서 mybox1 객체가 선언되고 생성될때 34행의 Box생성자가 자동 실행되어 3개의 매개변수를 전달받아

각각의 값을 멤버변수로 초기화해준다.

이렇게 생성자를 하나라도 생성했을 경우 객체를 생성시에 생성자에 맞게 매개변수를 던져줘야한다.

위에 경우에는 꼭 3개를 던져줘야 생성자가 받아서 초기화를 해줄수있다.

허나 내가 2개를 던저주거나 1개를 던저주거나 아님 하나도 던저주지 않을 경우에는 어떻게 해야하나...

해답은 바로 오버로딩(Overloading)이다.

같은 클래스에 같은 이름의 메소드를 중첩하여 사용하며 중첩된 메소드들은 매개변수의 타입과 개수를 달리 가져야한다.

즉, 하나의 메소드 이름으로 다양한 연산을 수행할 수 있는 방법을 제공한다.

 

                객체지향 언어의 특징 중에 하나인 다형성(Polymorphism)


 

생성자도 역시 메소드 이며 이 오버로딩을 활용하여 다양한 객체초기화를 해줄수있다.

한가지 주의할 것은 생성자를 하나라도 만들었다면 default생성자는 절대 실행되지 않는다.

자료형에 맞는 기본값으로 초기화를 원한다면

public Box()

{

}

이런식으로 해주면 default생성자와 같이 기본값으로 초기화해준다.

 

this 예약어

현재 사용중인 객체를 의미한다. 일반적으로 생성자나 메소드의 매개변수가 객체 변수와 같은 이름을 사용하는 경우에

this를 사용하게 된다.

 
16행에서 width = width;  라고 해줬을 경우 중괄호안에서 선언된 변수(매개변수,지역변수)는
우선순위가 객체참조변수(멤버변수)보다 높다. 따라서 매개변수 width를 다시 width에 넣고 있는 꼬라지가 되어버린다.
이럴경우 this.width 라고 해서 객체참조변수를 의미하게 해줄수있다.
물론 매개변수와 객체변수의 이름이 같지 않을 경우에는 필요가 없다. 허나 변수명을 의미있는 이름으로 사용하는 것이
좋은 프로그래밍 작성 요소 중의 하나이다.
 
그리고 this 예약어는 같은 클래스내의 다른 생성자 메소드를 호출하는 경우에도 사용할수있다.
 
 
this() 호출의 제한
 
1. 생성자의 실행은 다른 처리보다 우선적이므로 this() 는 블록{}안에서 맨 위에 있어야한다.
public Box(String s)
{
      System.out.println(s);
      this(...);         // 에러, 생성자의 실행은 다른 처리보다 우선적이다.
}
 
2. 일반 메소드는 객체를 생성한 후에 사용하는 메소드이므로 this()를 일반 메소드에서 호출할 수 없다.
생성자는 객체를 생성하기 위해서만 사용되기 때문이다.
 
void method()
{
       this(...);   // 에러
}
 
마지막으로 생성자와 같이 멤버 변수를 초기화할 수 있는 다른 방법이 있다.
클래스를 정의할 때 멤버 변수에 값을 대입하면 객체가 생성될 때 멤버 변수에 그 값이 대입된다.

일반 멤버 변수는 객체를 만들어야만 메모리를 할당한다고 알고있다. 그런데 3행의 멤버변수 a는 메모리에 존재하지

않으므로 a에 값을 대입할 수 없지 않은가? 물론 대입할 수 없다. 그렇다면 어떻게 해석해야 옮을까?

int a=10; -> 나중에 객체를 만들면 a에 10을 대입하라. (쉽게 생각하자 ㅋㅋ)

 

이거만 알아두고 마무리 짓자

 

C++ 에서는 클래스의 멤버변수를 초기화 할수 없단다.

"멤버 변수는 객체를 만들어야만 존재한다. 따라서 없는 변수에 값을 대입할수 없다"

 

그러나 우리의 자바는 "나중에 객체가 생길 때 대입하면 된단다.... 굉장히 유연성이 좋다?