자바 (Java)/요약

Chpt 6. 객체 지향 프로그래밍 - 주제 5. 생성자는 변수 초기화 메서드이다.

학듄 2023. 10. 24. 17:24
728x90

1. 오버로딩 (Overloading)

 

원래 메서드와 메서드 이름의 관계는 일대일이지만 필요에 따라 일대다의 관계도 가능하다. 이를 오버로딩 말 그대로 메서드에 다른 이름들을 쌓은 형태라 생각하면 된다. 오버로딩의 대표적인 예는 println 메서드이다. 다음은 오버로딩의 조건이다.

 

(1) 메서드 이름이 같다.
(2) 매개변수의 이름은 관계 없고, 개수 또는 타입이 달라야 한다.
(3) 반환 타입은 관계 없다.
(4) 매개변수의 개수와 타입 종류의 개수가 같은 경우 위치가 달라야 한다.

 

아래 [예 1]은 (4)를 보여주는 예시다.

 

[예 1]

 

long add(int a, long b) { return a + b; }
long add(long a, int b) { return a + b; }

 

위와 같은 경우 (3)에 부합하는 예이다. 이때 add(4, 5)를 호출하면 컴파일 에러가 발생하는데, 둘 중 어떤 메서드를 호출해야 할 지 모르기 때문이다. 따라서 long add(int a, int b) 메서드를 따로 정의해주어야 한다.

 

2. 생성자

 

생성자는 객체가 생성될 때 제일 먼저 호출되는 초기화 메서드이다. 생성자의 조건은 다음과 같다.

 

(1) 생성자 이름 = 클래스 이름
(2) 생성자는 항상 리턴 값이 없다. => void 생략
(3) 모든 클래스는 반드시 하나의 생성자가 있다.

 

생성자도 메서드이기 때문에 오버로딩이 가능하다. (3)의 경우 생성자가 하나도 없으면 컴파일러가 매개 변수가 없는 기본 생성자(클래스 이름() {})를 추가해주지만 습관적으로 기본 생성자를 넣어주는 것이 좋다.

 

[참고 1] 인스턴스를 생성하는 것은 new 연산자이지 생성자가 아니다.

 

[참고 2] 생성자가 존재하는 경우 컴파일러는 기본 생성자를 추가해주지 않는다.

 

1) 매개변수가 있는 생성자의 필요성

 

매개 변수가 있는 생성자를 사용하면 코드를 아래와 같이 간결하게 쓸 수 있다. 

 

Car c = new Car();
c.color = "black";
c.package = "prestige";
c.type = "electric";
Car c = new Car("black", "prestige", "electric);

 

오른쪽 코드가 실행되는 순서는 다음과 같다. 먼저 참조 변수 c가 선언된다. new 연산자를 통해 객체가 생성되고, 인자의 값대로 객체의 맴버가 초기화가 된다. 그리고 객체의 주소가 반환되며 그 값이 c에 대입된다. 정리하면 다음과 같다.

 

(1) 참조 변수 선언
(2) new 연산자 → 인스턴스가 메모리의 힙에 생성
(3) 생성자 → 멤버 초기화
(4) 객체 주소 반환, 참조 변수에 대입

 

2) 같은 클래스 내에서의 생성자 또는 참조변수

 

1) 생성자 this()

 

(1) 같은 클래스 안에서 생성자를 호출할 경우 반드시 클래스 이름 대신 this를 사용한다.
(2) 한 생성자에서 다른 생성자를 호출할 경우 반드시 첫 줄에서만 호출할 수 있다.

 

(2)에서 만약 첫 줄이 아닌 경우에서 생성자를 호출할 경우 이전의 초기화 작업이 무색해질 수 있기 때문이다.

 

2) 참조 변수 this

 

this는 인스턴스 자기 자신을 가르키는 참조 변수라 생각하면 된다. 보통 인스턴스 변수와 지역 변수를 구분할 때 사용되며 인스턴스 메서드(생성자 포함) 안에 참조 변수 형태로 숨겨져 있기 때문에 선언하지 않아도 된다. 참고로 인스턴스 변수의 진짜 이름은 this.iv이지만 this.은 생략 가능하다.

 

[참고]

this는 인스턴스 자기 자신을 가리킨다. 따라서, static 메서드를 호출할 때 인스턴스가 생성이 안된 경우가 있을 수도 있기 때문에 static 메서드는 this를 사용할 수 없다. 

 

3) this() vs. this

 

애초에 관계가 없으며 this()는 생성자, this는 인스턴스 자기 자신을 가리키는 참조 변수라고 알아두자.

반응형