일단 오늘의 문제가 된 코드는 다음과 같다.
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);
}
}
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가 발생한다.
java는 객체지향언어이기 때문에 다양한 method를 class로 만들어 확인한다. 이 때 여러가지 타입의 데이터를 주고 받거나, 비슷한 기능을 하는 것을 하나의 method name으로 만들어 활용할 수 있다.
예컨데 println()으로 int, String, float 등 여러가지 datatype을 출력할 수 있다. 이를 위해 println()이라는 이름으로 서로 다른 datatype을 argument로 갖는 method를 겹친다.
효용은 method를 사용할 때와 만들때 모두 간편해진다는 것이다.
제기될 수 있는 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
... 등으로 서로 다르게 정적 바인딩 된다.