생성자

김민성·2022년 7월 14일
0

Java

목록 보기
13/47
post-thumbnail

생성자

  • 생성자는 객체가 생성될 때 호출되는 '객체 초기화 메서드'이다.

  • 생성자의 조건

    • 생성자의 이름은 클래스의 이름과 같다.
    • 주소값을 내부적으로 리턴하고 있기 때문에 리턴을 직접 할 수 없다.
  • 생성자의 목적

    • 객체화의 목적 : 클래스의 필드를 똑같이 복사해서 메모리에 할당해주고 할당된 필드의 주소값을 가지고 온다. 이 주소값을 객체에 담아놓고 사용한다.
    • 초기화의 목적 : 생성자는 호출시 내부의 내용을 모두 수행한다.
    public class Main {
    	public static void main(String[] args) {
    		Data d1 = new Data();
    		
    		System.out.println(d1.i);			// 5
    		System.out.println(d1.str);			// 자바
    		System.out.println(d1.isChanged);	// false
    		
    		Data d2 = new Data(9, "파이썬");
    		
    		System.out.println(d2.i);			// 9
    		System.out.println(d2.str);			// 파이썬
    		
    	}
    }
    
    class Data{
    	int i;
    	String str;
    	boolean isChanged;
    	
    	Data(){
    		i = 5;
    		str = "자바";
    		isChanged = false;
    	}
    	
    	//오버로딩
    	Data(int x, String y){
    		i = x;
    		str = y;
    	}
    }

    위의 코드를 보자. Data 클래스에는 각각 i, str, isChanged 라는 인스턴스 변수와 오버로딩된 Data 생성자가 있다.

    main 메서드에서 Data 타입의 객체 d1을 생성했다. 생성할 때 new Data(); 로 매개변수를 넘겨주지 않았으므로 매개변수가 없는 첫 번째 Data 생성자가 호출될 것이다. 첫 번째 Data 생성자가 호출 되면 i에 5를, str에 "자바"를, isChanged에 false를 할당해 초기화할 것이다. 따라서 각각의 변수들을 출력해보면 초기화한 값대로 잘 나오는 것이다.

    다음에 Data 타입의 객체 d2를 생성한다. 생성할 때 new Data(9, "파이썬"); 로 매개변수를 넘겨주었으므로 매개변수가 있는 두 번째 Data 생성자가 호출될 것이다. 두 번째 Data 생성자가 호출되면 i에 매개변수로 넘겨준 값 9를, str에도 매개변수로 넘겨준 값인 "파이썬"을 할당할 것이다. 따라서 i와 str을 출력해보면 할당된 값이 잘 나오는 것이다.

this(), this

  • 오버로딩된 생성자간에도 서로 호출이 가능한데, 이 때 this() 를 사용한다. 사용할 때 반드시 생성자의 첫 줄에서 사용되어야 한다.

    public class Main {
    	public static void main(String[] args) {
    		Data d1 = new Data();
    		System.out.println(d1.age);			// 5
    		System.out.println(d1.name);		// "자바"
    		
    		Data d2 = new Data(10);
    		System.out.println(d2.age);			// 10
    		System.out.println(d2.name);		// "파이썬"
    		
    		Data d3 = new Data(15, "C++");		
    		System.out.println(d3.age);			// 15
    		System.out.println(d3.name);		// "C++"
    	}
    }
    
    class Data{
    	int age;
    	String name;
    	
    	Data() {
    		this(5, "자바");
    	}
    
    	Data(int age){
    		this(age, "파이썬");
    	}
    	
    	Data(int age, String name) {
    		this.age = age;
    		this.name = name;
    	}
    }

    위의 코드에서 Data 클래스를 보면 오버로딩된 생성자가 세개가 있다. 먼저 매개변수가 없는 첫 번째 생성자를 살펴보면 this(5, "자바"); 로 매개변수를 두개 가지고 있는 세 번째 생성자를 호출하고 있다. 따라서 main메서드에서 d1 객체 생성 후 age와 name을 출력해보면 5와 "자바"가 출력이 되는 것이다.

    매개변수를 하나만 가지고 있는 생성자를 보면 이 역시 this(age, "파이썬"); 으로 매개변수를 두개 가지고 있는 생성자를 호출하고 있다. 따라서 main 메서드에서 매개변수로 10을 넘기는 d2 객체를 생성하면 10과 "파이썬"이 잘 출력이 되는 것이다.

    세 번째 생성자에서도 this가 사용되고 있지만 이는 앞서 언급된 this와는 전혀 다른 개념이다. 여기서 this.age 는 객체 자신의 인스턴스 변수 age를 뜻한다. this.name 역시 객체 자신의 인스턴스 변수 name을 말한다. 따라서 this()와 this를 잘 구별해서 써야한다.

  • this()와 this의 구별

    • this() : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
    • this : 객체 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있고, 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재한다.

0개의 댓글