본문 바로가기
컴퓨터 프로그래밍/Java

[Java] this와 this(), 접근 제어자, package와 import

by 한33 2024. 7. 29.

this

this 는 객체, 인스턴스 자기 자신을 표현하는 키워드

객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용

public Car(String model, String color, double price) {
            model = model;
            color = color;
            price = price;
        }

 

이렇게 생성자를 선언하는데 매배변수명과 객체의 필드명이 동일한 경우 오류는 발생 안하지만 해당 변수들은 객체의 필드가 아닌 가장 가까운 매개변수명을 가리킴. → 자기 자신에게 값을 대입하는 상황이 일어남

 

public Car(String model, String color, double price) {
            this.model = model;
            this.color = color;
            this.price = price;
        }

 

이럴 때 this  를 이용해서 객체의 필드로 접근.

 

Car returnInstance() {
    return this;
}

 

또한 인스턴스 자신을 뜻하기 때문에 객체의 메서드에서 리턴 타입이 인스턴스 자신의 클래스 타입이라면 this 사용으로 자신의 주소 반환 가능

 

public Car(String model) {
            this.model = model;
            this.color = "Blue";
            this.price = 50000000;
        }

public Car(String model, String color) {
            this.model = model;
            this.color = color;
            this.price = 50000000;
        }

public Car(String model, String color, double price) {
            this.model = model;
            this.color = color;
            this.price = price;
        }

 

위 코드의 중복을 줄이기 위해서

 

public Car(String model) {
            this(model, "Blue", 50000000);
        }

public Car(String model, String color) {
            this(model, color, 100000000);
        }

public Car(String model, String color, double price) {
            this.model = model;
            this.color = color;
            this.price = price;
        }

 

위 처럼 this() 를 이용할 수 있다.

 


접근 제어자

제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미 부여

하나의 대상에 여러 제어자를 조합할 수 있는데 접근 제어자는 하나만 사용 가능

( 보통 public 과 private 가 많이 사용됨 )

  • 접근 제어자를 이용한 캡슐화 (은닉성)
    • 접근제어자는 클래스 내부에 선언된 데이터를 보호하기 위해서 사용
    • 유효한 값을 유지하도록, 함부로 변경하지 못하도록 접근을 제한하는 것이 필요
  • 생성자의 접근 제어자
    • 생성자에 접근 제어자를 사용함으로 인스턴스의 생성을 제한
    • 일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치

Getter 와 Setter 

  • 객체의 무결성 즉, 변경이 없는 상태를 유지하기 위해 접근 제어자를 사용
  • 외부에서 필드에 직접 접근하는 것을 막기 위해 필드에 private, default 등의 접근 제어자를 사용할 수 있음
  • 이렇게 보호된 객체에 접근해서 값을 가져오고 들여보내기 위해 안정된 방법인 Getter 와 Setter 사용

Getter

외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 사용

 

private double speed;  // 자동차 속도 , km/h
private char gear = 'P'; // 기어의 상태, P,R,N,D
private boolean lights; // 자동차 조명의 상태

 

public String getModel() {
    return model;
}

public String getColor() {
    return color;
}

public double getPrice() {
    return price;
}

 

private 로 선언이 되면 같은 클래스 내에서만 접근이 가능하지만, 외부에서 사용을 할 일이 있는 경우에

클래스 내부에 위와 같이 get에 대문자로 시작하는 메소드를 만들어준다.

그럼 외부에서 해당 메소드를 사용해서 원하는 필드를 읽어낼 수 있게된다.

 

Setter

외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드를 사용

public void setModel(String model) {
    this.model = model;
}

public void setColor(String color) {
    this.color = color;
}

public void setPrice(double price) {
    this.price = price;
}


package 와 import

package

package oop.main;

        public class Main {
            public static void main(String[] args) {
                oop.pk1.Car car = new oop.pk1.Car();
                car.horn(); // pk1 빵빵

                oop.pk2.Car car2 = new oop.pk2.Car();
                car2.horn(); // pk2 빵빵
            }
        }

 

opp.pk1.Car 처럼 패키지의 경로를 적어주면서 같은 Car 이름의 클래스를 다른 파일로부터 불러오면서 구분할 수 있다.

 

import

package oop.main;

import oop.pk1.Car;

        public class Main {
            public static void main(String[] args) {
                Car car = new Car();
                car.horn(); // pk1 빵빵

                oop.pk2.Car car2 = new oop.pk2.Car();
                car2.horn(); // pk2 빵빵
            }
        }

 

클래스 명이 Car 로 같기 때문에 똑같이 import  해서는 pk1, pk2 의 Car 클래스를 둘 다 쓸 수가 없고, 만약에 쓰려면 한 쪽에서는 package 경로를 적으면서 사용해 구분해줘야한다.

'컴퓨터 프로그래밍 > Java' 카테고리의 다른 글

[Java] 인터페이스  (0) 2024.07.30
[Java] 상속  (0) 2024.07.29
[Java] 생성자  (0) 2024.07.28
[Java] 인스턴스 멤버와 클래스 멤버  (0) 2024.07.26
[Java] 필드와 매서드  (0) 2024.07.26