Java

[중앙정보처리학원] Java* 객체지향 생성자, 접근제한자

해보구 2024. 4. 18. 13:54

생성자의 특징

  1. 생성자의 이름은 클래스의 이름과 대/소문자까지 완벽하게 동일해야 한다.
  2. 객체를 생성할 때 반드시 호출해야 한다.
  3. 일종의 메서드지만, 리턴 타입이 없고 리턴값은 주소값으로 고정되어 있음.
  4. 생성자를 하나도 선언하지 않으면, JVM이 매개변수가 없고, 내용이 없는 가장 기본 형태의 생성자를 하나 생성해 주기 때문에 생성자 선언 없이도 객체 생성은 가능하다.
  5. 객체를 생성하는 기능 뿐만 아니라, 객체 생성과 동시에 해야 할 일 (필드 초기화) 등을 진행할 수 있다.

 

접근제한자

package day07.encap;

public class Car {

    private String model; // 자동차 모델명
    private int speed; // 현재 속도
    private char mode; // 변속 모드 (D, N, R, P)
    private boolean start; // 시동이 걸린 여부



    // 생성자
    Car(String model) {
        this.model = model;
//        this.speed = 0;  안넣어도됨 int 의 기본값 0
        this.mode = 'P';
//        this.start = false; 안넣어도됨 boolean 의 기본값 false

    }

    // 엔진에 연료가 주입되는 기능
    private void injectGasoline() {
        if(start) {
            System.out.println("엔진에 연료가 주입됩니다.");
        } else {
            System.out.println("시동이 켜지지 않았습니다.");
            System.out.println("자동차가 폭발합니다");
        }
    }
    // 엔진오일이 순환하는 기능
    private void moveEngineOil() {
        System.out.println("엔진오일이 순환합니다.");

    }
    // 엔진 내부에 있는 실린더가 작동하는 기능
    private void moveCylinder() {
        System.out.println("엔진 내부 실린더가 왕복으로 움직입니다.");

    }

    // 시동 버튼을 누르는 기능
    public void startStop() {
        this.start = !this.start;
        if (start) {
            System.out.println("시동이 켜졌습니다. 운행준비를 시작합니다.");
            injectGasoline();
            moveEngineOil();
            moveCylinder();

        } else {
            System.out.println("시동이 꺼졌습니다. 다음에 다시 만나요~");
        }
    }

    // 현재 속도를 제한하는 메서드
    // setter 메서드 : 필드값을 안전하게 설정하기 위한 검증로직이 포함된 메서드
    public void setSpeed(int speed) {
        if (speed < 0 || speed > 200) {
            this.speed = 0;
            this.start = false;
            this.mode = 'P';
            System.out.println("제한 속도 위반으로 시동이 안전하게 꺼졌습니다.");
        } else {
            this.speed = speed;
        }
    }

    // 현재 속도값을 가져오는 메서드
    // getter : 정보은닉된 필드를 가져오는 대리 메서드
    public int getSpeed() {
        return speed;
    }

    // boolean 필드의 getter 는 이름관례가 다름 is + 필드명
    public boolean isStart() {
        return start;
    }

    public char getMode() {
        return mode;
    }

    public void setMode(char mode) {
        switch (mode) {
            case 'P': case 'N': case 'D': case 'R':
                this.mode = mode;
                break;
            default:
                this.mode = 'P';
        }

    }
}

 

순서대로 위에서 부터 클래스내에는 필드 / 생성자 / 메서드 가 있다고 보면 된다. 생성자의 이름은 클래스명과 같다는걸 기억하자.

하지만 메서드의 이름은 클래스명이랑 다르다. 

 

위 코드에서는 사용자가 접근할 수 있는 제한에 관한 학습을 했다. 예를들어 자동차가 있을 때 소비자들은 엔진의 내부까지 알 필요는 없듯

또 엔진의 어떤 설정을 바꾸어 차에 무리가 가도록 하지 않도록 제한을 걸어두듯 private 이라는 명령어를 앞에 붙여 제한시킬 수 있다.

좀 더 정확히 말하자면 숨기는 것이다. 하지만 숨겨진 정보를 기능들은 사용을 해야되니 메서드는 public으로 해준다. 

 

여기서 void 란 default 값을 말한다.  public, private 모두가 될 수 있는 상태이다. 

 

 // setter 메서드 : 필드값을 안전하게 설정하기 위한 검증로직이 포함된 메서드
    public void setSpeed(int speed) {
        if (speed < 0 || speed > 200) {
            this.speed = 0;
            this.start = false;
            this.mode = 'P';
            System.out.println("제한 속도 위반으로 시동이 안전하게 꺼졌습니다.");
        } else {
            this.speed = speed;
        }
    }

    // 현재 속도값을 가져오는 메서드
    // getter : 정보은닉된 필드를 가져오는 대리 메서드
    public int getSpeed() {
        return speed;
    }

setter 와 getter 를 이용해야 숨겨진 정보들을 불러올 수 있다.