본문 바로가기
Back-End/Java

TIL 230524 : 캡슐화..? (접근제어자, getter, setter, 유지보수..)

by 우인입니다 2023. 5. 24.

지난시간 다중상속이 잘 못 이해한거같다..


객체안에 객체 이해해보려는 흐름.

public class Car {	
    //Door생성자. Car객체를 만들 때 Door클래스 객체도 자동으로 만들어짐.
	Door door = new Door();
}
public class Door {
    String color;
}

Car 클래스와 color 필드를 갖는 Door 클래스를 만들었고,

Car 객체를 만들 때 Door 객체를 만들도록 했다.

 

자동으로 Door 객체의 변수이름은 door인데 이건 문제없으려나?

다른 Car 객체 ex. car2의 Door 객체도 door일텐데 겹칠텐데..??

상관없나보다 같은 효자동이어도 전주시 효자동도 있고 경주시 효자동도 있는 그런건지.

 

 

 car1.door.color="red";
        System.out.println(car1.door.color);

그런 다음 door의 컬러값에 "red"할당해주고 출력하면 잘 출력된다.

 


여기서 시리얼 넘버와 같이 외부에서 수정할 수는 없지만 조회는 가능하게 하고자 한다면?

Private 접근제어자 설정과 클래스 안의 필드를 수정, 접근하는 메소드 설정.

public class Door {
    String color;
    private int serialNum=1234;
    }

Door클래스에 int 변수로 할당하나를 해주고, 앞에 private접근제어자를 주었다.

Main클래스에서 도트연산자 (.)로 접근할 수 없게 됐다.

 

public class Door {
    String color;
    private int serialNum=1234;
    int getSerial(){
        return serialNum;
    }
    void setSerial(int newNum){
        serialNum=newNum;
    }
}

getSerial() 과  setSerial() 메소드를 Door 클래스 안에 심어뒀다.

 

System.out.println(car1.door.getSerial());

car1.door.setSerial(3290);
System.out.println(car1.door.getSerial());

Main클래스에서 위처럼 실행하면 결과는

1234 : Door에서 초기화된 값.

3290 : setSerial로 새롭게 할당된 값.

private 필드에 접근, 새롭게 할당이 가능했다.

 

그냥 물어보면 안 알려주는데 뭔가 그들만의 암호를 외치면 말해주는 것처럼 까탈스러운 기능처럼 느껴진다.

 


캡슐화

몰랐는데, 이후 강의에서 이러한 자바의 속성(?)을 캡슐화라고 했다.

무언가 대대로 필요해져서 따로 이렇게 설정한 기능일텐데, 어디에 쓰일지 궁금해졌다.

아마 정보은닉 성질이라 보안쪽이려나 싶은 예상이었다.

 

 

https://defacto-standard.tistory.com/51 왜쓰지 싶어서 찾다가 보게 된 블로그 주소.

 

요약해보자면.

car1.door.color = "green"; 식으로 public하게 할당하다간 나중에 해당 Door클래스의 객체들이 1억개 생겼을때 일일이 수정해야할 수도 있는데, setColor()같은 메소드를 생성해 두었다면 Door클래스 내에서 메소드만 수정하면 되는 식의 유지보수에 좋다고한다.

 

사실 무슨 말인지 완벽하게 와닿지는 않지만, 어렴풋이 알듯하다.
길거리에 포스터 광고를 일일히 붙이면 나중에 포스터 디자인이 조금 바뀌면 개고생을 하지만,
전자 포스터로서 해두면 디자인이 수정되도, 일부는 포스터 사이즈가 달라도 대응이 쉬운것같은 그런 느낌 아닐까.