package com.kh.lee;
public class Person {
//fianl 과 static 은 https://blog.naver.com/goddlaek/220889229659 이 블로그를 참고하자.
public static final String Name = "swy";
private int age;
//매개변수가 있는 생성자
public Person(int age) {
this.age = age;
//age라는 값을 매개변수에 입력받아 필드의 this.age에 저장한다.
}
//getter
//final필드가 있어도 getter 만드는 건 상관은 없음
public int getAge() {
return age;
}
//setter
//!!!!!!!!!! int age의 값을 저장할 공간을
//this.age=age;를 써서 저장공간을 마련해주기 때문에 꼭 작성해야한다 !!!!!!!!!!!
//매개변수의 age는 지역변수에서의 age고
//this.age의 age는 전역변수의 age(private int age의 age)임을 유의할 것!!
public void setAge(int age) {
this.age = age;
}
//getter
//public 에 static이기 때문에 굳이 필요는 없지만, 작성 가능
//+ final필드에 값을 재할당하는 것이 불가능하므로 getter만 가능, setter는 불가능
public String getName() {
return Name;
}
public void walk() {}
}
만약 이 상태에서 Run이라는 메인클래스를 만들고,
Person p = new Person();
p.Person 객체를 만들어 Person 클래스의 기본생성자를 호출하게 된다면
기본생성자는 아무것도 없을 때 만들어지는데,
public Person(int age)라는 매개변수가 있는 생성자가 이미 있으므로 이 때는 기본생성자가 자동으로 만들어지지 않기 때문에, 기본생성자를 호출했을 때 당연히 Run에서 실행 에러가 날 수 밖에 없다.
따라서, 매개변수가 있는 생성자가 있을 때 기본생성자를 호출하여 실행에러가 나지 않도록 유의할 필요가 있다.
getter / setter
age라는 변수는 1. 할당(setter) 2. 데이터를 반환하기(getter) 두 가지의 역할을 한다.
위 클래스 다이어그램에서
age는 접근제한자가 private이기 때문에 외부에서는 이 age에 접근할 수가 없는데, 이렇게 외부에서 데이터에 접근하지 못하도록 private으로 만들어 주는 것이 캡슐화이다.
이때 사용하는 것이 getter와 setter메소드라고 할 수 있다.
따라서 getter 메소드를 통해 호출함으로써 age에 직접 접근하지 않고도 getAge로 private영역에 있는 age를 가져올 수 있게 된다.
다음으로 setter 메소드를 통해 getAge로 반환받은 int age 값을 전달받아서 필드의 age가 가지고 있는 age에 저장하는 것이다.