void println() {}
void println(blooean x) {}
void println(char x) {}
void println(char[] x) {}
void println(double x) {}
void println(float x) {}
void println(int x) {}
void println(long x) {}
void println(Object x) {}
void println(String x) {}
long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; } // 매개변수 타입이 다름으로 overloading이 맞음
// add(3, 3) 호출 시 어느 메서드를 호출해야 하는지 모름. Ambiguous method call. both 에러 발생
주변지식 : 연산자 오버로딩
java에서 +기호는 부호, 덧셈, 문자열 결합 등으로 사용됨, 하나의 연산자로 여러 역할을 수행함
Time t = new Time(); // 객체 생성 & 생성자 호출
t.hour = 12; // iv 초기화
t.minute = 34; // iv 초기화
t.secound = 56; // iv 초기화
Time t = new Time(12, 34, 56); // 생성자 호출
// Time(12, 34, 56)과 같은 생성자를 클래스에 추가해야 사용 가능
class Card {
Card() { // 기본 생성자 (매개변수 없는 생성자)
... // 인스턴스 초기화 작업
}
Card(String kind, int number) { // 매개변수 있는 생성자
// 인스턴스 초기화 작업
// 주로, 인스턴스 변수의 초기화 코드를 적음
}
}
클래스이름 () {} // 기본 생성자 형태
Point() {} // Point 클래스의 기본 생성자
class Data_1 {
int val;
// 생성자를 선언하지 않으면 컴파일러가 자동으로 생성자를 추가함
// 기본 생성자로 생성됨 : Data_1() {}
}
class Data_2 {
int val;
Data_2(int x) { // 매개변수가 있는 생성자
val = x;
}
}
class Ex {
public static void main(String[] args) {
Data_1 d1 = new Data_1(); // 컴파일러가 기본 생성자를 자동으로 생성해서 ok
Data_2 d2 = new Data_2(); // 에러. Data_2클래스에 기본 생성자가 없어서 compile error 발생
}
}
class Car {
String color;
String gearType;
int door;
Car() {} // 기본 생성자
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
class Ex {
public static void main(String[] args) {
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// 여러 줄로 iv를 초기화 하고 있음
Car c2 = new Car("black", "manual", 2); // 생성자 호출 시 초기화값을 넣으면 코드가 간결해진다
}
}
Car c2 = new Car("black", "manual", 2);
1) 참조변수 c2 선언
2) new 키워드로 객체 생성
3) Car("black", "manual", 2) 생성자를 호출하여 객체 초기화
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4); // Car(String color, String gearType, int door) 생성자를 호출함
// Car(color, "auto", 4); 이런 형태로 호출 시 method error 발생. this를 사용해야 함
}
Car(String color) {
this(color, "auto", 4); // 각각의 생성자에서 객체 초기화 로직을 구현하지 않아도 됨 (코드가 간결함)
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
Car(String c, String g, int d) {
color = c; // color -> iv, c -> lv
gearType = g; // 같은 클래스 안이라서 this를 생략가능
door = d;
}
Car(String color, String gearType, int door) {
this.color = color; // iv(this.color)에 lv(color)값을 저장
color = color; // lv에 lv를 저장
}
class MyMath {
long a, b; // this.a, this.b (진짜 이름)
MyMath(int a, int b) { // 생성자
this.a = a; // lv와 iv를 구별하기 위해 this. 사용, 생략불가
this.b = b;
}
long add() { // 인스턴스 메서드
return a + b; // return this.a + this.b; (this 생략가능)
}
static long add(long a, long b) { // 클래스 메서드 (static 메서드)
return a + b; // 여기서는 lv임, static 메서드에서는 iv 사용 불가
// this도 사용불가, 이유 : static 호출 시점에 iv존재 여부가 불투명함 (메모리에 존재여부 확인불가)
}
}
class InitTest {
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method1() {
int i; // 지역변수
int j = i; // 에러. lv를 초기화하지 않고 사용해서 안됨