자바

JAVA 자바 클래스 기본 생성자 , 생성자 선언, 필드 초기화

알통몬_ 2017. 3. 12. 19:18
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

생성자 : new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당

객체 초기화 : 필드를 초기화하거나 메서드를 호출해서 객체를 사용할 준비를 하는 것. 

생성자의 실행 없이 객체 생성은 불가능.


기본 생성자

 클래스는 생성자가 반드시 존재하고, 여러 개가 있을 수 있다. 

클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본 생성자를 자동 추가.

[public] 클래스() { }

 클래스에 생성자를 선언하지 않아도 자동적으로 기본 생성자가 생성되기 때문에

ClassName name = new ClassName(); 이 가능한 것입니다.

                            기본 생성자

클래스에 개발자가 생성자를 한개라도 선언했다면 기본 생성자는 생성되지 않습니다.


생성자 명시적 선언

 클래스(매개변수선언,...){

   //객체의 초기화 코드

}

메서드와 모양이 비슷하지만 리턴타입이 없고 클래스와 이름이 동일. 

매개변수 선언은 생략할 수도 있고, 여러개를 선언해도 됩니다. 

매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할.

ex)

  public class Car{

     Car(Sting name, String color, int speed){...}

}


클래스에 생성자가 명시적으로 선언되어 있을 경우

반드시 선언된 생성자를 호출해서 객체를 생성 해야함.

생성자 선언과 객체생성 예제)

예제1)

public class Car {

//생성자

Car(String color, int cc) {

}

}


예제2)

public class CarExample {

public static void main(String[] args) {

Car myCar = new Car("검정", 3000);

//Car myCar = new Car();  (x)

}

}



필드 초기화
클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정됩니다.
만약 다른 값으로 초기화하고 싶다면 두가지 방법이 있습니다. 
-필드를 선언할 때 초기값을 주는 방법
-생성자에서 초기값을 주는 방법
필드를 선언할 때 초기값을 주면 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 갖게 됩니다.
객체 생성 후 변경할 수 있지만 객체 생성 시점에는 필드의 값이 모두 같습니다.
ex) 
 public class Korean {
   String nation="대한민국";
   String name;
   String ssn;
}
  Korean k1 = new Korean();
  Korean k2 = new Korean();
  k1과k2 객체의 nation필드에는 모두 "대한민국" 이 저장되어 있습니다.

 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화를 해야 합니다.
 위 코드에서 name 과 ssn 필드값은 클래스를 작성할 때 초기값을 줄 수 없고 
객체 생성시점에서 다양한 값을 가져야 합니다.
 따라서 생성자의 매개값으로 이 값들을 받아 초기화 하는 것이 맞습니다.
 public class Korean {
   String nation="대한민국";
   String name;
   String ssn;

  public Korean(String n, String s){
    name = n;
    ssn = s;
  }
}

예제)
public class Korean {
//필드
String nation = "대한민국";
String name;
String ssn;

//생성자
/*public Korean(String n, String s) {
  name = n;
  ssn = s;
}*/
public Korean(String name, String ssn) {
  this.name = name;
  this.ssn = ssn;
}
}
 
예제2)
public class KoreanExample {
public static void main(String[] args) {
Korean k1 = new Korean("박자바", "011225-1234567");
System.out.println("k1.name : " + k1.name);
System.out.println("k1.ssn : " + k1.ssn);
Korean k2 = new Korean("김자바", "930525-0654321");
System.out.println("k2.name : " + k2.name);
System.out.println("k2.ssn : " + k2.ssn);
}
}
 

매개 변수 이름이 너무 짧으면 가독성이 좋지 않기 때문에 
가능하면 초기화시킬 필드 이름과 비슷하거나 동일한 이름을 사용하는 것이 좋습니다. 
일반적으로 필드와 동일한 이름을 갖는 매개 변수를 사용합니다. 
필드와 매개 변수 이름이 동일하면 생성자 내부에서 해당 필드에 접근할 수 없습니다. 
동일한 이름의 매개 변수가 사용 우선순위가 높기 때문입니다. 해결 방법은 필드앞에 "this."을 붙이면 됩니다. 
public Korean(String name, String ssn) {
  this.name = name;
  this.ssn = ssn;
}

객체의 필드는 하나가 아니라 여러 개가 있고 이 필드들을 모두 생성자에서 초기화한다면
 생성자의 매개 변수의 수는 객체의 필드 수 만큼 선언되어야 합니다. 
그러나 실제로는 중요한 몇 개 필드만 매개 변수를 통해서 초기화되고 
나머지  필드들은 필드 선언 시에 초기화하거나 
생성자 내부에서 임의의 값 또는 계산된 값으로 초기화합니다. 
아니면 객체 생성 후에 필드값을 별도로 저장하기도 합니다.


반응형