프로그래밍

[자바 기초] day06 : 생성자 본문

자바/자바 기초

[자바 기초] day06 : 생성자

시케 2023. 5. 10. 17:38
728x90
반응형

2023.05.10.수

생성자

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

즉, 생성자는 객체를 초기화하기 위해 사용한다

class Circle {
	String name;
	int radius;
	double area = radius*radius*3.14;
    
	void printInfo() {
		System.out.println(name + "의 넓이는 " + area + "입니다.");
	}

}

출력

피자생성 완료

도넛생성 완료

도넛의 넓이는 0.0입니다.

피자의 넓이는 0.0입니다.

위와 같이 나오는 이유는 클래스 멤버변수에 대입하였기 때문이다

연산 순서가 랜덤이기 때문에 생성자 정의를 통해 구현해야 한다

생성자 함수

  • 클래스와 이름이 같다
  • 객체를 생성할 수 있다
  • new 연산자와 함께 사용한다

생성자 아웃풋은 무조건 객체이기 때문에 인풋만 작성한다

선언하지 않아도 기본적으로 생성되는 생성자가 있다
이를 기본(디폴트) 생성자라 하며 기본 생성자는 인자가 없다

 

사용자가 생성자를 1개라도 제작하게 되면
기본 생성자는 제공되지 않는다

 

생성자 예문)

package class04;

import java.util.Scanner;

class Student {// 클래스는 대문자로
	String name;
	int score;

	// 오버로딩은 생성자에서 매우 많이 쓴다
	Student(String n) { // 생성자 오버로딩
		name = n;
		score = 0;
		System.out.println(name + " 학생 출석부에 입력완료");
	}

	Student(String n, int s) {
		name = n;
		score = s;
		System.out.println(name + " 학생 출석부에 입력완료");
	}

	void hello() {
		System.out.println("안녕, 난 " + name + "(이)야."); // 멤버변수라서 name 선언없이도 오류가 안난다
	}

}

public class Test01 {

	public static void main(String[] args) {
    
		Student student1 = new Student("홍길동", 97);
		Student student2 = new Student("티모");
		Student student3 = new Student("아리");

		// 전부 다르게 나오며 new를 통해 힙메모리에 있어 주소값이 출력됨
		System.out.println(student1);
		System.out.println(student2);
		System.out.println(student3);

		student1.hello();
		student2.hello();
		student3.hello();
	}

}

생성자는 객체를 초기화하기 위해 사용하는만큼 선언하는 동시에 초기화 해주었다

이때 모든 인자를 입력하지 않아도 초기화하고 싶다면

오버로딩을 사용하면 된다

 

생성자를 사용한 초기화를 할때 입력받은 값과 대입해야 하는 값의 구분이 잘 안되기 시작한다

이럴때 자기 자신 객체인 this를 사용하면 구분하기 쉽고 가독성 또한 좋아진다

this자기 자신 객체를 의미한다

 

this.예제

class A{
	int a;
	int b;
	int c;
	int d;
	int e;
	int f;
	int g;
	int h;
	
	A(int a, int b, int c, int e, int f, int g,int h){
		//this == 자기자신객체
		this.a=a;
		this.b=b;
		this.c=c;
		d=100;
		this.e=e;
		this.f=f;
		this.g=g;
		this.h=h;
	}

}

※위의 예제에서 this를 사용하지 않으면 객체 인식이 혼동되어 값이 초기화 되지 않는다

 

오버로딩을 사용하더라도 인자의 수가 너무 많으면 작성하기 힘들고 가독성이 떨어진다

예를 들어 인자가 3개일 경우 모든 경우의 수대로 선언하기 위해서는 8가지의 생성자를 선언해야 한다

이런 경우 매우 번거롭기 때문에 this()를 사용한다

Car(){ 
	this(a,b);
}
Car(int a, int b){ 
	this.a = a;
	this.b = b;
}

 

