Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/4월

22. 04. 22 - 접근 제한자(Access Modifier), 인자 값을 받는 생성자

giggs 2022. 4. 26. 21:51

 

 

접근 제한자

  • public / protected / default / private
  • 지금까진 다 public으로 사용했었는데
  • 하나씩 다 사용해보자.

 

 


 

 

접근 제한자 실습 스타트!

 

 

0. 피카츄, 꼬부기, 야도란, main 클래스를 만들어 놓은 상태이다. 

 

 


 

 

1. 메인 클래스에 피카츄 객체 생성 후 - 피카츄 레벨 확인해 보기

 

변수의 기본형 타입 - int 의 기본 값인 0으로 세팅되어있음을 확인

 

 

 


 

 

 

2. p.level 의 level 변수 (데이터)의 접근 제한자를 private private로 변경해보기

 

 

피카츄 클래스에서 접근제한자 private로 변경 해 줌

 

 

 

2-1 메인 클래스에 돌아와서 보니 오류가 난다.

 

 

not visible

 

 

  • 안보인다고 오류남 -
  • private 해주면 같은 클래스에서만 사용한다
  • 다른 클래스인 Main 클래스에서는 안 보이는 거랑 마찬가지이다!
  • private 해주면 외부에서 접근 불가능하다.

 

 

 


 

 

 

3. private 변수를 다른 곳에서도 사용할 수 있도록 Get()/Set() 메소드 만들어주기

 

 

private level 변수에 대한 get/set 메소드 만들어 주기

 

 

 

  • get은 값을 얻는 것이라 반환 값있어야 하고
  • set은 입력만 해주면 되는 것이라 반환 값 - 없다고 이해
  • get/set 메소드가 public 이기 때문에 외부에서 메소드는 접근 가능하다

 

 

 


 

 

 

4. 메인 클래스에서 - 피카츄의 레벨을 입력 / 출력해보자.

  • 기존에 했던 방식인 p.level() 이 아닌 get / set 메소드를 활용해서 입력 / 출력

 

 

setLevel(5) 로 레벨 세팅하고 / geLevel()로 가져와서 출력해보기

 

 

 

 


 

 

 

5. 나머지 클래스 변수 type 도 private private으로 바꿔주고 GetSet 메소드 만들어주기

type 변수도 접근제한자 private 으로 변경 해주고 - get / set 메소드 만들어 줌

 

 

 

 


 

 

 

6. 꼬부기 / 야도란 클래스에서도 똑같이 작업( private 변경해주고 get()/set()메소드 추가)

 

 

끝~

 

 

 


 

 

 

 

+@ 용어 플러스 ----- getter ( 게터 ) , setter ( 세터 )

 

 

 

 

 

 

 

 

>private 으로 만든 변수는 철수만 보거나 변경할 수 있다.

>영희나 다른 애들이 와서 data에 접근하려 하면 못 본다

>그런데 이 데이터들을 사장님은 봐야 할 수도 있다.

>철수 주머니에 있는 데이터를 직접 꺼내서 볼 수는 없지만

>철수야 시급 말해 명령을 하면 시급을 말하도록 해줄 수 있다.

>시급 만원으로 바꿔줄게 직접 못하고

>철수야 너 시급 만원으로 바꿔 명령을 내려서 철수가 하는 방식으로 한다.

>내가 직접 변경하거나 접근할 수 없기 때문에

>명령을 내려서 네가 해 이런 방식으로 이해하자.

> Q. 그럼 영희도 그런 방식으로 할 수 있는 거 아닌가요? - 할수있어요

> Q. 그럼에도 이렇게 하는 이유는? - 나중에 설명~~

 

 

 

 


 

 

+@ 용어 플러스 ----- 캡슐화

 

 

  • 외부에서 접근하지 못하지 못하게 private로 바꿔주는 것!
  • 정보 은닉
  • 변수에 접근해서 입력 출력 다 되게 해 주도록 public으로 안 하고
  • 왜 게터 세터로 만들어서 하느냐? - 나중에 설명

 

 

 

 

 

 

 


 

 

 

 

 

 

 

인자 값을 받는 생성자

 

 

 

 

1. 메인에서 피카츄 객체 만들어보자.

 

 

new Pikachu( )

 

 

 

  • new Pikachu( );
  • 만들어진 상태인데.. 정보가 아무것도 없다.
  • 레벨도 없고, 타입도 없다.
  • type = default; 존재할 수 없는 포켓몬이다.

 

 

 

 


 

 

 

 

2. 태어난 순간부터 레벨과 타입을 제대로 가지고 태어나도록 만들어 주자

  • 생성자가 아무것도 없으면 jvm이 기본 생성자를 만들어 줌

 

 

 

