ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 생성(Constructor)
    언어/JAVA 2022. 9. 7. 17:43

    -클래스의 객체가 생성될 때 멤버필드의 초기화를 위해서 사용되는 메소드

    -각각의 객체가 생성될 대 서로 다른 메모리를 가지는 객체를 생성할 수 있게 함

    특징

    1. 멤버메서드임(특별한 멤버메서드-처음객체생성시만 호출, 중간에 호출되지 않음)

    2. 클래스의 이름과 동일한 이름을 갖는 메서드

    3. 리턴값이 없는 메서드

    4. 따로 정의(생성)하지 않아도 이미 클래스 내부에 존재하는 메서드

    5. 생성자는 각각의 객체가 생성될 때마다 호출되는 메서드

    6. 주로 하는 일은 new와 함께 객체가 저장될 HEAP 메모리를 할당하고 그 안에

    멤버 변수를 만드는 일을 함

    class AClass{
    	private int age;
    	// 필요에 따라 숨어있는 생성자를 꺼내놓고 메모리 확보하는 동작 외에 
        // 다른 일을 시킬 수 있음
    	AClass(){
    		System.out.println("AClass");
    		age=100;
    	}
    	public int getAge() {return age;}
    	public void setAge(int age) {this.age = age;}
    }
    public class Constructor {
    	public static void main(String[] args) {
    		AClass a=new AClass(); 
            // 생성자 메서드 호출 동작이 포함되어 있음
    		AClass b=new AClass();
    		// 객체가 만들어질때만 호출되기 때문에 
            // 다른 메서드처럼 호출객체와 함께 사용되지 않음
    		// a.AClass(); ->error
    		System.out.println("age: "+b.getAge());
    	}
    }
    ​

     

    -앞선 예제와 같이 클래스 내부에 생성자를 꺼내어 따로 정의하지 않으면 컴파일러는 자동으로 클래스 내부에 숨어 있는 생성자(디폴트 생성자)를 호출함.

    -디폴트 생성자: BClass(){}와 같이 생겨서 기본 형태만 설정된 생성자.

    -아래와 같이 내용 없이 생성자를 따로 정의하는 것은 따로 생성자를 아예 기술하지

    않는 것과 같음.

    class BClass{
    	private int age;
    //	BClass(){
    //	} // default constructor
    // 생성자도 리턴값만 없을뿐, 메서드이므로 매개변수를 사용할 수 있음
    // 생성자의 매개변수를 활용하는 경우 각각의 객체마다 
    // 서로 다른 값을 가질 수 있음
    	BClass(int a){
    		this.age=a;
    	}
    	public int getAge() {return age;}
    	public void setAge(int a) {this.age = a;}
    }
    public class Constructor {
    	public static void main(String[] args) {
    		// BClass b=new BClass();
    		// 별도의 생성자가 없으면
    		// 컴파일러가 클래스 내부에 숨어 있는 "디폴트 생성자"를 호출함
    		BClass b1=new BClass(40);
    		BClass b2=new BClass(50);
    		System.out.println("b1객체의 age 변수값: "+b1.getAge());
    		System.out.println("b2객체의 age 변수값: "+b2.getAge());
    	}
    }
    class Cclass{
    	private int age;
    // 생성자는 메서드이므로 매개변수를 사용할 수 있음
    // 1. 생성자의 매개변수를 활용하는 경우 
    //    각각의 객체마다 서로 다른 값을 가질 수 있음
    	Cclass(int a){
    		age=a;
    	}
    // 5. 생성자 메서드 오버로딩을 통해 없어진 디폴트 생성자 문제를 
    //    해결할 수 있음
    	Cclass(){age=40;};
    	public int getAge() {return age;}
    	public void setAge(int a) {age=a;}
    }
    public class Constructor {
    	public static void main(String[] args) {
    // 2. 생성자에 전달인수를 만들고 다른 값을 전달하여, 
    //    객체마다 멤버변수의 초기값을
    // 	  객체 생성과 동시에 달리 하여 시작할 수 있음
    		Cclass c1= new Cclass(20);
    		Cclass c2= new Cclass(30);
    		// Cclass c3=new Cclass(); ->error
    // 3. 클래스 내부에 매개변수를 갖든 안 갖든 생성자가 꺼내어지고 
    //    정의가 되면 숨어있던 디폴트 생성자는 꺼내어지면 
    //    새로 정의된 생성자로 숨어있던 생성자가 대체되고 없어짐
    // 4. 위 클래스의 경우 디폴트 생성자가 없어졌으므로 위 해당 명령은 오류
    // 6. 디폴트 생성자가 생겼으므로 아래는 정상 실행됨
    		Cclass c3=new Cclass();
    	}
    }
    class DClass{
    	public DClass() {
    	}
    	public DClass(int i) {
    		System.out.println(i);
    	}
    	public DClass(double d) {
    		System.out.println(d);
    	}
    }
    public class Class12 {
    	public static void main(String[] args) {
    		DClass d1=new DClass();
    		DClass d2=new DClass(10);
    		DClass d3=new DClass(10.23);
    		//위 와 같은 실행이 가능하도록 DClass의 생성자들을 만들어
    		//생성자에서는 각각 어떤 매개변수가 있는 생성자인지 출력되게 코딩
    		
    		// ex) DClass d1=new DClass(); 
            //    -> DClass 클래스의 디폴트 생성자 호출
    		// ex) DClass d2=new DClass(10);
    		//	  -> DClass 클래스의 int 타입 매개변수를 갖는 생성자 호출
    		// ex) DClass d3=new DClass(10.23); 
    		//	  -> DClass 클래스의 double 타입 매개변수를 갖는 생성자 호출
    	}
    }

    '언어 > JAVA' 카테고리의 다른 글

    [JAVA] Static  (0) 2022.09.07
    [JAVA] This  (0) 2022.09.07
    [JAVA] 접근지정자(AccessModifier)  (0) 2022.09.07
    [JAVA] Class  (0) 2022.09.07
    [JAVA] Overloading  (0) 2022.09.07

    댓글

Designed by Tistory.