본문 바로가기
내일배움캠프(Sparta)/Java Handbook

[Java Handbook] Part 5-4

by mmm- 2023. 9. 13.

1. 생성자

생성자

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

  • 인스턴스 생성시 수행할 작업에 사용됨
  • 초기값이 필요한 인스턴스 변수의 값을 초기화 해줌

생성조건

  • 이름이 클래스 이름과 같아야 함
  • return 값이 없어야 함
  • void는 붙이지 않음
  • 오버로딩 가능

 

기본생성자

: 매개변수가 없는 생성자

  • 생성자가 하나도 선언되어 있지 않았을 때는 컴파일러가 자동으로 추가해줌
  • 기본 생성자는 없고 오버로딩한 생성자만 있을 경우 컴파일러가 기본 생성자를 만들어주지 않기 때문에 기본 생성자를 사용하려고 하면 Error 발생함
class Tv9_1 {
	// 속성: 변수 선언
    boolean power; // 전원상태
    int channel;  // 채널
    String color; // 색깔
    long price; // 가격

    // 기본 생성자
    public Tv9_1() {
        power = false;
        channel = 1;
    }

    // 오버로딩 한 생성자 - 매장 진열용일 경우, 가격과 색깔의 초기화가 필요
    public Tv9_1(String color, long price) {
        power = false; // this.power, power 둘다 지금 상황에서는 인스턴스 변수를 명확하게 판단할 수 있어 어떤걸 사용해도 상관 X
        channel = 1;
        this.color = color;
        this.price = price;
    }

    // 기능: 메서드 선언
    void power() {  // 전원 기능
        power = !power;
        if (power) {
            System.out.println("전원 ON");
        } else {
            System.out.println("전원 OFF");
        }
    }

    void channelUp() { // 채널 증가
        channel++;
        System.out.println("채널 증가");
    }

    void channelDown() { // 채널 감소
        channel--;
        System.out.println("채널 감소");
    }

}

class Tv9_1Main {
    public static void main(String[] args) {
        // 기본 초기화된 Tv9_1 생성
        Tv9_1 tv = new Tv9_1();
        System.out.print("기본 생성자 TV: ");
        tv.power();

        // 진열 용 Tv9_1 생성
        Tv9_1 exTv = new Tv9_1("보라색", 3456789);
        System.out.print("오버로딩 생성자 TV: ");
        exTv.power();
        System.out.println("exTv.color = " + exTv.color);
        System.out.println("exTv.price = " + exTv.price);
    }
}

2. this

this

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

  • 인스턴스 메서드(생성자 포함)에서 사용 가능
  • 지역 변수와 인스턴스 변수를 구별할 때 사용
class Tv10_1 {
    // 속성: 변수 선언
    boolean power; // 전원상태
    int channel;  // 채널
    String color; // 색깔
    long price; // 가격

    // 기본 생성자
    public Tv10_1() {
        this.power = false;
        this.channel = 1;
    }

    //  오버로딩 한 생성자 - 매장 진열 용 일 경우에는 가격과 색깔의 초기화가 필요
    public Tv10_1(String color, long price) {
        this.power = false;
        this.channel = 1;
        this.color = color;
        this.price = price;
    }

    // 기능: 메서드 선언
    void power() {  // 전원 기능
        this.power = !power;
        if (this.power) {
            System.out.println("전원 ON");
        } else {
            System.out.println("전원 OFF");
        }
    }

    void channelUp() { // 채널 증가
        this.channel++;
        System.out.println("채널 증가");
    }

    void channelDown() { // 채널 감소
        this.channel--;
        System.out.println("채널 감소");
    }

    // 색깔을 수정하고 자기 자신을 반환하는 메서드
    Tv10_1 changeColor(String color) { // 반환 타입으로 자기자신인 Tv 선언
        this.color = color;
        System.out.println("색깔 변경 완료!");
        return this; // this는 자기 자신을 가리키는 참조변수
    }

}

class Tv10_1Main {
    public static void main(String[] args) {
        // 기본 초기화된 Tv10_1 생성
        Tv10_1 tv = new Tv10_1();
        System.out.print("기본 생성자 Tv10_1: ");
        tv.power();

        // 진열용 Tv10_1 생성
        Tv10_1 exTv = new Tv10_1("보라색", 3456789);
        System.out.print("오버로딩 생성자 Tv10_1: ");
        exTv.power();
        System.out.println("exTv.color = " + exTv.color);
        System.out.println("exTv.price = " + exTv.price);
        System.out.println();

        // 진열용 Tv10_1의 색깔을 수정하고 수정된 객체를 참조변수에 저장
        Tv10_1 exTvThis = exTv.changeColor("파란색");
        
        // 색깔이 변경된 Tv의 주소가 저장된 참조변수 exTvThis를 사용해 변경된 색깔 확인
        System.out.println("색깔이 변경되었는지 확인 exTvThis.color : " + exTvThis.color);
        System.out.println("exTv.color = " + exTv.color);
    }
}

