본문 바로가기

JAVA

JAVA(19) - 생성자/기본 생성자/메소드 오버로딩/Method Overloading/

1. 생성자(Constructor)

  • 인스턴스가 생성될 때 마다 호출되는 '인스턴스 초기화 메소드'
  • 인스턴스 변수의 초기화 또는 인스턴스 생성 시 수행해야할 작업을 작성.
  • 몇가지 조건을 제외하고는 메소드와 같다.
  • 모든 클래스에느 반드시 하나 이상의 생성자가 있어야 한다. (인스턴스를 새로 만들기 위해서는 new 뒤에 생성자가 꼭 호출되어야하기 때문에)

 

< 조건 >
1. 생성자의 이름은 클래스의 이름과 같아야 한다
2. return이 없다

class 클래스명{ 
     //생성자 
     클래스명(매개변수목록) 
}

 

스캐너로 예시를 들어보면.. "스캐너라는 클래스의 인스턴스를 새롭게 생성한다" 

Scanner(System.in)  : 생성자

Scanner scan = new Scanner(System.in);

 

매개변수와 맴버변수가 이름이 같을 경우 앞에 this를 붙여줌

public class ConstructorTest {
	private int num;
	
1	public ConstructorTest(int num) {
		this.num = num;	
	}

	public void setNum(int num) {
		this.num = num;
	}

 


2. 기본생성자 (생성자1 (매개변수 없음) -> 기본 생성자 )

  1. 매개변수가 없는 생성자
  2. 개발자가 작성하지 않으면 자동으로 작성(추가)
  3. 기본 생성자가 아닌 생성자를 작성하면 기본 생성자는 자동으로 추가되지 않는다.
//매개변수가 없는 생성자
public ConstructorTest() {
		
}
	
//기본 생성자가 아닌 생성자
public ConstructorTest(int num) {
	this.num = num;
}

 

  • 생성자를 쓰지말자
  • 매개변수를 넣어주는 생성자만 쓰자
  • 매개변수가 있는 생성자/ 기본생성자 둘다 쓸거면 기본생성자도 다 써줘야함
    (ConstMain.java 예시1번 참고)

 

생성자란?

생성자는 초기화에 사용된다. 
(초기화가 필요없을 때는 사용하지 않아도 된다. ) 
생성자를 작성하지 않으면 기본 생성자는 (보이진 않지만) 자동으로 추가된다.(컴파일러가 추가한다.) 
인스턴스를 생성할 때 초기화 하는 경우 
(즉, 특정 필드에 값을 입력하여 인스턴스를 만들 경우) 매개변수가 있는 생성자를 작성한다. 
이 때, 컴파일러가 기본 생성자를 추가하지 않기 때문에 
기본생성자(매개변수가 없는 생성자)도 같이 사용하려면 기본생성자도 같이 작성해야 한다. 
결론 -> 매개변수가 있는 생성자를 만들 경우, 기본 생성자도 같이 작성하자! (기본 생성자가 아닌 생성자를 작성하면 기본 생성자는 자동으로 추가되지 않는다)

 

 

this() 메소드 

: this 생성자로 같은 이름의 메소드를 호출할 때 this로 호출할 수 있다

	public ConstructorTest() {
//		num1 = 1;
//		num2 = 1;
		this(1);	//위 두줄을 this로 표현할 수 있음
	}
	
	public ConstructorTest(int num1) {
//		this.num1 = 1;
//		num2 = 1;
		this(num1, 1);	//위 두줄을 this로 표현할 수 있음
	}
	
	public ConstructorTest(int num1, int num2) {
		this.num1 = 1;
		this.num2 = 1;
	}

 

 

3. 메소드 오버로딩(Method Overloading)

오버로드란?  

같은 이름의 메소드를 여러개 만들 수 있다. (ConstMain.java 예시2번 참고)

 

< 조건 >
1. 매개변수의 개수가 달라야 한다.
2. 매개변수의 타입이 달라야 한다.
3. 반환형은 판별 기준에 들어가지 않는다.

 

아래 ct와 ct2처럼, 일반적으로 매개변수가 다르면 메소드 이름 또한 다르게 명명하는게 일반적인 생각이지만

	public static void main(String[] args) {

		ConstructorTest ct = new ConstructorTest();
		ConstructorTest ct2 = new ConstructorTest(5);
		
	}

div 메소드를 작성할 때

	public void div(int a, int b) {
		//결과값이 정수인 나눗셈 메소드
		System.out.println(a + "/" + b + "=" + (a/b));
	}

매개변수 개수가 다른 이름이 같은 메소드를 생성할 수 있고

	public void div(int a) {
		float b = 5.0f;
		float r = a / b;
		System.out.println(a + "/" + b + "=" + r);
	}

타입이 다른 이름이 같은 메소드를 생성할 수 있다

	public void div(float a, int b) {
		float r = (float)a/b;
		System.out.println(a + "/" + b + "=" + r);
	}

 

예시) 타입이 다른 이름이 같은 메소드 print로 예시

	public static void main(String[] args) {
		boolean b = true;
		byte by = 1;
		char ch = 'A';
		short s = 10;
		int i = 100;
		long l = 1000L;
		float f = 1.5f;
		double d = 3.14;
		
		//같은 메소드 같아 보이지만 들어오는 데이터(매개변수)에 따라서 해당메소드가 실해되는 것임!!
		System.out.println(b);
		System.out.println(by);
		System.out.println(ch);
		System.out.println(s);
		System.out.println(i);
		System.out.println(l);
		System.out.println(f);
		System.out.println(d);

	}

 

4. 반환형

반환형은 판별기준이 되지 못한다 이유는 어떤 메소드를 실행할지 정하는 시점에서는 같은 메소드가 2개있는 것과 동일하기 때문에

	public int div(int a) {
		return a;
	}