상세 컨텐츠

본문 제목

자바 생성자에 대해 알아보자

관리X 과거글

by 까먹기전에 2014. 10. 29. 16:07

본문

반응형

생성자란? 생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.

인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용됨


인스턴스 초기화 = 인스턴스 변수 초기화


생성자 역시 메서드처럼 클래스내에 선언되며, 구조도 메서드와 유사하지만 리턴값이 없다.


그렇다고 앞에 void를 쓰지도 않는다.


생성자는 클래스 이름과 완전히 동일 해야한다.


생성자는 리턴값이 없다.


**생성자도 오버로딩이 가능하므로 하나의 클래스에 여러개의 생성자가 있을수 있다.


생성자도 메서드이기 때문에 리턴값이 없다는 의미의 void를 적어야하지만 모든생성자는 리턴값이 없기때문에

void는 생략한다고 생각하자.


Car car = new Car() 로 인스턴스 초기화가 이루어지면


class Car{


Car(){} // 생성자

}


연산자 new가 ///////    인스턴스 Car()를 생성하는것이지,

생성자Car()가{} ///////인스턴스Car()를 생성하는것은 아니다.


몇가지 특성을 제외하면 메서드랑 같다.


Car car = new Car();


연산자 new에 의해서 메모리(heap)에 Car 클래스의 인스턴스가 생성된다.


연산자 new의 결과로, 생성된 Car인스턴스의 주소가 반환되어 참조변수 car에 저장된다.


///////////////기본 생성자///////////////


클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 기본 생성자 덕분이었다.


Car(){ } <-- 이게 클래스에 자동으로 생성된다.


인스턴스 초기화 작업이 요구되어지지 않으면 직접 정의하지 않고 컴파일러가 제공하는 기본 생성자를 사용하는 것도 좋다.

(기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을때뿐)

만약에 클래스가 public 이면 기본생성자도 public 이 붙는다.


만약에 Car car = new Car() 할때 Car 클래스에 Car(String color){ } 라고 선언시 기본생성자인 Car() { } 가 생성되지 않는다.


//////////////////////매개변수가 있는 생성자///////////////////////////


Car car = new Car();

car.color = " red ";

car.type = " kia ";

car.door = 4;

만약 이렇게 하면 엄청 길다 하지만 이것들을 한줄로 줄인다면 


Car car = new Car("red","kia",4); 이렇게 할 수 있다.


그러면 멤버변수를 3개 선언한뒤, 생성자Car에서 매개변수 3개를 멤버변수에 넣을 수 있다.


///////////////////////////생성자에서 다른 생성자 호출 하기 /////////////////////////////


생성자의 이름으로 클래스이름 대신 this를 사용한다.

한 생성자에서 다른 생성자를 호출 할때는 반드시 철 줄에서만 호출이 가능하다.


Car(){

this("red","kia",4);

}


이렇게 하면 매개변수의 타입과 갯수가 알맞은 Car(String a , String b , int c) 를 불러 올수 있다.


첫줄 사용이라는거는 말 그대로 생성자 안에 this()를 제일 처음으로 써야한다. 구분은 매개변수!


this - 인스턴스 자신을 가맄키는 참조변수, 인스턴스의 주소가 저장되어 잇다.

모든 인스턴스 메서드에 지역변수로 숨겨진채로 존재한다. 

매개변수값을 멤버변수에 넣어야하는데, 이름이 같다면 this.a=a; 이런식으로 쓴다. this는 자신을 부른 현재주소를 생각하면 된다.


this.a = a

인스턴스변수 / 매개변수

(멤버변수)

이렇게 보면 된다.


/////////////////////////////////생성자를 이용한 인스턴스의 복사 /////////////////////////////////


Car car1 = new  Car();

Car car2 = new Car(c1);


로 선언한뒤 c1의 멤버변수 값을 변경 하면 어떻게 될까?


만약 멤버변수 a=10 , b=20 인데 c1.a=50 으로 값을 변경한다면?


c1을 출력 할때는 50 , 20이 나오지만 c2를 출력하면 그대로인 10,20이 나온다


그 이유는 ? car2는 car1을 복제하여 생성된거지만 각각 독립되어있다(메모리공간이 다름)


그래서 c1의 값을 아무리 변경해도 c2의 복제할때 값은 그대로 유지된다.


그럼 Car car1 = new Car();

car1.a=50; // 미리 변경한뒤 옴기는건?

      Car car2 = new Car(c1);

라고 생각할수있겠지만, 이러면 의미가 없다.

미리 복제 해놓은상태로 값변경의 상태가 중요하지, 값변경해서 복제하면 당연히 car2의 값도 달라질것이니..









관련글 더보기