3. this()

this()

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

class Tv10_2 {
    // 속성: 변수 선언
    boolean power; // 전원상태
    int channel;  // 채널
    String color; // 색깔
    long price; // 가격

    // 기본 생성자
    public Tv10_2() {
        this.power = false;
        this.channel = 1;
    }

    // 오버로딩 한 생성자 - 매장 진열 용 일 경우에는 가격과 색깔의 초기화 필요
    public Tv10_2(String color, long price) {
        // 이럴 때 this() 사용
        // this.power = false;
        // this.channel = 1;

        this(); // 기본 생성자 호출
        // Tv10_2() // 이렇게는 불가능함

        this.color = color;
        this.price = price;

        // this(); // 생성자 호출은 반드시 첫 줄에서만 가능
    }

    // 기능: 메서드 선언
    void power() {  // 전원 기능
        this.power = !power;
        if (this.power) {
            System.out.println("전원 ON");
        } else {
            System.out.println("전원 OFF");
        }
    }

    void channelUp() { // 채널 증가
        this.channel++;
        System.out.println("채널 증가");
    }

    void channelDown() { // 채널 감소
        this.channel--;
        System.out.println("채널 감소");
    }

    // 색깔을 수정하고 자기 자신을 반환하는 메서드
    Tv10_2 changeColor(String color) { // 반환 타입으로 자기자신인 Tv 선언
        this.color = color;
        System.out.println("색깔 변경 완료!");
        return this; // this는 자기 자신을 가리키는 참조변수
    }
}

class Tv10_2Main {
    public static void main(String[] args) {
        // 기본 초기화된 Tv10_2 생성
        Tv10_2 tv = new Tv10_2();
        System.out.print("기본 생성자 Tv10_2: ");
        tv.power();

        // 진열용 Tv10_2 생성
        Tv10_2 exTv = new Tv10_2("보라색", 3456789);
        System.out.print("오버로딩 생성자 Tv10_2: ");
        exTv.power();
        System.out.println("exTv.color = " + exTv.color);
        System.out.println("exTv.price = " + exTv.price);
        System.out.println();

        // 진열용 Tv10_2 의 색깔을 수정하고 수정된 객체를 참조변수에 저장
        Tv10_2 exTvThis = exTv.changeColor("파란색");
        
        // 색깔이 변경된 Tv의 주소가 저장된 참조변수 exTvThis 를 사용하여 변경된 색깔 확인
        System.out.println("색깔이 변경되었는지 확인 exTvThis.color : " + exTvThis.color);
        System.out.println("exTv.color = " + exTv.color);
    }
}

4. 변수의 초기화

수동/자동 초기화

  • 지역변수는 수동으로 초기화 해야 함
    • 지역변수가 동작하는 스택 메모리는 재사용이 빈번하기 때문에 매번 초기화해주면 성능이 떨어져서 해당 메모리에 있는 값으로 덮어 씌움.
      근데 해당 주소에 어떠한 값이 있는지 모르기 때문에 Java는 개발자에게 수동으로 초기화하라고 요구함
  • 멤버변수(인스턴스 변수, 클래스 변수)는 자동으로 초기화됨

 

멤버변수의 초기화

  • 클래스 변수: 클래스가 처음 로딩될 때 단 한 번만 초기화 됨
  • 인스턴스 변수: 인스턴스가 생성될 때마다 초기화 됨

5. 초기화 방법

명시적 초기화 (=)

class Tv11_1 {
    boolean power = false;    // 기본형 변수의 초기화
    int channel = 1;          // 기본형 변수의 초기화
    //Audio audi = new Audio(); // 참조형 변수의 초기화 / 참조형은 객체주소 or null 로 초기화
    // 참조형의 기본값은 null
}

 

초기화 블럭

class Tv11_2 {
    static boolean power;
    int channel;

    // 클래스 초기화 블럭
    static
    {
        power = false;
    }

    // 인스턴스 초기화 블럭
    {
        channel = 1;
    }
}

 

생성자 초기

class Tv11_3 {
    // 속성: 변수 선언
    boolean power; // 전원상태
    int channel;  // 채널
    String color; // 색깔
    long price; // 가격

    // 기본 생성자
    Tv11_3() {
        this.power = false;
        this.channel = 1;
    }
}

'내일배움캠프(Sparta) > Java Handbook' 카테고리의 다른 글

[Java Handbook] Part 5-3  (0) 2023.09.13
[Java Handbook] Part 5-2  (0) 2023.09.13
[Java Handbook] Part 5-1  (0) 2023.09.12
[Java Handbook] Part 4-2  (0) 2023.09.12
[Java Handbook] Part 4-1  (0) 2023.09.12