자바의 정석 -(6장 객체지향 I-2)

김우경·2022년 2월 20일
0

Java

목록 보기
5/9
post-thumbnail

6장 2번째

가끔 헷갈리는 부분만 요약한 것입니다

4. 오버로딩

메서드 오버로딩 (오버로딩)
한 클래스 내에 같은 이름의 메서드를 어러 개 정의하는 것
같은 이름을 가진 메서드라도 매개변수의 개수, 타입이 다르면 정의가능
조건*
메서드 이름이 같고, |매개변수의 개수 또는 타입이 달라야 한다.|
반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다!

4.5 가변인자와 오버로딩

5. 생성자

생성자는 인스턴스가 생성될때 호출되는 |인스턴스 초기화 메서드|

  • 인스턴스 초기화 : 인스턴스변수들을 초기화하는 것

생성자 역시 메서드처럼 클래스 내에 선언된다. 구조도 비슷하지만 |리턴값이 없다|

조건
1.   생성자의 이름은 클래스의 이름과 같아야한다.
2.   생성자는 리턴 값이 없다.

연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

Card c = new Card();
1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

5.2 기본생성자

모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 잇다.
*.java 파일을 컴파일 할 때, 컴파일러는 자동적으로 기본 생성자를 추가한다.
기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

5.3 매개변수가 있는 생성자

package ch6;
//매개변수가 있는 생성자
class Car {
String color; // 색상
String gearType; // 변속기 종류 - auto(자동), manual(수동)
int door; // 문의 개수
Car() {}
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;
Car c2 = new Car("white", "auto", 4);
System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
}
}

5.4 생성자에서 다른생성자 호출하기 - this(), this

조건
1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
  모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
this(),this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
즉 this는 '참조변수', this()는 '생성자'이다.

6. 변수의 초기화

ex)
class InitTest {
int x;     //인스턴스변수
int y = x;     //인스턴스변수

void method1(){
int i;     //지역변수
int j = i;     //에러. 지역변수를 초기화하지 않고 사용
 }
}

멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.

class BlockTest {
// 실행해서 순서 보기
static {
System.out.println("static { }");
//클래스 초기화 블럭
}

{
System.out.println("{ }");
//인스턴스 초기화 블럭
}

public BlockTest() {
System.out.println("생성자");
}

public static void main(String args[]) {
System.out.println("BlockTest bt = new BlockTest(); ");
BlockTest bt = new BlockTest();

System.out.println("BlockTest bt2 = new BlockTest(); ");
BlockTest bt2 = new BlockTest();
}
}

클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되며, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.

  • 클래스 초기화 블럭은 인스턴스 초기화 블럭앞에 단순히 static을 덧붙이기만 하면 된다.

    6.4 멤버변수의 초기화 시기와 순서

    클래스변수의 초기화시점 : 클래스가 첨음 로딩될 때 단 한번 초기화 된다.
    인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

    클래스변수의 초기화순서 : 기본값 -> 명시적초기화(직접값 설정) -> 클래스 초기화 블럭
    인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화(직접값 설정) -> 인스턴스 초기화 블럭 -> 생성자

0개의 댓글