[TIL] 상속, getter,setter

이해찬·2023년 7월 4일
0

TIL

목록 보기
4/20

23.07.04 - D+34, 무결성과 getter,setter

기록양식 (TIL)
1. 사용 개념
2. 의문점 or 문제
3. 시도해 본 것들(+응용) or 삽질
4. 해결
5. 알게 된 점(회고)

getter,setter의 사용이유

  • 클래스의 필드값을 외부에서 변경을 못하고 안전하게 하기 위해서
  • 일반적으로 필드는 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 필드의 값을 변경할 수 있도록 했는데, 이 메서드에서는 나이가 음수가 되지 않도록 유효성 검사를 수행합니다. 따라서 데이터의 무결성이 보장됩니다. 이런 방식은 캡슐화라는 객체 지향 프로그래밍의 원칙을 따르는 것입니다.

get, set예제

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의 경우는 같은 타입의 리턴값을 준다. -> 두 가지의 어노테이션은 이렇게 기본만 설정을 해줌
    특정 조건을 충족시키고 싶다면, 직접 메서드를 작성해야함.
profile
디자인에서 개발자로

0개의 댓글