JAVA Programming for Beginners...

JAVA, 초보

데이터를 감춰봅시다...

Setter/Getter Method & Constructor

 

지난시간에 배운 내용은 JAVA도 아닙니다...(아주 엉망진창이죠...)

 

큰 문제가 하나 있습니다.

Puppy 객체를 한개 만들어서 사용한다고 합시다.

Puppy객체가 가지고 있는 것(인스턴스 변수)에 대해 언제 어디서도 접근이 가능하다면 어떤일이 벌어질까요?

 

예를 들어

Puppy blackDog = new Puppy();

blackDog.name = "GGamdol";

blackDog.hungry = -50;                   // 배고픔 지수가 마이너스값이네요...

blackDog.name = "Dalmashian";      // 게다가 이름이 막 바뀌고

blackDog.eat();

blackDog.hungry = 500;                  // 갑자기 배고픔지수가 500이 되기도 하네요....

큰일이 아닐 수 없습니다...

 

객체의 특정 메소드는 그 객체가 가지고 있는 것 중 상태에 따라 그 행동이 결정되는 것들이 있습니다.

eat()같은 메소드가 그렇죠..

그런데 객체가 가지고 있는 것들을 아무곳에서나 어떠한 상황에서나 접근이 가능하며, 변경이 가능하다면 프로그래머도/사용자도/~~무도 알지 못하는 결과가 도출 될 수도 있습니다.

 

위의 예에서처럼 이름이 갑자기 바뀌어 버린다거나, 배고픔의 정도가 마이너스가 된다거나 500으로 바뀐다거나 하는 일이죠..

위의 예는 일부러 그런 것이고, 프로그래머가 일부러야 그러지 않겠지만, 이 클래스를 (아무것도 모르는)누군가가 사용한다거나, 프로그램의 실행 중 분기과정이 꼬인다거나, 특정한 메소드가 다른 메소드를 호출하는 과정에 이상이 생긴다거나..

아무튼 특정 재앙적인 일이 벌어지지 않더라도 충분히 예측 가능한 일입니다.

 

 

우리 프로그래머는 이런 위험요소를 최대한 배제해야 합니다.

그래서 우리는 클래스에 속하는 가진 것(인스턴스 변수)를 감춰둘 필요가 있습니다..

자신 스스로의 객체(클래스가 아닙니다..)만이 값의 배정, 수정을 할 수 있도록 세팅해 둔다면, 아무도 모르는 곳에서 값이 바뀌는 일은 없을 것입니다.

이런 키워드가 바로 private입니다.

인스턴스변수를 private로 설정하면 조금은.. 아주 조금은.. ~~~주 쬐끔은 번거로운 일이 생깁니다.

바로 그 인스턴스변수를 접근하는 메소드들을 만들어 줘야 합니다.

하지만 한번 해 보면 아~주 편해 집니다....

왜 그렇게 해야 하는지도 알게 되실 겁니다.. 아마도...

 

 

 

 

  1. private String name; // myPuppy.name <- 이런식으로 접근할 수 없습니다.
  2. //세터메소드 - private로 설정된 멤버변수의 값을 설정
  3. public void setName(String aName){
  4.    name = aName;
  5. }
  6. //게터메소드 - private로 설정된 멤버변수의 값을 가져옴(리턴함)
  7. public String getName(){
  8.    return name;
  9. }

 

 

 

 

메소드는 public 이므로 myPuppy.getName() 이런식으로 접근이 가능하겠죠???

setName이라는 메소드를 아예 만들지 않아서 이름을 바꿀 수 없게 만들수도 있습니다.

 

 

 

  1. private int hungry;
  2. public void setHungry(int aHungry){
  3.    if(aHungry >= 0 && aHungry <= 100){
  4.        hungry = aHungry;
  5.    }
  6. }
  7. public int getHungry(){
  8.    return hungry;
  9. }

 

 

 

이런 식으로 setHungry()메소드를 만든다면 음수값이나 터무니 없는 값은 세팅될 수가 없겠죠??

이런 메소드들을 setter메소드/getter메소드라고 부릅시다.

그리고 이렇게 인스턴스 변수를 보호하는 것을 데이터 캡슐화라고 부릅시다..

남들도 그렇게 부르는 것 같더라구요..

  

  

 

 

근데 읽다보니 이상한 게 생겼지요?

name에대한 세터메소드를 아예 만들지 않아서 이름을 바꿀 수 없게 만들 수도 있다고 했잖아요..

그럼 이름은 어떻게 정할까요?

여기서 등장해야 하는 것이 두둥~ 바로 생성자(Constructor)입니다. 생성자는 객체가 만들어 질 때,

반드시 호출되며 객체 상태의 초기화 및 객체가 생성되기 전에 필요한 모든 작업을 수행합니다.

생성자는 그 이름이 클래스의 이름과 같아야하며 리턴형이 존재하지 않습니다.

 

 

 

 

  1. public MyPuppy(){
  2. // 생성자에서 할 일
  3. }

 

요런 식으로 생겼습니다... 다른 메소드처럼 인자를 받아들일 수도 있죠..

  1. public MyPuppy(String aName){
  2. name = aName;
  3. }

 

객체를 생성할 때 이름을 넣어주면, 이름을 바꾸는 메소드는 이경우에는 필요 없겠죠?

MyPuppy blackDol = new MyPuppy("GGamdol");

 

 

 

 

여담이지만 생성자는 반드시 호출됩니다.

하지만 여태껏 생성자 없이도 객체는 잘~ 살아 왔잖아요.. 그죠?

여태까지 만들었던 클래스에는 기본 생성자가 자동으로 만들어지게끔 자바 컴파일러가 알아서 처리를 해 왔던 겁니다.

기본 생성자란 인자가 아무것도 없고, 하는 일도 아무것도 없는 위의 예에서 첫 번째와 같은 생성자를 의미합니다.

주의해야 할 것은 기본 생성자는 생성자가 아무것도 없을 때에만 만들어 진다는 것입니다.

자가 있는 생성자가 하나라도 존재한다면 기본생성자는 만들어지지 않습니다.

따라서 인자가 있는 생성자를 하나라도 만들었다면 기본 생성자와 같은 모양의 생성자를 반드시 만들어 둘 것을 권해 드립니다.

 

 

JAVA는 확장성과 재사용성이 생명이니까요...

    

 

 

 

이제 슬슬~ 틀을 좀 갖춰가는 것 같은데요...?? 

댓글

댓글 본문