[JAVA기초] 접근지정자, getter, setter

포키·2022년 10월 17일
0

국비과정

목록 보기
17/73

접근 지정자

  • private - : 동일 객체 안 (객체 자신만)
  • (package) ~ : 동일 패키지 사용 (특별히 패키지를 주지 않을 경우 default 패키지라 해서, 같은 경로에 있으면 ok) = 패키지 접근제한자
  • protected # :
  • public + : 제한x 아무나 다 쓸 수 있음
  • 접근지정자는 99%가 public or private
  • 클래스는 생략 or public만 가능 (현재까지는~), 멤버변수, 메서드, 생성자는 다 가능
  • 클래스는 public, 멤버변수는 private, 메서드는 public, 생성자는 public이 기본
/*
	접근제한자 선택
	멤버변수 : private
	메서드 : public
	생성자 : public
*/

class Some {
	private int num1 = 2;
	int num2 = 3;
	public int num3 = 4;
}
class UseSome {
	public static void main(String[] args) {
		Some s = new Some();
		s.num3 = 100;
		s.num2 = 50;
		s.num1 = 8;
	}
}
// 클래스 = 어차피 코드 파일당 클래스 하나. 원칙적으론 충돌할 일이 x고 밖에서 변경도 불가 => public
/* 
  멤버변수 = 내가 모델링하려는 대상이 원래 가지고 있는 값 (상태)
  "이 객체가 무엇인가"를 설명하는 변수 - 함부로 바뀌면 객체가 의도치않은 무언가가 될 수 있음
  소유자가 바꾸려고 하는 게 아닌 한, 바깥에서 바꿀 수는 없다! => private
  메서드, 생성자 = 처음 클래스를 만든 사람이 정의한 대로 동작할 뿐, 바뀌지 않음! => public
  즉 변경가능한 멤버변수는 지켜주고, 변경불가능한 메서드, 생성자는 공공재로 사용 
*/

메서드 getter, setter ★★★

  • 앞으로는 클래스마다 (객체마다) toString, getter, setter 기본으로 써주기.
/*
	이제부터 멤버변수를 설정, 변경하는 법
		1. 생성자 사용 (처음에만)
		2. getter, setter 사용 (=접근자, 설정자)
*/

class Human {
	private String name;
	private int age;
	public Human(String name, int age){
		this.name = name;
		this.age = age;
	}

	// !!!헤더는 바꿀 수 없다!!! 그 외 내용은 변경 가능 
	// getter : 멤버변수를 가져오는 역할
	// 메서드명은 get변수이름, return은 변수값
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}

	// setter : 멤버변수의 값을 변경하는 역할
	// 메서드명은 set변수이름, this.변수 = 변수
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int Age) {
		this.age = age;
	}

	public String toString(){
		return name + " : " + age;
	}
}
class UseHuman {
	public static void main(String[] args) {
		Human h = new Human("아이유", 29);
		System.out.println(h);
	}
}

사용 예시

class MyObj {
	private int num;
	private String str;
	private boolean ok;
	private char type;
	private double rate;

	// getters
	public int getNum() {
		return num;
	}
	public String getStr() {
		return str;
	}
	public boolean isOk() {
	// boolean은 get이 아니라 'is변수명'으로 지정
		return ok;
	}
	public char getType() {
		return type;
	}
	public double getRate() {
		return rate;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public void setStr(String str) {
		this.str = str;
	}
	public void setOk(boolean ok) {
		this.ok = ok;
	}
	public void setType(char type) {
		this.type = type;
	}
	public void setRate(double rate) {
		this.rate = rate;
	}
}
class UseMyObj {
	public static void main(String[] args) {
		// 1. MyObj 객체 o를 만든다.
		MyObj o = new MyObj();
		// 2. 각 멤버변수에 100, "abc", false, 'o', 3.14 를 대입한다.
		o.setNum(100);
		o.setStr("abc");
		o.setOk(false);
		o.setType('o');
		o.setRate(3.14);
		// 3. 2에서 작업한 결과를 getter를 이용하여 출력한다. 
		System.out.println(o.getNum());
		System.out.println(o.getStr());
		System.out.println(o.isOk());
		System.out.println(o.getType());
		System.out.println(o.getRate());
	}
}
  • getter, setter 메서드의 의미 : '소유자의 의도를 따르겠다'는 것
    멤버변수를 직접 꺼내는 게 아니라, 소유자가 허락해줄 때 허락하는 방식
    제한적 접근! 소유자는 조건을 달 수 있음
    ❗❗❗ 소유자의 의도가 묻어있는 getter setter 사용하자 ❗❗❗
    행위는 객체 외부가 아니라 내부에서 이루어진다
  • private의 의미 : 밖에서 함부로 볼 수 없게 함 (가시성)

응집력★★★

하나를 바꾸면 다른 것도 한 번에 바뀌도록 코드를 작성함
(= 중복 소거)
ex)
age값을 변경할 때 모두 setAge로 처리한다면 응집성이 높아진다

profile
welcome

0개의 댓글