[Java]생성자와 소멸자, this키워드 개념 정리 및 예제
1. 기본 생성자
생성자란 객체가 생성될 때 가장 먼저 호출되는 함수로 기본적으로 아래와 같이 생겼다.
public class ObjectExample(){
//생성자
public ObjectExample(){
System.out.println("생성자 호출됨");
}
}
위 객체를 메인함수에서 실행하면 생성자 호출됨이라고 남긴 로그가 호출되는 것을 볼 수 있을 것이다.
생성자를 반환값을 명시하지 않고 함수 명을 클래스 명과 동일하게 적어주면
생성자로 인식하고 기능하게 된다.
만약 이런 식으로 생성자를 만들지 않는다고 해도
컴파일 시점에서 컴파일러가 자동으로 기본 생성자를 만들어주게 된다.
2. 사용자 정의 생성자
만약 기본 생성자 외에 추가로 생성자를 만들고 싶을 때는 다음과 같이 하면 된다.
public class ObjectExample(){
private String name;
private int price;
public ObjectExample(){
System.out.println("기본 생성자")
}
public ObjectExample(String a){
name=a;
}
public ObjectExample(String a,int b){
name=a;
price=b;
}
}
다음과 같이 매개변수만 다르고 함수명이 동일한 함수로 작성하면
내가 원하는 만큼의 사용자 정의 생성자를 만들어 쓸 수가 있는데
이는 오버로딩(Overloading)방식과 유사하다.
주로 사용자 정의 생성자는 객체내 변수값들을 초기화하는데 사용되는 경우가 많다.
3. 소멸자
소멸자는 자주 사용되지는 않지만 객체가 가비지 컬렉터(GC)에 의해
제거될 때 호출되는 함수이다.
소멸자 예제는 다음과 같다.
public class ObjectExample(){
private String name;
private int price;
public ObjectExample(){
System.out.println("기본 생성자")
}
public ObjectExample(String a){
name=a;
}
public ObjectExample(String a,int b){
name=a;
price=b;
}
//소멸자
@Override
protected void finalize() throws Throwable {
System.out.println("소멸자 호출됨");
}
}
finalize라는 함수를 오버라이드해서 사용하면 소멸자가 되며
메모리에서 제거되는 순간(=가비지컬렉터에 의해 제거될 때)에 호출되어 사용된다.
[참고]
일반적으로 가비지 컬렉터를 호출하는 방법은 System.gc(); 로 하지만
이렇게 호출한다고 해서 가비지 컬렉터가 무조건 바로 호출되는 것은 아니다.
System.gc();는 가비지 컬렉터에게 가급적 빨리 작동해달라고 요청하는 내용이기 때문에
언제 호출될 지는 아무도 모른다.
(Java는 개발자가 메모리 관리를 하지 않기 때문에 gc호출을 요청할 일은 거의 없긴 하다.)
그리고 가비지 컬렉터가 호출되면 메모리 상에 안쓰는 데이터를 찾는 과정에서
프로그램이 잠시 멈추는 현상이 일어날 수 있어 가비지 컬렉터가 동작하는 것이 좋다고만은 볼 수 없다.
때문에 자바 프로그래밍을 할 때는 가비지 컬렉터가 최대한 동작을 안하게 끔 코드를 짜는 것이 좋다.
4. this 키워드
this는 현재 객체를 가리킬 때 사용하는 키워드이다.
아래의 예제를 보자
public class ObjectExample(){
private String name;
private int price;
public ObjectExample(String name){
this.name=name;
}
}
위 코드에서 생성자 부분에서 this를 사용하였다.
위와 같이 만약 생성자 내에서 매개변수 명이 name이고 객체 내 변수명도 name이라면
서로 뭘 지칭하는 것인 지 헷갈릴 것이다.
이 때 헷갈리지 않게 객체 내 지역변수 쪽에는
객체 내의 지역변수를 지칭하는 것이라는 의미의 this를 넣어주면
좀 더 명확한 코드를 짤 수 있다.
(컴파일러는 대개는 잘 읽어내는 경향이 있긴하지만 가급적 명확하게 적어주는 것이 좋기 때문에 this를 적어주는 것이 좋다)
Reference
이 포스팅은 아래의 강좌를 참고하여 만들어졌습니다.
- 자바 프로그래밍 입문 강좌 (renew ver.) - 초보부터 개발자 취업까지!!
https://www.inflearn.com/course/%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94_java-renew/dashboard
'Language > Java' 카테고리의 다른 글
[Java]네이버 블로그 검색 API 적용 및 예제 (0) | 2020.09.10 |
---|---|
[Java]SHA256 암호화(Encrypt) 정리 및 예제 (0) | 2020.09.10 |
[Java]객체와 메모리의 관계, null과 NullPointerException의 정리 및 예제 (0) | 2020.09.06 |
[Java]접근제어자(Access Modifier) 개념 정리 (0) | 2020.08.26 |
[Java]메소드(Method)와 오버로딩(Overloading)의 사용법 및 예제 (0) | 2020.08.26 |