this() 사용 예제

package class04;

class Car{
	String name; 			//차주 이름
	final int speedLimit;	//최대 속도
	int speedNow; 			//현재 속도
	
	// this() == 생성자 함수
	Car(){ // 생성자 함수1
		this("무명",120);
		
		System.out.println("차가 생성되었습니다");
		System.out.println("차주: "+this.name+" 최대속도: "+this.speedLimit);
	}
	
	Car(String name){ // 생성자 함수2
		this(name,120);
		
		System.out.println("차가 생성되었습니다");
		System.out.println("차주: "+this.name+" 최대속도: "+this.speedLimit);
	}
	
	Car(String name, int speedLimit){ // 생성자 함수3
		this.name = name;
		this.speedLimit = speedLimit;
		this.speedNow = 0;
		
		System.out.println("차가 생성되었습니다");
		System.out.println("차주: "+this.name+" 최대속도: "+this.speedLimit);
	}
	
	void printInfo(){
		System.out.println(name+"님의 차는 ["+speedNow+"/"+speedLimit+"]입니다.");
	}
	
	void speedUp(int speed) {
		if(speedNow<=(speedLimit-speed)) {
			speedNow+=speed;
			System.out.println(name+"님의 차 속도를 "+speed+"만큼 올렸습니다");
		}
		else {
			speedNow = speedLimit;
			System.out.println(name+"님의 차가 과속입니다!");
		}
	}
	
	void speedDown(int speed) {
		if((speedNow-speed)<=0) {
			speedNow = 0;
			System.out.println(name+"님의 차를 정지합니다...");
		}
		else {
			speedNow-=speed;
			System.out.println(name+"님의 차 속도를"+speed+"만큼 내렸습니다");
		}
	}
	
	
}

public class Test05 {

	public static void main(String[] args) {
		Car car1 = new Car();
		Car car2 = new Car("홍길동");
		Car car3 = new Car("아무무", 200);
		
		car1.printInfo();
		car2.printInfo();
		car3.printInfo();
		
		car1.speedUp(10);
		car1.speedUp(30);
		
		car2.speedDown(40);
		
		car3.speedUp(200);
		car3.speedUp(100);
		car3.speedDown(40);
		car3.speedDown(27);
		
		car1.printInfo();
		car2.printInfo();
		car3.printInfo();

	}

}

출력

차가 생성되었습니다

차주: 무명 최대속도: 120

차가 생성되었습니다

차주: 무명 최대속도: 120

차가 생성되었습니다

차주: 홍길동 최대속도: 120

차가 생성되었습니다

차주: 홍길동 최대속도: 120

차가 생성되었습니다

차주: 아무무 최대속도: 200

무명님의 차는 [0/120]입니다.

홍길동님의 차는 [0/120]입니다.

아무무님의 차는 [0/200]입니다.

무명님의 차 속도를 10만큼 올렸습니다

무명님의 차 속도를 30만큼 올렸습니다

홍길동님의 차를 정지합니다...

아무무님의 차 속도를 200만큼 올렸습니다

아무무님의 차가 과속입니다!

아무무님의 차 속도를40만큼 내렸습니다

아무무님의 차 속도를27만큼 내렸습니다

무명님의 차는 [40/120]입니다.

홍길동님의 차는 [0/120]입니다.

아무무님의 차는 [133/200]입니다.

차가 생성되었다고 여러번 뜨는 이유는 this() 로 기존에 만들어 놓았던 인자가 많은 생성자 함수(생성자 함수3)를 같이 불러오기 때문이다

 

  1. main()함수 오픈
  2. new Car() 함수 오픈
  3. this("무명",120)으로 인해 Car(a,b) 함수 오픈
  4. 3닫힘(Car(a,b) 함수 공간)
  5. 2닫힘(Car()함수공간)
  6. 1닫힘(main함수공간)
728x90
반응형
Comments