Java/OOP

[Java] 생성자와 this(),this (객체지향 1-8)

codeStudy123 2022. 1. 13. 22:01

 

 

🎈 생성자 (Constructor)

 


 

생성자란 쉽게 말해 '인스턴스 초기화 메서드'라고 말할 수 있다.

 

생성자의 사용에 따라 코드가 얼마나 간결해지는지 보여주겠다.

 

public class Hello {
	
	public static void main(String[] args) {
		Price p =new Price();
		p.price=5000;
		p.name="세면도구";
		p.check=true;
	}
}

class Price{
	int price;
	String name;
	boolean check;
}

우리는 Price 클래스에 인스턴스 변수 3개를 사용하기 위해 참조 변수 p를 선언한 후 p.price, p.name, p.check로 인스턴스 변수를 초기화시켜주었다.

 

Price p2=new Price(1800, "과자", true);

하지만 이런 식으로 인스턴스 변수를 초기화시킬 수 있다, 

 

또 한 생성자는 인스턴스 초기화뿐 만 아니라 다른 작업도 가능하다. 메서드와 동일하다.

 

어떻게 사용하는지 자세히 알아보겠다.

 

 

 

사용 전, 생성자의 규칙은 숙지해야 한다.

 

1. 생성자의 이름이 클래스 이름과 같아야 한다.

 

2. 리턴 값이 없다. (void도 안 붙인다.)

 

3. 모든 클래스는 반드시 1개 이상의 생성자를 가지고 있어야 한다.

   (하지만 컴파일러가 생성자가 한 개도 없을 때 자동 추가해준다,)

 


 


기본 생성자


클래스 이름() {}

 

class Constructor{
	Constructor() {} //기본 생성자
}

 

 

 

class Tese1{
	int result;
}

class Test2{
	int result;
	Test2(int x){
		result=x;
	}
}

public class Hello {
	
	public static void main(String[] args) {
		Tese1 t1=new Tese1();
		Test2 t2=new Test2(); // compile error
	}
}

이 코드는 compile error가 발생한다.

Test 2 클래스는 한 개의 생성자가 있다. 하지만, 기본 생성자가 없어서 Test()를 못 찾는 것이다.

 

클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

 

Test1 클래스는 생성자가 1개도 없어서 컴파일러가 자동으로 기본 생성자를 추가해주어서 에러가 발생하지 않은 것이다.

즉, 생성자 1개도 없으면 컴파일러가 자동으로 기본 생성자 추가

 

 

 


매개변수가 있는 생성자


 

class Test{
	int result;
	String stro;
	Test(int x,String str){  //매개변수가 있는 생성자 메서드가 비슷
		result=x;
		stro=str;
	}
	Test(){} //기본 생성자
}

위에 코드처럼 기본 생성자와 매개변수 2개 있는 생성자이다. 두 생성자는 이름이 같지만 오버로딩이 되어서 이름은 같지만 다른 동작을 하는 코드인 것이다.

Test t=new Test(5000, "원혁");

서론에서 말했듯 인스턴스를 쉽게 초기화할 수 있다. (호출하는 쪽에서 손쉽고 간결하게 인스턴스 초기화 가능)

 


 

 

 

🎈 this(), this


 

생성자 this()

-생성자에서 다른 생성자를 호출할 때 사용.

-같은 클래스에서 생성자를 호출할 때 this() 사용 규칙.

-호출 시 첫 줄에서만 사용 가능.

 

 

class Mart{
	String str;
	long l;
	Mart(){
		this("생선", 10000);  //첫번째 줄
	}
	Mart(String name2){
		this(name2,15000); //첫번째 줄
	}
	
	Mart(String name,long price){
		str=name;
		l=price;
	}
}

 

한 마디로 같은 클래스 내에서 생성자 호출 시 Mart로 안 적고 this()를 사용한다. this()는 반드시 생성자 내부 맨 위(첫 줄)에 존재해야 한다.

 

 

 

 

참조변수 this

-인스턴스 자신을 가리키는 것

-인스턴스 메서드(생성자 포함)에서 사용 가능 (클래스 메서드에선 사용 불가능)

-지역변수와 인스턴스 변수 구별할 때 사용

 

 

class Mart{
	String str;
	long price;
	
	Mart(){
		this("간식",2500);
	}
	
	Mart(String str, long price){
		this.str=str;  //this.str=인스턴스 변수 str을 참조
		this.price=price;  //this.price= 인스턴스 변수 price를 참조
	}
	
}

 

 

 

public class Hello {
	
	public static void main(String[] args) {
		Mart m=new Mart();
		System.out.println(m.str+" "+m.price);
		Mart m2=new Mart("사탕",500);
		System.out.println(m2.str+" "+m2.price);
	}
}

class Mart{
	String str; // this.str
	long price; // this.price
	
	Mart(){
		this("간식",2500);
	}
	
	Mart(String str, long price){
		this.str=str;  //this.str=인스턴스 변수 str을 참조
		this.price=price;  //this.price= 인스턴스 변수 price를 참조
	}
	
}

 

사실 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재 즉, 모든 인스턴스 변수는 this를 숨긴 채로 같이 존재


 

 

 

 

 

 

 

 

🚀 이전 글 보기 (객체지향 1-7)