기록양식 (TIL)
1. 사용 개념
2. 의문점 or 문제
3. 시도해 본 것들(+응용) or 삽질
4. 해결
5. 알게 된 점(회고)
- 클래스의 필드값을 외부에서 변경을 못하고 안전하게 하기 위해서
- 일반적으로 필드는 private로 선언하고, 해당 필드의 값을 읽고 쓰는 메서드인 getter와 setter를 제공합니다. getter와 setter 메서드 내에서는 유효성 검사를 수행하여 유효하지 않은 값이 필드에 설정되지 않도록 할 수 있습니다. 이런 방식은 캡슐화라는 객체 지향 프로그래밍의 원칙을 따르는 것입니다.
class Person{
int gender;
int power;
Person(){
this.gender = 1;
this.power = 100;
}
void walk(){
System.out.println("i'm walking");
}
}
class Hero extends Person{
String name;
int age;
Hero(){}
Hero(String name, int age){
this.name = name;
this.age = age;
}
void walk(){
System.out.println("i'm running");
}
void displayName(){
System.out.println("name: "+ name + ", age: "+ age + ", power: "+ power +", gender: "+gender);
}
}
public class Child {
public static void main(String[] args){
Hero h1 = new Hero("superman",20);
h1.displayName();
h1.walk();
Hero h2 = new Hero("wonderwoman", 30);
h2.displayName();
h2.gender=2;
h2.power=300;
h2.displayName();
h2.walk();
}
}
기존 인자값을 받는 생성자를 호출해서, 새롭게 초기화 한 뒤에 출력을 했을 때
: name: wonderwoman, age: 30, power: 100, gender: 1
- gender, power값을 수정할 때 , 필드 값을 외부에서 직접적으로 변경하고 있다.
h2.gender=2; , h2.power=300; -> 만약 gender(1,2로 남녀구분)
에 뜬금없는 숫자 5가 들어가거나 power에 양수가 아닌-음수
가 들어갔을 때, 오류가 나는 상황이 발생한다.- 이럴 때, getter setter를 사용한다.
데이터 무결성(Data Integrity)이란 데이터의 정확성, 일관성, 유효성을 보장하는 것을 의미합니다. 소프트웨어 개발에서 데이터 무결성은 중요한 원칙 중 하나이며, 데이터가 변경, 삭제, 생성되는 과정에서 데이터가 손상되지 않고 원래의 목적에 맞게 사용되어야 함을 의미합니다.
위 코드에서 Person 객체의 age 필드는 public으로 선언되어 있어, 객체 외부에서 직접 접근이 가능합니다. 이 때, age 필드에 잘못된 데이터(-10과 같은 음수)를 할당하면, 데이터의 무결성이 깨지게 됩니다. 나이는 절대로 음수가 될 수 없기 때문입니다.
이를 방지하기 위해, 일반적으로 필드는 private으로 선언하고, 필드의 값을 읽고 쓰는 getter와 setter 메서드를 제공합니다. setter 메서드 내에서는 유효성 검사를 수행하여 유효하지 않은 값이 필드에 설정되지 않도록 할 수 있습니다.
위 코드에서는 Person 객체의 age 필드를 private으로 선언하여 외부에서 직접 접근하는 것을 막았습니다. 대신 setAge 메서드를 통해 age 필드의 값을 변경할 수 있도록 했는데, 이 메서드에서는 나이가 음수가 되지 않도록 유효성 검사를 수행합니다. 따라서 데이터의 무결성이 보장됩니다. 이런 방식은 캡슐화라는 객체 지향 프로그래밍의 원칙을 따르는 것입니다.
class Person{
private int age; //-> 무결성을 위한 필드값(private)
public void setAge(int age){ //-->void 이유, 상태를 변경하고 특정한 값 반환x
if(age > 0){
this.age = age;
} else {
System.out.println("잘못된 값입니다.")
}
}
// -> 기본생성자를 사용, 생략
public int getAge(){
retunr this.age;
}
}
public class PersonTest{
public static void main(String[] args){
Person p = new Person(); // --> 기본 생성자를 호출
p.setAge(10); // --> 0보다 크니, 필드값을 변경
System.out.println(p.getAge()); // --> get메서드를 통해서 조회를 한다.
}
}
🤷♂️그렇다면 스프링의 getter, setter와의 차이점은 무엇?
스프링의 lombok 라이브러리를 활용하면 어노테이션 @Gtter
@Setter
를 통해서 자동으로 메서드를 생성해준다. 근데 특정 조건을 충족시키는게 무엇인지 알고 생성해주지??
Lombok의
@Getter
와@Setter
는 기본적인 getter와 setter를 생성해줄 뿐, 특수한 조건(예: setAge 메서드에서 나이가 0 이상인지 확인하는 경우)에 대해서는 처리해주지 않습니다. 기본적으로
- setter의 경우 특정 인자값을 받는다. 필드값이 int면 같은 해당 타입이 들어가게끔
- getter의 경우는 같은 타입의 리턴값을 준다. ->
두 가지의 어노테이션은 이렇게 기본만 설정을 해줌
특정 조건을 충족시키고 싶다면, 직접 메서드를 작성해야함.