본문 바로가기
프로그래밍 언어/JAVA

[JAVA] 객체의 생성, 생성자

by E145 2021. 1. 20.
반응형

객체의 생성

 

생성자란?

 

 - 객체를 생성할 때 호출하는 메소드

 

 - 생성자를 호출할 때에는 반드시 new 키워드를 앞에 붙여준다.

 


 

생성자의 특징

 

 - 생성자는 클래스와 이름이 같다.

   (메소드의 이름이 클래스의 이름과 같다고 모두 생성자가 아니다. 클래스의 이름과 같은 메소드도 선언이 가능하다.)

 

 - 일반 메소드와 달리 리턴 유형이 없다.

 

 - 생성자는 일반적으로 객체의 상태를 초기화 하는 작업을 처리한다.

   (초기화 코드를 집어 넣을 가장 좋은 장소가 생성자이다.)

 

 - 프로그래머가 생성자를 선언하지 않으면, 컴파일러는 인자가 없는 생성자를 자동으로 만들어준다.

 

 - 컴파일러는 항상 인자가 없는 생성자를 자동으로 만들어주지 않는다.

   프로그래머가 인자를 받아들이는 생성자를 만들었다면, 인자를 받아들이지 않는 생성자는 직접 만들어야 한다.

   즉, 프로그래머가 직접 생성자를 만든다면 생성자의 종류와 상관 없이 컴파일러는 자동으로 만들어주지 않는다.

 

 - 생성자는 오버 로딩을 통해 다중 정의가 가능하다.

   클래스에 생성자가 두 개 이상 있으면 각 생성자 매개변수의 목록은 반드시 서로 달라야 한다.

 

 - 생성자는 반드시 public으로 선언할 필요는 없다.

 

 - 생성자는 상속 되지 않는다.

   부모의 생성자는 상속되지 않기 때문에, 자식 클래스에서 다시 생성자를 선언해주어야 한다.

 

 - this 키워드를 이용하여 서로 다른 생성자를 선언할 수 있다.

   this를 이용하여 생성자를 선언하는 경우, 반드시 생성자의 제일 첫 부분에 와야 한다.

 


 

생성자 예시

 

import java.util.*;

public class Main {

	public static void main(String[] args) {
		dog d1=new dog();
		dog d2=new dog(3);
		dog d3=new dog(4, "Kim");
		dog d4=new dog("Park",5);
	}

};

class dog{
	public dog() {
		System.out.println("강아지");
	}
	
	public dog(int n) {
		System.out.println("강아지 "+n+"마리");
	}
	
	// 같은 인자들이라도 순서가 바뀌면 다르게 인식한다.
	public dog(int n, String name) {
		System.out.println("강아지 "+n+"마리 주인 "+name);
	}
	public dog(String name,int n) {
		System.out.println("주인 "+name+"의 강아지 "+n+"마리");
	}
}

실행 결과

 


 

상속과 생성자

 

 - 상속 받은 클래스의 객체가 생성되면(생성자 호출) 상속 한 객체의 생성자도 호출된다.

   즉, 새로운 객체를 만들 면 객체의 상속 트리에 들어있는 모든 생성자가 실행된다.

 

 - 상속 트리의 객체의 생성자는 최상단부터 실행된다

 

import java.util.*;

public class Main {

	public static void main(String[] args) {
		dog d1=new dog();

	}

};

class animal{
	public animal() {
		System.out.println("동물");
	}
}

class Mammal extends animal{
	public Mammal() {
		System.out.println("포유류");
	}
}

class dog extends Mammal{
	public dog() {
		System.out.println("강아지");
	}

}

실행 결과

 - 상위 클래스의 생성자를 호출 하는 방법은 super()키워드를 이용한다.

   super()를 호출하는 선언문은 모든 생성자의 첫번째 선언문어이야 한다.

  

 - this와 super를 이용하여 생성자를 호출하는 경우, 모두 첫 번째로 와야 한다.

   즉, this와 super를 이용한 생성자는 같이 사용할 수 없다.

  사용하기 위해서는 this로 인해 선언되는 생성자 부분에 super를 선언해야 한다.

 

 - 상속을 받게 되면, 자식의 클래스 생성자에서는 반드시 부모 클래스의 생성자를 제일 먼저 선언해주어야 한다.

   즉, 자식의 생성자 안에 부모 생성자를 나중에 선언할 수 없다.

 

 - 프로그래머가 상위 생성자를 선언하지 않아도, 컴파일러가 자동으로 인자가 없는 생성자를 생성한다.

   부모 클래스에 인자가 없는 생성자가 없다면, 컴파일러는 자동으로 인자가 없는 생성자를 생성해주지 않는다.

   즉, 자식 클래스에서 인자가 있는 부모 생성자를 따로 선언해주어야 한다.

 

 

class Mammal extends animal{
	public Mammal(int n) {
		System.out.println("포유류");
	}
}

class dog extends Mammal{
	public dog() {
		System.out.println("강아지");
	}

}

인자가 없는 생성자를 선언해주지 않았기 때문에 오류가 발생한다.

 

class Mammal extends animal{
	public Mammal(int n) {
		System.out.println("포유류");
	}
}

class dog extends Mammal{
	public dog() {
    	// 인자가 있는 부모 클래스 생성자 실행
		super(3);
		System.out.println("강아지");
	}

}

인자가 존재하는 부모 클래스 생성자 실행 시 정상 실행된다.

 

 

 


 

객체의 제거

 

 - 마지막으로 살아남은 객체에 대한 레퍼런스가 사라지면 객체는 가비지 컬렉션의 대상이 된다.

 

 - 가비지 컬렉션의 대상이 되면 그 객체가 차지하고 있던 메모리 공간을 회수한다.

 

- 객체 제거 방법1

// 레퍼런스가 영원히 영역을 벗어날 경우

void go(){
	// 해당 메소드가 종료되면 'z'라는 레퍼런스는 사라진다.
    // Life() 객체를 가리키는 레퍼런스가 사라졌기 때문에 객체는 사라진다.
	Life z = new Life();
}

 

 - 객체 제거 방법2

// 레퍼런스에 다른 객체를 대입한다.

Dog d = new Dog();
// 처음 선언되었던 객체는 새로운 객체가 대입된 후 사라진다.
d = new Dog();

 

 - 객체 제거 방법3

// 레퍼런스를 직접 null로 설정한다.
// 레퍼런스를 null로 설정한다는 것은 레퍼런스에 아무 것도 없음을 나타낸다.

Cat c = new Cat();
c = null;

 

 

 

반응형

댓글