필드 사용

필드를 사용한다는 것은 필드값을 읽고, 변경하는 작업을 말한다.

클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다.

그 이유는 필드는 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문이다.

//Person 클래스

void method() {
	//Car 객체 생성
    Car mycar = new Car();
    //필드 사용
    myCar.speed = 60;
 }
//Car 클래스

//필드
int speed;

//생성자
Car() {
	speed=0;
}

//메소드
void method(...) {
	speed = 10;
}

위 코드들을 보면 Car 클래스의 speed 필드는 생성자와 메소드에서 변경이 가능하다.

사용 방법은 변수와 동일한데, 차이점은 변수는 자신이 선언된 생성자 또는 메소드 블록 내부에서만 사용할 수 있는 반면

필드는 생성자와 모든 메소드에서 사용이 가능하다.

외부 Person 클래스에서 Car 클래스의 speed필드 값을 사용하려면 Car 객체를 우선 생성해야 한다.

Car myCar = new Car();

//Car 객체 생성

myCar 변수가 Car 객체를 참조하게 되면 도트(.) 연산자를 사용해서 speed 필드에 접근할 수 있다.

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

생성자

생성자(Constructor)는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

객체 초기화란 필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하는 것을 말한다.

생성자를 실행시키지 않고는 클래스로부터 객체를 만들 수 없다.

new 연산자에 의해 생성자가 성공적으로 실행되면 힙(heap) 영역에 객체가 생성되고 객체의 주소가 리턴된다.

리턴된 객체의 주소는 클래스 타입 변수에 저장되어 객체에 접근할 때 이용된다. 

만약 생성자가 성공적으로 실행되지 않고 예외(에러)가 발생했다면 객체는 생성되지 않는다.

모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.

클래스 내부에 생성자 선언을 생략했다면 컴파일러는 다음과 같이 중괄호 { } 블록 내용이 비어있는 기본 생성자를 바이트 코드에 자동 추가시킨다.

[public] 클래스() { }

클래스가 public class로 선언되면 기본 생성자에서도 public이 붙지만, 클래스가 public 없이 class로만 선언되면 기본 생성자에도 public이 붙지 않는다. 

그렇기 때문에 클래스에 생성자를 선언하지 않아도 다음과 같이 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성시킬 수 있다. 

Car myCar = new Car();

그러나 클래스에 명시적으로 선언한 생성자가 한 개라도 있으면, 컴파일러는 기본 생성자를 추가하지 않는다.

명시적으로 생성자를 선언하는 이유는 객체를 다양하게 초기화하기 위해서이다.

생성자를 명시적으로 선언하는 방법

클래스(매개변수선언, ) {

//객체의 초기화 코드

}

매개 변수 선언은 생략할 수도 있고, 여러 개를 선언해도 된다.

매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 한다.

Car myCar = new Car("그랜저", "검정", 300);

두 개의 매개값은 String 타입이고 마지막 매개값은 int 타입

세 매개값을 생성자가 받기 위해서는 아래와 같이 생성자를 선언해야한다.

public class Car {
	//생성자
    Car(String model, String color, int maxSpeed) { ... }
}

클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야만 한다.

필드 초기화

클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다.

만약 다른 값으로 초기화 하고 싶은 경우 두 가지 방법이 있다.

              1. 필드를 선언할 때 초기값을 주는 방법

              2. 생성자에서 초기값을 주는 방법

필드를 선언할 때 초기값을 주게 되면 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 갖게 된다.

물론 객체 생성 후 변경할 수 있지만, 객체 생성시점에서는 필드의 값이 모두 같다.

Ex> Korean 클래스에 nation 필드를 선언하면서 "대한민국"으로 초기값을 준 경우, Korean 클래스로부터 k1과 k2 객체를 생성하면 k1과 k2객체의 nation 필드에는 모두 "대한민국"이 저장되어 있다.

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

// Korean 클래스로부터 객체 생성 

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

객체 생성 시점에서 외부에 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화를 해야한다.

위 코드에서 name과 ssn필드값은 클래스를 작성할 때 초기값을 줄 수 없고 객체 생성 시점에 다양한 값을 가져야 한다.

따라서 생성자의 매개값으로 이 값들을 받아 초기화하는 것이 맞다.

//생성자의 매개값으로 name과 ssn 필드값들을 받아 초기화하는 것

public class Korea{
	//필드
    String nation = "대한민국";
    String name;
    String ssn;
    
    //생성자
    public Korean(String n, STring s) {
    	name = n;
        ssn = s;
     }
 }
 

Korean k1 = new Korean("박자바", "011225-1234567");
Korean k2 = new Korean("김자바", "930252-2546217");

"박자바", "김자바"는 매개 변수 n을 통해 전달되고 , 주민번호는 매개 변수 s를 통해 전달된다.

이 값들은 각각 name 필드와 ssn필드의 초기값으로 사용된다.

this

//생성자
public Korean(String n, String s) {
	name = n;
    ssn = s;
 }
 
 
//"this.필드". this라는 참조 변수로 필드를 사용하는 것 this는 객체 자신의 참조

//수정본

public Korean(String name, String ssn) {
	this.name = name;
    this.ssn = ssn;  
 }
 
 //this.필드 = 매개변수

오버로딩(Overlodaing)

자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩(Overlodaing)을 제공한다.

생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.

public class car {
	Car() {}
    Car(String model) {}
    Car(String model, String, color) {}
    Car(String model, String, color, int maxSpeed) {}
}

매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이라고 볼 수 없다.

Car( String model, String color) {}
Car (String color, String model) {} //------->오버로딩아님

 

+ Recent posts