메서드 오버로딩 (overloading, 과적)

  • 한 클래스 안에 같은 이름의 메서드 여러개 정의하는 것
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에서 +기호는 부호, 덧셈, 문자열 결합 등으로 사용됨, 하나의 연산자로 여러 역할을 수행함

생성자 (constructor) - iv 초기화 메서드

  • 인스턴스 생성될 때 마다 호출되는 '인스턴스 초기화 메서드'
  • 인스턴스 생성 시 수행할 (iv 초기화) 작업에서 사용함
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)과 같은 생성자를 클래스에 추가해야 사용 가능

생성자 (constructor) 생성 규칙

  • 생성자 이름이 클래스 이름과 같아야 함
  • 리턴값 없음 (void 안 붙임)
  • 모든 클래스는 반드시 생성자(1개 이상)를 가져야 함
class Card {

	Card() {	// 기본 생성자 (매개변수 없는 생성자)
		... // 인스턴스 초기화 작업
	}
	
	Card(String kind, int number) {	// 매개변수 있는 생성자
		// 인스턴스 초기화 작업
		// 주로, 인스턴스 변수의 초기화 코드를 적음
	}
}

기본 생성자 (default constructor)

  • 매개변수가 없는 생성자
  • 생성자가 하나도 없을 때 컴파일러가 자동으로 추가함
클래스이름 () {}	// 기본 생성자 형태
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 발생
	}
}

매개변수가 있는 생성자 (constructor)

  • 매개변수 있는 생성자 호출 시 코드 간결화 가능
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) 생성자를 호출하여 객체 초기화

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용됨 (같은 클래스 안에서 호출 시)
  • 다른 생성자 호출 시 this 선언은 반드시 첫 줄에서만 사용 가능
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;
	}
}

참조변수 this

  • 인스턴스 자신을 가리키는 참조변수 (인스턴스의 주소가 저장됨)
  • 인스턴스 메서드(생성자 포함)에서 사용 가능 (모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재함)
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
  • this와 this()는 다름
  • this()는 같은 클래스의 다른 생성자를 호출할 때 사용함
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존재 여부가 불투명함 (메모리에 존재여부 확인불가)
	}
}

변수의 초기화

  • 지역변수(lv)는 수동 초기화(우리가 직접 초기화) 해야함 (사용하기전 꼭!!!)
  • 멤버변수(iv, cv)는 자동 초기화됨
class InitTest {
	int x;	// 인스턴스 변수
	int y = x;	// 인스턴스 변수
	
	void method1() {
		int i;	// 지역변수
		int j = i;	// 에러. lv를 초기화하지 않고 사용해서 안됨
profile
쳇바퀴도 바퀴다! 존나게 뛰자!!

0개의 댓글

Powered by GraphCDN, the GraphQL CDN