이롭게 현명하게

[JAVA] 자바 클래스 생성 본문

JAVA

[JAVA] 자바 클래스 생성

dev_y.h 2023. 4. 14. 18:33
728x90
반응형


 

목차

 

기본 생성자

생성자 선언

필드 초기화

생성자 오버로딩

다른 생성자 호출

 


 

 

 

public class ClassName{
	//필드 : 객체의 데이터가 저장되는 곳
    int fieldName;
    
    //생성자 : 객체 생성 시 초기화 역할 담당
    ClassName(){ ... }

	//메소드 : 객체의 동작에 해당하는 실행 블록
    void methodName() { ... }
}

[기본 생성자]

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

객체 초기화 : 필드(클래스 멤버 변수)를 초기화하거나, 메서드를 호출해서 객체를 사용할 준비를 하는 것

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

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

 

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

클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본 생성자를 바이트 코드에 자동 추가시킨다.

public class 클래스명: 소스파일명.java에서 소스파일명과 같은 클래스

class 클래스명: 소스파일명.java에서 소스파일명과 다른 클래스

 


[생성자 선언]

생성자는 메소드와 비슷하지만 리턴 타입이 없고 클래스 이름과 동일하다.

생성자 블록 내부에는 객체 초기화 코드가 작성된다.

필드에 초기값을 저장하거나 메서드를 호출하여 객체 사용 전에 필요한 준비를 한다.

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

클래스명(매개변수1, 매개변수2..){ // 생성자 블록
	//객체의 초기화 코드
}

 

 

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

이때 매개변수가 선언되어 있다면 매개 변수가 없는 기본 생성자는 호출할 수 없다.

만약 매개변수가 없는 기본 생성자 호출을 원할 경우 클래스에 매개 변수가 없는 기본생성자를 작성하면 된다.

// Main.java

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Car mycar = new Car("파랑",3000);
		//Car mycar = new Car(); // 기본 생성자를 호출할 수 없다.
	}

}
// Car.java

public class Car {
	
	String company = "현대자동차";
	String model = "그랜저";
	String Color = "검정";
	int maxSpeed = 350;
	
	int speed;
	Car(String c,int cc){
		
	}
}

 


[필드 초기화]

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

만약 다른 값으로 초기화를 하고 싶다면 2가지 방법이 있다.

  1. 필드를 선언할 때 초기 값을 준다.
  2. 생성자에서 초기값을 준다.

 

1. 필드를 선언할 때 초기 값을 준다.

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

객체 생성 시점에는 필드의 값이 모두 같다.

public class Car {
	
	String company = "현대자동차";
	String model = "그랜저";
	String Color = "검정";
	int maxSpeed = 350;
}

 

2. 생성자에서 초기값을 준다.

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

객체 생성 시점에 다양한 값을 가져야 한다.

public class Car {
	
	String company;
	String model;
	String color;
	int maxspeed;
	
	int speed;
	Car(String color,int maxspeed){
		this.color = color;
		this.maxspeed = maxspeed;
	}
}

생성자의 매개변수는 필드와 동일한 이름을 갖게 하는 매개변수를 사용하는 것이 좋다.

this : 객체 자신의 참조, '나'자신

this.필드 : 필드를 참조하라

그러므로 this.color는 클래스에 있는 필드를 말한다.

 


[생성자 오버로딩]

외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양화될 필요가 있다.

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

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

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

	Car(){
		this.company="현대자동차";
	}
	Car(String color){
		this.color = color;
	}
	Car(String color,int maxspeed){
		this.color = color;
		this.maxspeed = maxspeed;
	}

[다른 생성자 호출]

생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.

필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있다.

생성자에서 다른 생성자를 호출할 때 this()를 사용한다.

클래스([매개변수 선언]){
	this(매개변수 값 ..);
	실행문;
}

this() : 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용된다.

this()의 매개값은 호출되는 생성자의 매개변수 타입에 맞게 제공해야 한다.

호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 진행한다.

<변경 전>

public class Car {

	String company;
	String model;
	String color;
	int maxspeed;
	
	int speed;
	Car(){
		this.company="현대자동차";
		this.model = "그랜저";
		this.color = "검정색";
	}
	Car(String color){
		this.company="현대자동차";
		this.model = "그랜저";
		this.color = color;
	}
	Car(String color,int maxspeed){
		this.company="현대자동차";
		this.model = "그랜저";
		this.color = color;
		this.maxspeed = maxspeed;
	}
}

 

<변경 후>

public class Car {

	String company;
	String model;
	String color;
	int maxspeed;
	
	int speed;
	Car(){
		this("현대자동차","검정색",250);
	}
	Car(String color){
		this("현대자동차",color,250);
	}
	Car(String color,int maxspeed){
		this("현대자동차",color,maxspeed);
	}
	Car(String model,String color,int maxspeed){
		this.company="현대자동차";
		this.model = model;
		this.color = color;
		this.maxspeed = maxspeed;
	}
}

중복 코드를 최소화할 수 있다.

 

 

 

[JAVA] 자바 클래스 필드

public class ClassName{ //필드 : 객체의 데이터가 저장되는 곳 int fieldName; //생성자 : 객체 생성 시 초기화 역할 담당 ClassName(){ ... } //메소드 : 객체의 동작에 해당하는 실행 블록 void methodName() { ... } } [

devyihyun.tistory.com


잘못된 정보는 댓글에 남겨주시면 감사하겠습니다!😊

댓글과 좋아요는 큰 힘이 됩니다!

 

더보기

[ 참고자료 ]

 

 

 

 

728x90
반응형

'JAVA' 카테고리의 다른 글

[JAVA] 자바 인스턴스 멤버와 this  (0) 2023.04.19
[JAVA] 자바 클래스 메소드  (0) 2023.04.18
[JAVA] 자바 클래스 필드  (0) 2023.04.13
[JAVA] 자바 객체와 클래스  (2) 2023.04.12
[JAVA] 객체 지향 프로그래밍  (0) 2023.04.11
Comments