생성자

객체가 생성될때 맨 처음 자동으로 호출되는 특수한 메서드.

사용자가 생성자를 선언해주지 않아도 자동으로 컴파일러가 디폴트 생성자를 만들어서

객체(=인스턴스) 생성 시, 기본 생성자를 호출한다 

단, 입력인자가 있는 생성자가 이미 존재한다면 자동으로 기본 생성자가 만들어지지 않으므로 

직접 기본생성자를 작성해줘야 에러가 발생하지 않는다

처음 생성되는 생성자는 객체를 생성해야 가능하지만 두,세번째 생성자는 처음 생성자를 통해

임의로 호출할 수 있다

 

형식

: 생성자 이름은 클래스명과 같다

: 반환형은 사용하지 않는다

: 접근제한자는 사용 가능하다(쓰지 않았을 경우 default임)

 

java에서 데이터를 저장시키는 방법

1. 일반적인 방법(객체명.멤버변수명) => 엉터리 값을 막을 방법 x 

2. 캡슐화를 통한 값 저장(setter, getter) => 올바른 값만 제한하여 저장 가능

3. 생성자를 통한 값 저장

 

 

setter/getter method  vs  생성자

공통점 멤버변수에 데이터를 저장
차이점 setter / getter method  객체 생성할때만 호출이 되는 특성, 한번에 많은 양의 데이터를 초기화할때 사용
생성자 중간에 데이터를 수정할 때 사용

 

class Person{
	//1. 멤버변수(private)
    //-> 생성자만들수 있는 갯수(2^2=4)=> (),(name),(age),(name,age)
	//name,age의 순서가 바뀐 경우의 메소드는 같은 경우라 생각
    //name,age의 자료형이 같다면 식별할 수 없으므로 하나의 입력인자만 사용가능하다
	private String name;
	private int age;
	
	//2.생성자위치
	//저장할 공간이 만들어지고 바로 값을 저장시키고자 할때 사용함(한꺼번에!)
    Person(String n, int a){
      name=n;
      age=a;
      System.out.println("name="+name+", age="+age);
    }
	//setter, getter
	public void setName(String n) { name=n;}
	public void setAge(int a) {
		if(a<0) {System.out.println("음수안댕");
		age=23; 
		return;}
		age=a;}
	
	public String getName() {return name;}
	public int getAge() {return age;}
	
	public void print() {
		System.out.println("==========");
		System.out.println("이름=>"+name);
		System.out.println("나이=>"+age);
	}
}

public class PersonHandling {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1 = new Person("김철수",23);
		p1.print();
		p1.setAge(28);//수정
		p1.print();//바뀐값 확인!
	}
}
/*
name=김철수, age=23
==========
이름=>김철수
나이=>23
==========
이름=>김철수
나이=>28 */

 

생성자는 단순 값을 저장, 초기화 하기 위해서만 사용하지는 않는다

메서드 호출목적으로도 사용된다

public class PrintTest {

	//생성자 오버로딩
	//기본 생성자를 만들지 않고 매개변수 있는 생성자만 만듦
	PrintTest(char a) {
		this.print(a);
		//this가 생략되어있음
		/* 생성자내부에서는 자기클래스 객체명을 사용하지 않는다
		생성자(일반메서드)가 자기 클래스의 다른 일반메서드를 호출할때는 
		객체명.메서드명이 아닌 메서드명으로 호출한다.
		다른 클래스의 객체는 객체명을 생략할 수 없다 */
		System.out.println("char 매개변수값을 받아서 처리함");
	}
	PrintTest(int a) {
		print(a);
		System.out.println("int 매개변수값을 받아서 처리함");
	}

	//메소드 오버로딩 
	void print(char a) {
		System.out.println("a=>"+a);
	}
	void print(int a) {
		System.out.println("a=>"+a);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
		//PrintTest p1= new PrintTest();-> 에러발생함
		/*자기 클래스 내부에 다른 생성자가 존재하면
		 *기본생성자를 자동으로 만들어 주지 않는다.
		 *직접 기본생성자를 작성해야 에러가 발생하지 않는다      
		 */
		PrintTest p2= new PrintTest('v');
		PrintTest p3=new PrintTest(2021);
	}
}
/*
a=>v
char 매개변수값을 받아서 처리함
a=>2021
int 매개변수값을 받아서 처리함 */

 



+ Recent posts