[Java] Java의 정석 정리 (메소드 오버로딩, 생성자)

송병훈·2022년 9월 22일
0

자바의 정석

목록 보기
2/15


메소드 오버로딩 (Method Overloading)

이번에는 구어체로 정리해볼게요?

자 오버로딩과 오버라이딩. 많이들 들어보셨나요?
이번에는 오버로딩 먼저 배워봅시다.

오버로딩을 설명하기 위해 println 메소드를 예시로 들어볼게요.

void println()
void println(boolean 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)

자! 무엇이 같고, 무엇이 다른지 보이시나요?
네 맞습니다. 메소드명은 같은데, 매개변수가 다르죠?
또한 println() 메소드는 출력하는 기능을 담당하죠.

네. 메소드 오버로딩이란,

같은 이름, 다른 매개변수로 다양한 메소드를 만들어
메소드에 다양한 매개변수가 들어와도 같은 기능을 할 수 있도록 하는 것입니다.

오버로딩을 하기 위해 지켜야 할 규칙을 정리하면 다음과 같습니다.

  1. 매소드의 이름이 같아야 합니다.
  2. 매개변수의 개수 or 타입이 달라야 합니다.
  3. 1번과 2번 조건을 만족하고, 리턴타입이 다르다고 오버로딩이 되는 것은 아닙니다.

오버라이딩은 상속 이후에 다뤄보겠습니다!! 슈웅~


생성자 (Constructor)

자 저번 시간에 클래스와 객체에 대해서는 공부했었죠?
Java를 시작하면 매~~앤 처음에 변수의 선언과 초기화를 배우구요.

자 이번에는 위 두 개념을 합쳐볼거예요!

클래스를 만듭니다. 이 안에는 변수와 메서드가 선언되겠죠?
그 중에서 변수를 볼게요. 변수가 선언만 되고, 값이 안 들어가 있는 상황이에요.
이제 값을 넣을 건데...

'아.. 객체를 생성한 후에, 내가 일일히 변수에 값을 넣어줘야 하나?
c.kind = "Heart"; 매번 이러면 너무 귀찮아...ㅠㅠ
더 좋은 방법은 없을까?'

있습니다. 바로 생성자를 이용하는 것이죠

생성자가 뭔데??

  • 인스턴스가 생성될 때마다 기본으로 호출되는 '인스턴스 초기화 메소드'
  • 인스턴스 변수의 초기화 or 인스턴스 생성과 동시에 수행할 기능이다.
  • ※ 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

자 설명이 부족하죠? 하나씩 살펴 보자구요.

Card card = new Card();

Card 클래스의 참조변수(주소를 저장하는 변수)를
card라는 이름으로 만들었어요.
그리고 new Card(); 로 인스턴스를 만들었어요.
그럼 이 인스턴스의 주소값이 card에 저장돼요.

new 가 인스턴스를 생성하는 키워드라면 Card() 는 뭘까요?

Card() 가 생성자에요.
클래스 이름이랑 똑같은 메소드의 형태죠.

즉, Card card = new Card(); 이 코드는

Card() 생성자가 시키는대로 new (새로운) 인스턴스를 만들자!!
그리고 이 인스턴스의 주소를 참조변수 card 에 넣어주자!!
그럼 참조변수를 통해 인스턴스의 멤버(변수,메소드)들을 다룰 수 있어!!
데이터를 담아서 활용하거나, 특정 기능을 수행시킬 수 있다고!!

이런 의미입니다.

근데, 위에서 이런 말을 했어요.

※ 모든 클래스에는  반드시 하나 이상의 생성자가 있어야 한다.

하지만 전에는 생성자를 안 적었단 말이죠?

그 이유는 생성자를 클래스에 작성하지 않아도,
컴파일러가 기본 생성자 Card() {} 를 생성해주기 때문이에요.
( 매개변수가 없는 생성자가 기본 생성자야 )

근데, 매개변수가 있는 생성자를 써놓잖아요? Card(String x) {}
그럼 컴파일러는 기본 생성자를 만들어 주지 않아요.
이미 생성자가 있으니까 기본 생성자를 만들 필요를 못 느끼는 거죠

근데 기본 생성자가 없으면 나중에 에러가 발생할 수 있어요.
앞으로는 클래스를 생성할 때 기본 생성자를 직.접. 적어주자고요!

한 번 매개변수가 있는 생성자의 예시를 볼까요?

class Car {
	String color;		// 차의 색
    String gearType;	// 차의 기어유형
    int door;			// 차 문의 개수
    
    Car () {}	// 기본 생성자
    
    Car(String color, String gearType, int door) {	// 매개변수가 있는 생성자
    	this.color = color;	//this.color은 인스턴스변수, color은 매개변수로 받아온 지역변수다.
        this.gearType = gearType;
        this.door = door;
    }
}

Car c1 = new Car();
Car c2 = new Car("white","auto",4);
  • c1은 기본 생성자를 통해 인스턴스가 만들어지죠.
    이러면 변수에 값을 저장하는 코드를 직접 작성해야 돼죠.

  • c2는 매개변수가 있는 생성자를 통해 인스턴스를 만들었어요.
    "white","auto",4 가 각각 color, gearType, door에 저장된 채로 인스턴스가 만들어지죠.
    이렇게 인스턴스변수를 생성과 동시에 초기화 시킬 수 있어요.

아까 봤던 생성자 설명

  • 인스턴스가 생성될 때마다 기본으로 호출되는 '인스턴스 초기화 메소드'
  • 인스턴스 변수의 초기화 or 인스턴스 생성과 동시에 수행할 기능이다.
  • ※ 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

이제 이해가 좀 되죠?
축하해요. 우리 모두 한 걸음 더 나아갔어요.
다음에 또 만나요~

profile
성실하고 꼼꼼하게

0개의 댓글