본문 바로가기

자바 웹 개발자가 될거야/JAVA

[JAVA] 필드 / 생성자 / 생성자 오버로딩 / this. 참조 / this() 다른생성자 호출

 

 

< 필드 >

 

- 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳

  · 객체가 자동차면 제조회사, 모델, 색깔, 현재속도, 차체, 엔진, 타이어 등이 필드가 될 수 있다

 

 

① 필드 선언

 

- 데이터타입 필드명 [ = 초기값] ;

String company; // null로 초기화
String model = "그랜저";
int maxSpeed; // 0으로 초기화
boolean engineStart; // false로 초기화

  · 필드 선언시 초기값을 지정해도 되고 생략해도 된다

  · 초기값 생략시 자동으로 기본 초기값으로 설정

 

- 필드 선언은 클래스 { } 블록 안 어디서든 / 생성자 선언과 메소드 선언 앞 뒤 가능

- 하지만 생성자와 메소드 { } 블록 내부에서는 선언 불가능 → 변수와 다른점 !

- 선언형태가 변수와 비슷하지만 필드와 변수는 다르다 

 

 

② 필드 사용

 

- 필드값을 읽고 변경하는 작업

- 클래스 외부에서 사용할 경우 먼저 클래스부터 객체를 생성한 뒤 필드 사용

  ∵ 객체가 존재해야 필드가 존재하기 때문

 

public class Car{
	//필드
	int speed;
    
    //생성자
    Car(){
    	speed = 0;
    }
    
    //메소드
    void method(...){
    	speed = 10;
    }
}

public class Person{
	void method(){
    	//Car 객체 생성 우선
        Car myCar = new Car();
        
        // 필드 사용
        myCar.speed = 60;
    }
}

 

- 도트(.)연산자는 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드를 사용하고자 할 때 사용

 

 

 

 

< 생성자 >

 

 

- new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체 초기화 담당

  · 객체 초기화 : 필드를 초기화하거나 메소드를 호출해서 객체 사용할 준비

- 메소드와 비슷한 모양이나 리턴 타입 없고 클래스 이름과 동일

 

 

① 기본 생성자

 

- [public] 클래스명(){ } 

- 클래스 내부에 생성자 선언 생략시 블록 { } 이 비어있는 기본 생성자 바이트코드에 자동 추가

- 모든 클래스는 생성자가 반드시 존재하고 하나 이상 가질 수 없음

 

Car myCar = new Car();

  · Car()가 기본 생성자

 

 

② 생성자 선언

 

- 클래스이름과 동일해야한다

- 클래스명 ( [매개변수 선언,] ... ) { }

  · 매개변수 선언은 생략할 수 있고 복수도 가능

 

public class Car{
	// 생성자
    Car(String color, int cc){}
}

public class CarExample{
	public static void main(String[] args){
    	// 생성자 호출
        Car myCar = new Car("검정", 3000);
    }
}

 

 

 

③ 필드 초기화

 

- 방법1) 필드 선언할 때 초기값 주기

  · 동일한 클래스로부터 생성되는 객체들은 모두 같은 값 가짐

 

public class Korean {
	String nation = "대한민국";
	String name;
	String ssn;
}

Korean k1 = new Korean();
Korean k2 = new Korean();

  → Korean 클래스로부터 생성한 객체 k1, k2의 nation은 "대한민국"임

 

 

- 방법2) 생성자에서 초기값 주기

  · 객체 생성 시점에 외부에서 제공되는 값들로 초기화할 때 

 

public class Korean{
	// 필드
    String nation = "대한민국";
    String name;
    String ssn;

	// 생성자
	public Korean(String n, String s){
		name = n;
   	 	ssn = s;
	}
}

Korean k1 = new Korean("홍길동", "1234-5678");
Korean k2 = new Korean("김길동", "5678-9012");

  → 호출될 때 초기값 가짐

 

 

 

④ this.

 

- 객체 자신의 참조

- 매개변수 사용시 통상적으로 필드와 동일한 이름을 갖는 매개변수 사용

- 필드와 매개변수가 이름이 동일하면 매개변수 우선순위가 더 높다

- 생성자 내부의 필드에 접근하기 위해서 this.필드 사용

 

// 생성자
public Korean(String name, String ssn){
	this.name = name;
	this.ssn = ssn;
}

  · 왼쪽이 필드 오른쪽이 매개변수

 

 

 

⑤ 생성자 오버로딩

 

- 매개변수를 달리하는 생성자를 여러 개 선언

- 매개변수 타입과 갯수에 의해서 구분되고 호출될 생성자 결정

 

public class Car{
	Car() { ... }
	Car(String model) { ... }
	Car(String model, String color) { ... }
	Car(String model, String color, int speed) { ... }
}

Car car1 = new Car();
Car car2 = new Car("티볼리");
Car car3 = new Car("티볼리", "하얀색");
Car car4 = new Car("티볼리", "하얀색", 300);

 

Car(String model, String color){ ... }
Car(String color, String model){ ... }

  · 매개변수 타입과 갯수가 같기때문에 순서가 달라도 생성자 오버로딩이 아님

 

 

 

⑥ this()

 

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

- 반드시 생성자의 첫 줄에만 허용

- this()의 매개값은 호출되는 생성자의 매개변수에 맞게 제공

 

Car(String model){
	this.model = model;
	this.color = "은색";
	this.speed = 250;
}

Car(String model, String color, int speed){
	this.model = model;
	this.color = color;
	this.speed = speed;
}

  · this. - 중복코드가 제거를 위해 this() 생성자 사용해보면

Car(String model){
	this(model, "은색", 250);
}

Car(String model, String color, int speed){
	this.model = model;
	this.color = color;
	this.speed = speed;
}

  · this(model, "은색", 250)  생성자가 Car(String model, String color, int speed) 호출하는거임