생성자(constructer), this

최혜원·2023년 5월 25일
2

JAVA

목록 보기
2/5
post-thumbnail

📍생성자(constructer)-클래스에 있는 속성값을 초기화 시켜주는 기능

  • 객체가 생성될 때 가지고 있어야 할 기본값(객체초기화값)이나 수행될 코드를 정의하는 method의 일종
  • 반환형이 없다
  • Overload를 지원(객체 생성을 다양하게 할 수 있다.)
  • 생성자명은 클래스명과 동일하게 작성
  • 개발자가 생성자를 하나도 정의하지 않으면 Colpile가 매개변수 없는 기본 생성자 Default Constructer를 생성해준다.(기본 생성자의 접근지정자 class의 접근지정자명 따라감)
  • 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
  • 객체 생성할 때만 호출된다.(method 호출하듯이 직접 호출할 수 없다.)
  • this를 사용하면 내 클래스의 다른 생성자를 호출할 수 있다.

    접근지정자 생성자명(parameter,,,){
    public : 클래스 외부에서 객체 생성 가능
    protected : 동일 패키지의 다른 클래스에서 객체 생성 가능  
                         패키지가 다르다면 자식 클래스만 객체 생성 가능 
    private : 클래스 안에서만 객체 생성 가능 (signletom pattern)
    default : 동일 패키지의 다른 클래에서 객체 생성 가능
                   패키지가 다르다면 객체 생성 불가능


📍this() - 생성자에서 다른 생성자 호출하기

  • 생성자를 호출하거나, heap주소(생성된 객체의 주소)를 가지는 keyword

  • method(생성자를 호출할 때)형식과 keyword(생성된 객체(instance변수)의 주소를 사용할 때)형식으로 사용

  • method 형식 : 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

    · 내 클래스의 overloading 된 생성자를 호출할 때

    · 규칙 : 생성자의 첫번째줄에서만 사용 가능

    · 문법 ) this();//매개변수 없으니까 기본생성자 호출

                this(인수값);//인자있는 생성자 호출할 때

  • method 형식 :

    · 생성된 객체(heap에 올라감)의 주소를 저장한 keyword

    · static(객체 생성 전)영역 안에서는 사용할 수 없다. instance영역에서만 사용가능

    · 문법) this.변수명

               this.method명();//변수를 쓰거나 method를 쓸 때

 public class Test{

            public Test(){
            this(11);//기본생성자에서 인자있는 생성자 부름
            }//instance(Test t=new Test();)로 돌아가

            public Test(int i) {
            this();//기본생성자불러 기본생성자일처리하고 인자있는 생성자로...(재귀호출 에러)
            this(20);//재귀호출 에러(나를부름)
            }//호출한 곳으로 돌아가라


Test t=new Test();
Test t=new Test(10);//인자있는 생성자만 호출하고 돌아감
   class Test() {
                
            int i;//instance변수  parameter(지역변수)   =>변수명이 같으면 지역변수부터
            public void temp(int i,Test t) {
                sop(i);//1000
                t.i=i;//지역변수로감
            }
            public static void main(String[] args){//main method가장먼저실행
                Test t =new Test();
                t(생성된 t의주소 같다).temp(1000,t(넘겨준t의주소));
                sop(t.i);//0

            }
------------------------------------------------------------------------------
  class Test() {
                
            int i;//instance변수  parameter(지역변수)   =>변수명이 같으면 지역변수부터
            public void temp(int i,Test t) {
                sop(i);//1000
                    this.i=i;//instance 
            }
            public static void main(String[] args){//main method가장먼저실행
                Test t =new Test();
                t(생성된 t의주소 같다).temp(1000,t(넘겨준t의주소));
                sop(t.i);//0

            }
        this : method를 호출하는 객체의 주소로 변경되는 keyword
package day0525;

/**
 * method를 호출하는 객체의 주소로 변경되어 사용되는 this.
 */
public class ThisKeyword {
	int i;//instance변수
	/**
	 * parameter의 이름과 instance변수의 이름이 같을 때 
	 * this를 사용하지 않고 parameter의 값을 인스턴스 변수로 저장할 때
	 */
	public void useInstance(int i, ThisKeyword t) {
		t.i=i;//t.i=instance변수/ parameter 변수(stack)의 값을 instance변수(heap)에 할당하겠습니다.
		System.out.println("전달받은 객체"+t);
	}//useInstance
	/**
	 * 파라메터의 이름과 인스턴스변수의 이름이 같을 때마다 객체를 넘기고 
	 * 받아서 사용하려면 코딩시 불편함이 따라온다. 개선하기 위해 this가 제공
	 * @param i
	 */
	public void useThis(int i) {
		//this는 method를 호출하는 객체의 주소로 변환되는 키워드/this=tk
		//매개변수로 객체를 받을 필요가 없다.(ThisKeyword t 필요없음!)
		this.i=i;
		System.out.println("method를 호출한 객체의 주소 :"+this);
	}//useThis
	
	public static void test() {
//		this.i=10; //static method안에서는 this keyword를 사용할 수 없다.
		System.out.println("static method");
	}
	public static void main(String[] args) {
		ThisKeyword tk = new ThisKeyword();
		System.out.println("생성된 객체"+tk);
		tk.useInstance(300, tk);	
		System.out.println("전달한 객체의 인스턴스 변수의 값"+tk.i);
		System.out.println("=================================================");
		tk.useThis(900);//instance
		System.out.println("this를 사용하여 변경한 인스턴스변수의 값"+tk.i);
		
		ThisKeyword.test();//static
		
	}//main

}//calss
profile
어제보다 나은 오늘

0개의 댓글