🔥 Vamos/Java

0929 | 자바의 정석 기초편 :: ch6-32~6-37

unikue 2022. 9. 29. 14:02

생성자 (constructor)

 

✔ 생성자

: 인스턴스가 생성될 때마다 생성되는 인스턴스(iv) 초기화 메서드

:인스턴스 생성시 수행할 작업 (iv초기화)에 사용

: 하는 일은 iv의 초기화. 초기화 편리하게 하려고 사용

 

Time t = new Time(); // 객체생성이자 생성자 사용

t.hour = 12; // 초기화

t.minute = 34;

t.second=56;

👉 Time t = new Time(12,34,56); // 생성자 추가하면 한줄로 표현 가능.

 

 

✔ 생성자 생성 규칙

: 메서드이므로 생성시 규칙이 있음

 

① 이름이 클래스 이름과 같아야 한다

② 리턴값이 없다 (void 안붙임, 대부분 대입문이다)

③ 모든 클래스는 1개이상의 생성자가 있어야 한다  Card c = new Card()<- 기본생성자. 컴파일러가 알아서 추가해줌 (단 클래스에 생성자가 하나도없을때)

Card 생성자 오버로딩 (같은 이름의 메서드가 한 클래스안에서 여러개로 정의됨)

 

✔ 기본 생성자

: 매개변수가 없는 생성자

: 생성자가 하나도 없을때에만 컴파일러가 자동 추가해줌

: 제대로된 클래스라면 항상 만들어주는게 기본 원칙.

 

클래스 이름 () {} // 기본생성자

Class point{

   point () { } } // point클래스의 기본 생성자

 

Class data1{
	int value;
    }
    
Class Data2{
	int value;
    
    Data2(int x){ // 매개변수가 있는 생성자 1개 존재
    	value = x;
    }

Class Ex{
	public static void main(String[]args){
    Data1 d1 = new Data1();	// Data1에는 생성자가 없어서 컴파일러가 자동 생성해준 생성자
    Data2 d2 = new Data2(); // error. data2() 기본생성자를 호출했으나 끌어올 생성자가 없음.
 } 
 
 // error msg: The constructor Data2 is undefined
 
 //따라서
 Class Data2{
	int value;
    
    Data2(int x){ // 매개변수가 있는 생성자
    	value = x;
        
    Data2(){}; // 직접 기본생성자 추가해줘야 메인메서드에서 쓸 수 있음.
    }

 

 

 

 

✔ 매개변수가 있는 생성자 (↔기본생성자)

: 여러줄 써야할 내용을 간소화

: 한번 틀을 만들어두면 쉽게 만들 수 있음

 

코드가 훨씬 깔끔해짐

Car (String color, String gearType, int door){

car c = new Car ("white","auto",4); }

중간에 문자 하나로 간소화한게 끼어있어서 그렇지 결국은 이런뜻.

 

 


 

 

생성자 this()

 

✔ this()

: 생성자에서 다른 생성자 호출할 때 사용

: 같은 클래스 안에 있는 생성자들 끼리 호출.
: 서로 호출하는 일이 많아서 코드중복 없이 this로 용이하게 함

:다른 생성자 호출 시 (생성자의) 첫줄에서만 사용 가능

 

Car (string color, String geartype, int door){}

Car (string color){

door =5;

this (color, "auto", 4);} // error 첫줄에서만 사용가능

 

왼쪽코드 = 기본생성자이므로 아무 지정도 없을시 하얀색 자동기어 문4개 차 객체 생성 오른쪽 코드처럼 만들어서 코드의 중복 제거

 

 

 

참조변수  this

 

✔ this

: 생성자 this()와 전혀 관계 없음

: 객체자신을 가리키는 참조변수

: 인스턴스 메서드(생성자 포함)에서 사용 가능

: lv와 iv를 구별할 때 사용 (가장 많이 쓰이는 케이스)

 

String color;	// 진짜이름은 this.color
String geartype;
int door;

Car(String c, String g, int d){
// color는 iv, c는 lv
color = c;
geartype = g;
door = d;
//원랜 iv는 참조변수.변수이름 이라 참조변수명이 붙어야하지만 (this.color가 맞음) 같은 클래스이므로 생략가능

// this를 쓰면 이름이 겹쳐도 분간이 용이해진다
Car(String color, String gearType, int door){
// this.color는 iv, color 는 lv
this.color=color;
this.gearType=gearType;
this.door=door;
//this 가 없으면 둘다 (가까이 있는) lv로 간주가 된다. 이름이 같을땐 생략 불가능이므로 this.

 

※ 정리

this this(), this(매개변수)
참조변수 생성자
: 인스턴스 자신을 가리키는 참조변수
: 인스턴스 주소가 저장되어있다.
: 모든 인스턴스 메서드 내에 지역변수로 숨겨진채로 존재
👉 this로 선언 안해도 사용 가능.
: static 메서드 내에서 사용 불가 - this는 인스턴스 자신을 가리키는 말이므로 인스턴스 메서드에서만 사용가능
같은 클래스 내에서 다른 생성자를 호출할 때 사용