본문 바로가기
프로그래밍/Java

[JAVA] 생성자

by jjjhhhhh 2021. 8. 12.
  • 생성자 , Constructor

- 특수한 목적을 가지는 메소드

- 객체를 초기화하는 역할 ( 객체 멤버 변수를 초기화 or 기타 초기화 작업 )

 

  • 생성자 메소드

- 메소드명이 클래스명과 반드시 일치해야한다.

- 반환타입을 명시하지 않는다 > 반환값을 돌려주는 목적의 메소드가 아님

- 멤버 초기화를 구현한다.

 

  • 기본 생성자 → 인자값이 없는 생성자

- 개발자가 만들지 않으면 자바가 자동으로 만들어준다.

- 인자값이 있는 생성자를 개발자가 만들었다면 기본 생성자는 자동으로 만들어지지 않는다.

 

  • 생성자 오버로딩
public Person() {
		
	this.name="익명";
	this.age = -1;
	
}

//생성자 오버로딩 -> 메소드 오버로딩 ***
public Person(String name, int age) {  
	
	this.name = name;
	this.age = age;
	
}

public Person (String name) {
	this.name = name;
	this.age = -1;
}

public Person (int age) {
	this.name = "익명";
	this.age = age;
}


Person p5 = new Person(); // 익명 , -1 
Person p6 = new Person("홍길동", 20); // 홍길동,20
Person p7 = new Person("아무개"); // 아무개 , -1 
Person p8 = new Person(22); // 익명, 22

 

  • 생성자 호출

- 생성자는 또 다른 생성자 호출 가능 → 누가 더 많은 일을 하는지 판단해서 호출

public Camera() {
	this("none","none"); //-> Camera(String model, String color) 호출 
 }
	
	
public Camera(String model, String color) { //-> 가장 많은 일을 함 
		
		if(model.equals("none") || model.equals("A001") 
    || model.equals("B001")|| model.equals("C001")) {
			this.model = model;
		}
		this.color = color;
	}
	
	public Camera(String model) {
		this(model,"none");

	}

 

  • 생성자 vs Setter

- 공통점 : 객체 변수의 값을 대입 할 수 있다.

- 차이점

1. 생성자 : 객체가 처음 만들어질때 자동으로 호출

- 두번 이상 호출 불가능( 객체가 생겨날때 딱 1번만 실행되고 그 이후에 호출 불가 ) →

초기화 역할

 

2. Setter : 개발자가 원하는 시점에 직접 호출

- 여러번 호출 가능 →

수정 역할

 

Person p = new Person();

class Person {
 public Person() {
		 
  }
}
  • 순서
  1. new → 설계도를 보고 heap 영역에 실체화 → 객체 만든 직후엔 모든 변수가 null
  1. Person() → 생성자가 호출됨으로써 초기화 값으로 변경 name = null, age = 0
  1. Person p
  1. =

 

 

  • 변수의 생명 주기
  1. 지역 변수 : 변수 선언문이 생성 ~ 해당 영역이 종료 ( 메소드, 제어문 )
  1. 객체 변수(인스턴스 변수) : new, 객체 생성 ~ 객체 참조가 모두 끊기고 , GC가 객체를 회수할때 소멸
  1. 정적 변수(클래스변수) : main 실행전 생성 ~ main 메소드 종료시 소멸 , 프로그램 시작~ 종료

 

  • 정적 멤버를 객체 생성을 통해서 초기화를 해야만 하는게 올바른 행동인가 ?

→ 정적 멤버의 초기화는 객체 생성 유무와 상관없이 별도로 실행되어야 한다.

 

  • 객체 생성자, 정적 생성자
//객체 생성자 
//-> 객체의 내부에 있는 멤버를 초기화하는 역할 
//-> 정적 멤버를 초기화하지 않는다. -> 논리에 어긋남 
public Monitor() {
	this.model = "M100";
	//Monitor.owner = "홍길동";
}

//정적 생성자 
// - 정적 멤버를 초기화하는 전용 생성자
// - main() 실행전에 호출된다. 
static {
	Monitor.owner = "홍길동";
}

 

  • 문법의 발전
- 소비자의 입장을 우선시

- 생산자 : 클래스 설계하는 개발자

- 소비자 : 클래스를 사용해서 객체를 생성하는 개발자

- 생성자 : 생산자를 위한 기술이 아닌 소비자를 위한 기술

 

 

'프로그래밍 > Java' 카테고리의 다른 글

[JAVA]메소드 오버 로딩 , 재귀함수  (0) 2021.08.19
[JAVA]연산자  (0) 2021.08.12
[Java] 자료형  (0) 2021.07.11