반응형
# 목적
: 오버로딩과 생성자에 대한 기초 개념 정리
1. 오버로딩(overloading)이란?
: 한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것
오버로딩 성립 조건
- 메서드 이름이 같아야 함
- 매개변수의 개수 또는 타입이 달라야 함
- 반환 타입은 영향 없음
오버로딩 예시
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(인스턴스 변수) 묶음)
생성자 조건
- 이름이 클래스 이름과 같아야 함
- 리턴값이 없음 (void도 안붙임)
- 모든 클래스는 반드시 생성자를 가져야 함
- 모든 생성자는 첫 줄에 반드시 다른 생성자를 호출해야 함
(그렇지 않으면 컴파일러가 생성자의 첫 줄에 자동으로 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
'BackEnd > Java' 카테고리의 다른 글
[Java] 다형성(Polymorphism) 정리 (0) | 2025.01.15 |
---|---|
[Java] 접근 제어자(access modifier) (Feat. 캡슐화) (0) | 2025.01.15 |
[Java] static, instance 변수/메서드 정리 (0) | 2025.01.15 |
[Java] 객체지향 프로그래밍(Object-Oriented Programming, OOP) (0) | 2025.01.15 |
[Java] 원시타입(Primitive type)과 참조타입(Reference type) - 용어 정리 (0) | 2025.01.15 |