접근제한자(feat.getter,setter)🙆‍♂️

김민제·2023년 10월 18일
0
post-thumbnail

접근제한자

  • 자바는 클래스, 메소드, 필드 등에 사용하여 외부에서의 접근을 제한하는 접근제한자가 있다!
  • 자바의 접근제한자는 public, protected, default, private가 있다.
  • 접근제한자에 대해서 알아보자!

접근제한자의 종류

  • public : 모든 접근을 허용
  • protected : 같은 패키지에 있는 클래스와 자식의 클래스들만 허용
  • default : 같은 패키지에 있는 클래스들만 허용
  • private : 현재 클래스 내에서만 허용
  • 접근제한자의 적용 대상과 접근 가능 대상을 표로 알아보자.
접근 제한자적용 대상접근 가능 대상
public클래스, 메소드, 생성자, 필드모든 접근
protected메소드, 생성자, 필드같은 패키지에 있는 클래스
자식의 클래스
default클래스, 메소드, 생성자, 필드같은 패키지에 있는 클래스
private메소드, 생성자, 필드private이 선언된 클래스 내부
  • 기본적으로 아무 선언을 해주지 않으면 default 선언이 된다.

클래스 사용 접근제한자

  • 다른 메소드, 생성자, 필드는 모든 접근제한자를 사용할 수 있지만 클래스에는 public 접근 제한자와 default 접근 제한자만 사용할 수 있다.
  • public을 선언해주면 다른 패키지에서도 아무런 제한 없이 사용할 수 있기 때문에 다른 개발자가 사용하도록 라이브러리 클래스로 개발 시 주로 이용한다.
  • default 선언을 해주거나 아무 선언도 하지않으면 default 클래스가 된다. default 클래스는 같은 패키지 내에서만 사용 가능하다.

  • 클래스에서 필드를 private로 선언해주면 죽어도 클래스 외부에서 접근이 불가능한걸까,,,
  • 아니다! 놀랍게도 필드를 외부에서 직접 접근이나 변경은 못하게 하고 메소드를 통해 접근, 변경을 할 수 있는 방법이 있다!

getter,setter 메소드

  • 객체 지향 프로그래밍에서는 객체의 데이터를 외부에서 읽고 변경 시 객체의 무결성이 깨질 수도 있기 때문에 메소드를 통해 데이터를 변경하는 방법을 선호한다.
  • 데이터는 외부에서 접근하지 않도록 막고 메소드는 공개하여 외부에서 메소드를 통해 데이터에 접근할 수 있도록 유도한다.
    • 메소드는 매개변수의 타입을 검증하여 유효한 값만 데이터에 저장할 수 있다는 장점도 있다.
  • 이 때 값을 저장해주는 메소드가 setter메소드이고, 값을 반환해주는 메소드가 getter메소드이다.
  • 우선 객체의 데이터를 외부에서 접근할 수 있는 아주아주아주 안좋은 방식을 한번 알아보자.
public class Book {
    public int price = 50;
		private int i ;
}

public class BookExam {
    public static void main(String[] args) {
        Book b1 = new Book();
        b1.price=100;
        System.out.println(b1.price); 
				// 100 이렇게 직접 접근하는 것은 안좋기 때문에 필드에 private 접근자를 사용함
		    b1.i=50; // 오류

	}
}
  • 위와 같이 price 값이 public으로 선언되어 있기 때문에 외부에서 마음대로 수정이 가능하다.
  • 그래서 클래스 외부에서 접근하지 못하도록 i와 같이 private로 선언해주고 사용해야 한다.
  • private한 필드는 외부에서 접근하지 못하기 때문에 setter,getter를 사용하여 값을 저장하고 꺼내온다.
  • 한번 예시를 통해 setter 메소드와 getter 메소드를 사용해보자
public class Book {
    private int price = 50; // field 

    public int getPrice() {
        return this.price;
    }

    public void setPrice(int price) { //지역변수 : 메소드 안에서 선언된 변수
        this.price = price;
				// 외부에서 가져온 price 값으로 현재 클래스 안의 필드 price를 바꿔준다.
    }
}

public class BookExam {
    public static void main(String[] args) {
        Book b1 = new Book();
        System.out.println(b1.getPrice()); //50

        b1.setPrice(500);
        System.out.println(b1.getPrice()); //500
    }
}
  • 위의 코드를 보면 b1객체를 생성해주고 setPrice라는 setter 메소드를 통해 b1 객체의 price값을 변경하고 getPrice라는 getter 메소드를 통해 b1 객체의 price값을 반환해주고 있다.
    • 메소드가 길어지면 메소드에서 선언된 지역 변수인지, 필드인지 착각할 수도 있기 때문에 인스턴스 필드를 사용할 때는 this.price라고 적어줄 수도 있다. this는 자신 인스턴스를 참조하는 예약어 키워드이다.
      • 인스턴스가 생성되지 않아도 사용가능한 클래스 메소드(static 메소드)에서는 this 키워드를 사용할 수 없다. → 메모리에 생성되는 시점이 다르기 때문에
  • setPrice
    • price : 지역 변수
    • this.price : 인스턴스 변수
    • 매개 변수로 받은 지역 변수 price로 this.price를 초기화한다.
  • getPrice
    • 이 객체의 price를 반환하여 준다.
  • setter, getter 메소드를 프로퍼티라고 한다.
  • mac에서는 crtl+enter를 통해서 getter,setter 메소드를 자동으로 만들어줄 수 있다.(진짜 편함..)
profile
블로그 이전했습니다!! 👉 https://alswp006.github.io/

0개의 댓글