본문 바로가기
👨‍💻 2. 웹개발_Back end/2-1 Java

[JAVA] 06-3 생성자

by 달님🌙 2021. 8. 2.
반응형
객체 사용 단계

 

1. 라이브러리 파일에서 생성자 선언

2. 실행 파일에서 new 연산자를 통해 생성자 실행

3. 힙 영역에 객체가 생성됨

4. 객체의 번지가 리턴되면서 클래스 변수에 저장됨

 

 

기본 생성자

 

- 생성자란 ?  객체의 초기화 담당

- 클래스는 항상 생성자를 가진다.

- 생성자 선언 생략 시 컴파일러가 자동으로 기본 생성자를 만들어준다.

- 기본 생성자 앞에 public이 붙을지에 대해서는 해당 클래스를 따라간다. 해당 클래스가 public 으로 선언되면 기본 생성자도 public이 붙는다.

- 기본 생성자가 자동으로 생성되는데도 굳이 생성자를 명시적으로 선언하는 이유는 객체를 다양한 값으로 초기화하기 위함이다.

 

생성자 선언부

 

- 형태 : 클래스 이름 (매개변수 선언 부분) 

- 매개변수 : new 연산자로 생성자를 호출할 때 값을 생성자 블록 안으로 전달해주는 역할을 한다.  생략할 수도 있고 여러 개 선언도 가능하다. 

 

class Car {
	//생성자
	Car(int speed, String model) {
	}	
}

public class CarExample {
	public static void main(String[] args) {
		//생성자 호출
		Car myCar = new Car(60, "그랜저"); // 타입에 맞춰서 호출
	}
}

 

 

필드 초기화

 

방법 1. 초기화 안함 -> 기본 초기값으로 자동 설정됨

 

방법 2. 필드를 선언할 때 초기화 -> 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 가지게 됨

값 변경이 가능하긴 하지만 생성되는 시점에는 필드 값이 같음

 

방법 3. 생성자에서 초기화 -> 초기화될 때부터 서로 다른 값들로 초기화해주어야한다면 생성자에서 초기값을 주면 된다.

 

방법 4. 매개변수를 통해서 초기화 -> ' this.필드 = 매개변수 ' 의 형태로 작성하여 실행 파일에서 new 연산자를 통해 초기화해준다.

 

public class Korean {
	//필드
	String nation = "대한민국"; // 필드에서 초기화
	String name;
	String ssn;

	//생성자
	public Korean(String n, String s) { // 생성자에서 매개변수를 받아 초기화
		this.name = n;
		this.ssn = s;
	}
}

 

public class KoreanExample {
	public static void main(String[] args) {
		Korean k1 = new Korean("김자바","123"); // 생성자로 매개변수 전달
		System.out.println("k1.name : " + k1.name);
		System.out.println("k1.ssn : " + k1.ssn);
		
		Korean k2 = new Korean("박자바", "456"); // 생성자로 매개변수 전달
		System.out.println("k2.name : " + k2.name);
		System.out.println("k2.ssn : " + k2.ssn);
	}
}

 

k1.name : 김자바
k1.ssn : 123
k2.name : 박자바
k2.ssn : 456

 

- 통상적으로 매개변수 이름은 필드와 동일하게 지정해준다.

- 같은 이름으로 지정했을 때 생성자 내부에서 필드로 접근이 불가능해진다. (매개변수가 필드보다 더 우선순위라서..)

- 이를 해결하기위해 필드 앞에 this.를 붙여준다.

 

this 참조 변수

 

- Math.random 처럼 참조 변수를 사용할때 온점 ( . ) 을 사용하여 접근한다.

- 마찬가지로 여기서 this는 객체 자기 자신의 참조이고 this.필드라고 쓰는 것은 this 라는 참조 변수로 필드를 사용하는 것이다.

- 매개변수로 초기화할 때 생성자에 매개변수 입력시 필드 개수 만큼 선언해야한다. 

- 보통의 경우 중요한 몇 개 필드는 매개변수로 초기화, 나머지 필드는 필드 선언할 때 혹은 생성자 내부에서 초기화된다.

 

생성자 오버로딩

 

