본문 바로가기
Programming Language/Java

[자바의 정석] ch6-30 ~ ch6-41 객체지향 개념 정리 (오버로딩, 생성자, 생성자 this(), 참조변수 this, 변수의 초기화)

by Baest 2021. 7. 16.

ch6-30 오버로딩(overloading)

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

(하나의 메서드 이름에 메서드 하나여야 하는데, 오버로딩은 하나의 메서드 이름에 여러개의 메서드)

 

- 오버로딩이 성립하기 위한 조건 (3가지)

1. 메서드 이름이 같아야함

2. 매개변수의 개수 또는 타입이 달라야함

3. 반환 타입은 영향 없음

 

보기1 (조건1만 성립-> 오버로딩 아님) -> 메서드 중복정의 

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

int add(int x, int y) { return x+y; }

 

보기2 (조건1만 성립-> 오버로딩 아님) -> 메서드 중복정의

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

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

 

보기3 (조건1, 조건2 성립) -> 오버로딩이지만 컴파일러가 어떤 메서드 호출하려고 했는지 (타입 때문에)모호하기 때문에 ambiguous 에러

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

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

 

 

ch6-31 오버로딩(overloading) - 예제

- 오버로딩의 올바른 예: 매개변수는 다르지만 같은 의미의 기능 수행

 

 

ch6-32 생성자(constructor)

- iv 초기화 메서드

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

- 이름이 클래스 이름과 같아야함

- 리턴값이 없음(void 안붙임)

- 모든 클래스는 반드시 생성자(한 개 이상)를 가져야함

*생성자가 하나도 없을 때 컴파일러가 기본 생성자 추가해줌

 

Time t = new Time(); ----> 객체 생성

t.hour = 12;

t.minute = 34;

t.second = 56;

 

-> 위의 코드를 아래와 같이 한 줄로 바꿀 수 있음

Time t = new Time(12, 34, 56); 

                   ------------------ 생성자 호출

 

 

ch6-33 기본 생성자(default constructor)

- 매개변수가 없는 생성자

- 생성자가 하나도 없을 때만, 컴파일러가 기본 생성자 자동 추가

*모든 클래스는 반드시 1개 이상의 생성자가 있어야함 (이 규칙을 지키기 위해서 생성자가 자동 추가해줌)

 

클래스이름() { } // 기본 생성자

Pint() { }          // Poinit 클래스의 기본 생성자

 

 

ch6-34 매개변수가 있는 생성자

 

Car c = new Car();

c.color = "white";             -----> Car c = new Car("white", "auto", 4);

c.gearType = "auto";                   1  4        2                          3

c.door = 4;

 

                                          1. 참조변수 c 만들어짐

                                                     2. 객체 생성

                                                          3. 객체 초기화("white", "auto", 4), 생성자 호출(Car("white", "auto", 4))

                                                    4. 대입 (객체와 참조변수 연결)

 

 

ch6-36 생성자 this()

- 생성자에서 다른 생성자 호출할 때 사용

- 다른 생성자 호출 시 첫 줄에서만 사용 가능

 

 

ch6-37 참조변수 this

- 생성자 this() 와 연관 없음

- 인스턴스 자신을 가리키는 참조변수

- 인스턴스 메서드(생성자 포함)에서 사용 가능

- 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

 

 

<-------------------------------------------------------------정리------------------------------------------------------------->

- this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있음       모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재

 

- this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자 호출할 때 사용

 

*this와 this()는 비슷하게 생겼을 뿐 완전 다른 것. this는 '참조변수'이고, this()는 '생성자'임

 

 

ch6-38 변수의 초기화

- 지역변수(lv)는 수동 초기화 해야함(사용전 꼭!)

- 멤버변수(iv, cv)는 자동 초기화됨

 

class InitTest {

     int x;               // 인스턴스 변수  (자동)

     int y = x;         // 인스턴스 변수

 

     void method1() {

          int i;           // 지역변수  (수동)

          int j = i;      // 에러. 지역변수를 초기화하지 않고 사용

     }

 

}

 

 

ch6-39 멤버변수의 초기화

 

- 클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 단 한번 (메모리에 올라갈 때)

- 인스턴스 변수 초기화 시점: 인스턴스가 생성될 때 마다

 

1. 명시적 초기화(=) -> 대입연산자 (선언 시)

 

2. 초기화 블럭 -> 복잡한 초기화 여러문장 넣기

- 클래스 초기화 블럭 : static { }

- 인스턴스 초기화 블럭 : { }

 

3. 생성자 -> iv 초기화, 복잡한 초기화

 

-------------------------------------------------------*cv, iv 초기화1. 자동초기화 : 02. 간단초기화 : =3. 복잡초기화 : { } -> 거의 안씀   - cv 초기화-> static { }   - iv 초기화-> 생성자

 

<-------------------------------------------------------------정리------------------------------------------------------------->

1. cv 초기화 -> iv 초기화 (초기화 시점)

2. 자동 -> 간단 -> 복잡 (초기화 순서)

 

 

 

============================================================================

https://youtu.be/2rDeHSO4bdw