본문 바로가기
BackEnd/Java

[Java] 오버로딩(Overloading), 생성자(Constructor)

by ryuneng 2025. 1. 15.
반응형

# 목적

: 오버로딩과 생성자에 대한 기초 개념 정리



1. 오버로딩(overloading)이란?

: 한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것

오버로딩 성립 조건

  1. 메서드 이름이 같아야 함
  2. 매개변수의 개수 또는 타입이 달라야 함
  3. 반환 타입은 영향 없음

오버로딩 예시

class overload {
	int test(int a, int b) { }
    int test(int x, int y) { } // 에러 - 조건 2번 불일치
    int test(long a, int b) { } // 가능 - 매개변수 타입이 다르기 때문에
    long test(int[] a) { } // 가능 - 매개변수 개수가 다르기 때문에(조건 3번으로 인해 long도 가능)
}




2. 생성자(constructor)란?

: 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드

* 인스턴스 = 객체 (=iv(인스턴스 변수) 묶음)

생성자 조건

  1. 이름이 클래스 이름과 같아야 함
  2. 리턴값이 없음 (void도 안붙임)
  3. 모든 클래스는 반드시 생성자를 가져야 함
  4. 모든 생성자는 첫 줄에 반드시 다른 생성자를 호출해야 함
    (그렇지 않으면 컴파일러가 생성자의 첫 줄에 자동으로 super();를 삽입)


1) 기본 생성자(default constructor)

: 매개변수가 없는 생성자

- 작성 예시

class Point{
	// 클래스이름() {} // 기본 생성자
	public Point() { // Point클래스의 기본 생성자
	}
}

- 생성자가 하나도 없을 때는 컴파일러가 자동으로 추가해줘서 생략 가능
(원래는 직접 추가해줘야 함)

class Data_1 { // 생성자 0개라서 컴파일러가 기본 생성자를 자동으로 추가해줌
	int value;
}

class Data_2 { // 생성자 1개 있기 때문에 기본 생성자 반드시 정의해야 함
	int value;
	
//  public Data_2() { } // 기본 생성자
	Data_2(int x) { // 매개변수가 있는 생성자
		value = x;
	}
}

class Ex {
	public static void main(String[] args) {
		Data_1 d1 = new Data_1();
		Data_2 d2 = new Data_2(); // compile error 발생 -> Data_2 클래스에 기본 생성자 있어야 만들어줘야 함
        						  // (주석 처리해놔서 없는 걸로 간주)
	}
}


2) 매개변수가 있는 생성자

- 작성 예시

public class Ex {
	public static void main(String[] args) {
		Car c = new Car();
		c.color = "white";
		c.gearType = "auto";
		c.door = 4;
		// 위의 4줄을 아래 1줄로 쓸 수 있음 -> 생성자의 장점
		Car c2 = new Car("black", "manual", 5);
		
		System.out.println(c.color + " " + c.gearType + " " + c.door);
		System.out.println(c2.color + " " + c2.gearType + " " + c2.door);
	}
	
}

class Car {
	String color;		// 색상
	String gearType;	// 변속기 종류 - auto(자동), manual(수동)
	int door;			// 문의 개수
	
	Car() {}						 // 기본 생성자
	Car(String c, String g, int d) { // 매개변수가 있는 생성자
		color = c;
		gearType = g;
		door = d;
	}
}


3) 생성자 this()

: 생성자에서 다른 생성자 호출할 때 사용
- 다른 생성자 호출 시 첫 줄에서만 사용 가능
- 작성 예시

class Car {
	String color;
	String gearType;
	int door;
	
//	Car() {
//		color = "white";
//		gearType = "auto";
//		door = 4;
//	}
	
	Car() { // 위의 세 줄을 아래 한 줄로 코드 중복 제거
		this("white", "auto", 4); // Car(String c, String g, int d) 호출
	}
	
	Car(String c, String g, int d) {
		color = c;
		gearType = g;
		door = d;
	}
}

* 참조변수 this와 생성자 this()의 차이

1. 참조변수 this
: 인스턴스 자신을 가리키는 참조변수로, 인스턴스의 주소가 저장되어 있음.
지역변수(lv)와 인스턴스변수(iv)를 구별할 때 사용하며, 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재 (선언하지 않고 사용 가능)

- 생성자, 인스턴스 메서드에서 사용 가능
- 클래스 메서드(static메서드)에서는 this 사용 불가 (클래스메서드에서는 iv 사용불가하니까)

2. this(), this(매개변수)
: 생성자로, 같은 클래스의 다른 생성자를 호출할 때 사용 (클래스 이름 대신 this())

this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것!
-> this는 '참조 변수' / this()는 '생성자'


4) 생성자 super()

: 조상의 생성자를 호출할 때 사용 (생성자, 초기화블럭은 상속안됨)
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
- 작성 예시

class Point {
	int x, y;
	
	Point() {	// 기본 생성자 작성 필수
		this(0, 0); // 생성자 첫 줄에 반드시 생성자 호출
	}
	
	Point(int x, int y) {
//		super(); // (컴파일러가 자동추가해줌) 	// 생성자 첫 줄에 반드시 생성자 호출
		this.x = x; // iv(인스턴스변수) 초기화
		this.y = y;
	}
}

class Point3D extends Point {
	int z;
	
	Point3D(int x, int y, int z) {
		super(x, y); // 조상클래스의 생성자 Point(int x, int y)를 호출
		this.z = z;	 // 자신의 멤버를 초기화
	}
}
* 참고 : 유튜브 [자바의 정석 기초]


 


< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >

🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Java-오버로딩-Overloading-생성자-Constructor