[Java] Overloading과 default constructor

yule_mu·2022년 2월 27일
0

JavaTPC

목록 보기
1/4

일단 오늘의 문제가 된 코드는 다음과 같다.

main 부분

import kr.tpc.BookVO2;

public class TPC12 {

	public static void main(String[] args) {
		BookVO2 b1=new BookVO2();
		
		BookVO2 b2=new BookVO2("자바", 20000, "길벗", 790);
		System.out.print(b2.title+"\t");
		System.out.print(b2.price+"\t");
		System.out.print(b2.company+"\t");
		System.out.println(b2.page);
	}
}

class로 객체 modeling한 부분

package kr.tpc;

public class BookVO2 {
	public String title;
	public int price;
	public String company;
	public int page;
	// default constructor method(원래는 생략)
	
	
	// 객체지향에서는 함수의 이름이 같아도 argument의 개수 or type이 다르면 서로 다른 함수로 인식해서 error가 발생하지 않는다.
	// default constructor method
	public BookVO2() {
//		this.title="제목";
//		this.price=00000;
//		this.company="출판사";
//		this.page=000;
	} // 앞에 내용들은 없어도 된다.
	//warn 생성자가 하나 만들어져 있으면 default 생성자는 자동으로 만들어지지 않는다!!!!
	//그렇기 때문에 바로 위에 constructor method 만드는 작업 해줘야 한다.
	
	// constructor method의 Overloading
	public BookVO2(String title, int price, String company, int page) {
		// 초기화 작업
		this.title=title;
		this.price=price;
		this.company=company;
		this.page=page;
	}

}

b1, b2가 모두 있을 땐 BookVO2()가 두 번 서로 다르게 사용되기 때문에 overloading이된다.
이 때 overloading을 위해 class에서 public BookVO2(String title, int price, String company, int page)를 정의하게 된다.
이로 인해 자동을 생성되던 default constructor는 생성되지 않는다.

따라서 BookVO2(), 즉 b1=new BookVO2()를 사용하기 위해서는 BookVO2()를 인위적으로 초기화하는 부분이 필요하다.
그래서 class 안에 public BookVO2() {}이 필요하다.
이게 없으면 main에서 b2=new BookVO2("자바", 20000, "길벗", 790);는 잘 실행되지만, b1=new BookVO2()는 실행되지 않아 error가 발생한다.

참고 : overloading을 하는 이유

java는 객체지향언어이기 때문에 다양한 method를 class로 만들어 확인한다. 이 때 여러가지 타입의 데이터를 주고 받거나, 비슷한 기능을 하는 것을 하나의 method name으로 만들어 활용할 수 있다.
예컨데 println()으로 int, String, float 등 여러가지 datatype을 출력할 수 있다. 이를 위해 println()이라는 이름으로 서로 다른 datatype을 argument로 갖는 method를 겹친다.
효용은 method를 사용할 때와 만들때 모두 간편해진다는 것이다.

Overloading의 정적 바인딩

  • 제기될 수 있는 problem
    parameter의 타입에 따라 class 내부 method가 갈라져 있다보니 어떤 method에 해당하는지 일일이 찾아야 할 것이다. searching할 때 시간이 걸려 속도가 느려지지 않을까?

  • solution : 정적 바인딩
    컴파일 할 때 method마다 다른 이름을 할당돼서 호출할 method가 미리 경정되어있다.

따라서 속도와는 관계 없다.

package kr.tpc;

public class calSum {
//	동작(method)으로만 이루어진 객체
//	이건 왜 없어도 잘 작동하나?
//	public calSum() {
//		
//	}
	
	public void calSum(float a, float b) {
		System.out.println(a+b);
	}
	public void calSum(int a, float b) {
		System.out.println(a+b);
	}
	public void calSum(float a, int b) {
		System.out.println(a+b);
	}
	public void calSum(int a, int b) {
		System.out.println(a+b);
	}
}

여기서 calSum은 컴파일 할 때 calSum_float_float, calSum_int_float... 등으로 서로 다르게 정적 바인딩 된다.

profile
Java 백엔드 개발자가 되고 싶습니다. 매일 공부한 기록을 올리며 반추합니다.

0개의 댓글