2-1 객체 생성할 때 모든 객체가 level1 , type E라는 정보를 가지고 태어나게 해 주기

 

태어 나는 모든 피카츄 객체는 레벨 1, 타입 E의 정보를 가지고 태어난다.

 

 


 

 

 

2-2 객체 생성할 때 전달받은 값으로 level 과 type의 정보를 가지고 태어나게 해 주기

 

태어 피카츄 객체는 입력받은 레벨과 타입의 정보를 가지고 태어난다.

 

 


 

 

2-3 출력 테스트

 

 

  • 기본 생성자는 기본 세팅값으로 / 인자 받는 생성자는 받은 값으로 태어난 것을 확인!

 

 


 

 

 

2-4 기본 생성자가 없으면 // Pikachu() 이런 식으로 객체 생성 불가

 

 

 

생성자를 내가 만들면 java는 기본생성자를 자동으로 만들어주지 않는다.

 

 

  • 왜? 기본 생성자가 없어서 – 아무런 생성자가 없을 때만 기본 생성자 자동으로 만들어준다.
  • 인자 값 받는 생성자 만들었으므로, 기본 생성자 자동으로 안 만들어준다~

 

  • @ 자동으로 안 만들어주기 때문에 우리가 기본 생성자를 만들어주면
  • 기본 생성자로도 객체를 만들 수 있다~
  • but – 우리는 불완전한 객체 만들지 않기 위해서 기본 생성자는 만들어 주지 않도록 한다.
  • ( 1가지 또 다른 방법 private Pikachu(){} 해버려도 OK )

 

 

 

 


 

 

 

 

3. 나머지 꼬부기와 야도란 클래스에도 인자 값을 받는 생성자 추가해주자!

 

 

> 꼬부기

 

 

> 야도란

 

 


 

 

##Check Point

  • 객체는 태어나게 해 주고 값을 넣어주는 것이 아니라
  • 태어날 때부터 잘 태어나게 해주는 것이다.

 

 

 

 

 

 

 

  • 엉망인 상태로 태어난 객체에 값을 대입해주는 작업을 해놓고
  • 나중에 입력하는 과정에서 오류 나도 엉망인 상태의 객체는 그대로 존재하게 된다.
  • 이 객체로 다른 작업을 한다면? NO!

 

 

 

+@ 빌더 패턴

  • 나름 최근에 생긴 패턴
  • 검색 한번 해보자

 

 

 

+@ init :메소드

  • ( 생성 시 필요한 작업들 모아놓음 )
  • destroy 메소드 있긴 한데 우리는 해당 사항 X

 

 

 

 

 


 

 

 

 

 

진도 +

 

 

여러 개의 매개변수를 가진 (인자 값을 여러 개 받는) 생성자 만들어보기

 

 

 

1. 피카츄 클래스에 인자 값을 받는 생성자 하나 더 추가

 

 

 

 


 

 

 

2. 메인에서 객체 생성  출력 테스트

 

메인에서 입력받은 값이 생성자의 매개변수 인자 값으로 전달되고, 그 값으로 { } 실행

 

 

입력한 msg가 객체 생성과 동시에 출력됨을 확인

 

 

  • 13번 Line – 객체가 태어나는 순간/ 출력문이 있으므로~ / 생성됨과 동시에 메시지 출력

 

 

 

 


 

 

 

 

review

이번 시간에는 게터 세터를 사용해보았다.
private 변수를 다른 곳에서 사용하게 해 주기 위해서
get/set메소드를 만들어 준다.

public으로 하지 왜 게터 세터로 사용?
- 이유 나중에 말해준다고 안 해주셨는데 -

나의 생각으로는
변수 자체를 public으로 해서 모든 곳에서
변경가능하도록해주면
작업하다가 변수명이나 사용이 쉬워서
오류가 발생할 가능성이 커지고
오류 발생 시
어디서 발생하였는지 추적이 어려워서 그런 것 같다.

함수로 사용 시 어디서 사용하였는지
추적이 용이할 것 같고(어떻게 하는지는 아직 모르겠지만)
+ 사용하는 사람도 함수를 사용해야 하므로
명확한 목적으로 사용하므로
애초의 오류 발생 가능성이 줄어들 것 같다는 생각.

이외에도 가슴에 와닿았던 부분은
"객체는 태어나는 순간부터 잘 태어나도록 해주는 것이다."
말씀해 주셨던 부분.
일단 객체 만드는 것에 집중을 하고 값은 나중에 넣어줘도
괜찮지. 오류안나지라고만 생각했었는데
객체에 대한 관점이 바뀌었다. ㅎㅎ