- 생성자 오버로딩이란, 생성자를 여러 개 선언하는 것

- 생성자를  왜 여러개나 선언해주어야 할까? -> 실행 파일에서 데이터를 제공할때 매개변수를 하나만 보내줄 수도 있고 두 개 혹은 그 이상 보내줄 수가 있다.

- 그 때마다 모든 조건에 수용할 수 있어야하는데 기본 생성자는 그럴 수가 없다. 따라서 우리가 직접 생성자를 여러 개 생성해준다.

- 주의 : 매개변수의 이름만 바뀐 것은 서로 다른 생성자를 만들었다고 할 수 없다.

 

class Car2 {

	// 필드
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	
	// 생성자
	Car2() { //(1)번 생성자
	}
	Car2(String model) { //(2)번 생성자
		this.model = model;
	}
	Car2(String model, String color) { //(3)번 생성자
		this.model = model;
		this.color = color;
	}
	Car2(String model, String color, int maxSpeed) { //(4)번 생성자
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}

 

public class Car2Example {
	public static void main(String[] args) {
		Car2 c1 = new Car2(); //(1)번 생성자를 선택함
		System.out.println(c1.company); // 현대자동차
		System.out.println(c1.color); // null이 뜸
		
		Car2 c2 = new Car2("자가용"); //(2)번 생성자를 선택함
		System.out.println(c2.company); // 현대자동차
		System.out.println(c2.model); // 자가용
		
		Car2 c3 = new Car2("자가용","빨강"); //(3)번 생성자를 선택함
		System.out.println(c3.company); // 현대자동차
		System.out.println(c3.model); // 자가용
		System.out.println(c3.color); // 빨강
		
		Car2 c4 = new Car2("택시","노랑", 100); //(4)번 생성자를 선택함
		System.out.println(c4.company); // 현대자동차
		System.out.println(c4.model); // 택시
		System.out.println(c4.color); // 노랑
		System.out.println(c4.maxSpeed); // 100
	}
}

 

 

오버로딩(Overloading) vs 오버라이딩(Overriding)

 

shaking blog :: [JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점 (tistory.com)

 

[JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점

1. 오버로딩(Overloading) - 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미한다. - 리턴값만을 다르게 갖는 오버로딩은 작성 할 수 없다. 2. 오버라이딩(Overriding) - 

88240.tistory.com

 

 

 

다른 생성자 호출 :  this ( ) 코드 사용

 

- 아까 this.필드명이랑 다름

- 생성자 오버로딩이 많아지면 코드가 중복이 된다.

- 중복 코드를 제거하기위해 this ( ) 코드를 사용한다.

- 자신의 다른 생성자를 호출하는 코드로서 반드시 생성자의 첫번째 줄에만 나올 수 있다.

 

public class Car3 {
	// 생성자
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	
	//필드
	Car3() {
	}
	Car3(String model) { 
		this(model,"초록", 200);
	}
	Car3(String model, String color) { 
		this(model, color, 400);
	}
	Car3(String model, String color, int maxSpeed) {
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}

 

public class Car3Example {
	public static void main(String[] args) {
		Car3 c1 = new Car3();
		Car3 c2 = new Car3("아반떼");
		Car3 c3 = new Car3("그랜저","분홍");
		Car3 c4 = new Car3("그랜저","노랑",300);
		
		System.out.println(c1.company); // 현대자동차
		System.out.println(c1.model); // null
		System.out.println(c1.color); // null
		System.out.println(c1.maxSpeed); // 0
		
		System.out.println(c2.company); // 현대자동차
		System.out.println(c2.model); // 아반떼
		System.out.println(c2.color); // 초록
		System.out.println(c2.maxSpeed); // 200
		
		System.out.println(c3.company); // 현대자동차
		System.out.println(c3.model); // 그랜저
		System.out.println(c3.color); // 분홍
		System.out.println(c3.maxSpeed); // 400
		
		System.out.println(c4.company); // 현대자동차
		System.out.println(c4.model); // 그랜저
		System.out.println(c4.color); // 노랑
		System.out.println(c4.maxSpeed); // 300
	}
}

 

 

반응형

댓글