접근 제한자
- public / protected / default / private
- 지금까진 다 public으로 사용했었는데
- 하나씩 다 사용해보자.
접근 제한자 실습 스타트!
0. 피카츄, 꼬부기, 야도란, main 클래스를 만들어 놓은 상태이다.
1. 메인 클래스에 피카츄 객체 생성 후 - 피카츄 레벨 확인해 보기
2. p.level 의 level 변수 (데이터)의 접근 제한자를 private private로 변경해보기
2-1 메인 클래스에 돌아와서 보니 오류가 난다.
- 안보인다고 오류남 -
- private 해주면 같은 클래스에서만 사용한다
- 다른 클래스인 Main 클래스에서는 안 보이는 거랑 마찬가지이다!
- private 해주면 외부에서 접근 불가능하다.
3. private 변수를 다른 곳에서도 사용할 수 있도록 Get()/Set() 메소드 만들어주기
- get은 값을 얻는 것이라 반환 값있어야 하고
- set은 입력만 해주면 되는 것이라 반환 값 - 없다고 이해
- get/set 메소드가 public 이기 때문에 외부에서 메소드는 접근 가능하다
4. 메인 클래스에서 - 피카츄의 레벨을 입력 / 출력해보자.
- 기존에 했던 방식인 p.level() 이 아닌 get / set 메소드를 활용해서 입력 / 출력
5. 나머지 클래스 변수 type 도 private private으로 바꿔주고 GetSet 메소드 만들어주기
6. 꼬부기 / 야도란 클래스에서도 똑같이 작업( private 변경해주고 get()/set()메소드 추가)
끝~
+@ 용어 플러스 ----- getter ( 게터 ) , setter ( 세터 )
>private 으로 만든 변수는 철수만 보거나 변경할 수 있다.
>영희나 다른 애들이 와서 data에 접근하려 하면 못 본다
>그런데 이 데이터들을 사장님은 봐야 할 수도 있다.
>철수 주머니에 있는 데이터를 직접 꺼내서 볼 수는 없지만
>철수야 시급 말해 명령을 하면 시급을 말하도록 해줄 수 있다.
>시급 만원으로 바꿔줄게 직접 못하고
>철수야 너 시급 만원으로 바꿔 명령을 내려서 철수가 하는 방식으로 한다.
>내가 직접 변경하거나 접근할 수 없기 때문에
>명령을 내려서 네가 해 이런 방식으로 이해하자.
> Q. 그럼 영희도 그런 방식으로 할 수 있는 거 아닌가요? - 할수있어요
> Q. 그럼에도 이렇게 하는 이유는? - 나중에 설명~~
+@ 용어 플러스 ----- 캡슐화
- 외부에서 접근하지 못하지 못하게 private로 바꿔주는 것!
- 정보 은닉
- 변수에 접근해서 입력 출력 다 되게 해 주도록 public으로 안 하고
- 왜 게터 세터로 만들어서 하느냐? - 나중에 설명
인자 값을 받는 생성자
1. 메인에서 피카츄 객체 만들어보자.
- new Pikachu( );
- 만들어진 상태인데.. 정보가 아무것도 없다.
- 레벨도 없고, 타입도 없다.
- type = default; 존재할 수 없는 포켓몬이다.
2. 태어난 순간부터 레벨과 타입을 제대로 가지고 태어나도록 만들어 주자
- 생성자가 아무것도 없으면 jvm이 기본 생성자를 만들어 줌
2-1 객체 생성할 때 모든 객체가 level은 1 , type 은 E라는 정보를 가지고 태어나게 해 주기
2-2 객체 생성할 때 전달받은 값으로 level 과 type의 정보를 가지고 태어나게 해 주기
2-3 출력 테스트
- 기본 생성자는 기본 세팅값으로 / 인자 받는 생성자는 받은 값으로 태어난 것을 확인!
2-4 기본 생성자가 없으면 // Pikachu() 이런 식으로 객체 생성 불가
- 왜? 기본 생성자가 없어서 – 아무런 생성자가 없을 때만 기본 생성자 자동으로 만들어준다.
- 인자 값 받는 생성자 만들었으므로, 기본 생성자 자동으로 안 만들어준다~
- @ 자동으로 안 만들어주기 때문에 우리가 기본 생성자를 만들어주면
- 기본 생성자로도 객체를 만들 수 있다~
- but – 우리는 불완전한 객체 만들지 않기 위해서 기본 생성자는 만들어 주지 않도록 한다.
- ( 1가지 또 다른 방법 private Pikachu(){} 해버려도 OK )
3. 나머지 꼬부기와 야도란 클래스에도 인자 값을 받는 생성자 추가해주자!
> 꼬부기
> 야도란
##Check Point
- 객체는 태어나게 해 주고 값을 넣어주는 것이 아니라
- 태어날 때부터 잘 태어나게 해주는 것이다.
- 엉망인 상태로 태어난 객체에 값을 대입해주는 작업을 해놓고
- 나중에 입력하는 과정에서 오류 나도 엉망인 상태의 객체는 그대로 존재하게 된다.
- 이 객체로 다른 작업을 한다면? NO!
+@ 빌더 패턴
- 나름 최근에 생긴 패턴
- 검색 한번 해보자
+@ init :메소드
- ( 생성 시 필요한 작업들 모아놓음 )
- destroy 메소드 있긴 한데 우리는 해당 사항 X
진도 +
여러 개의 매개변수를 가진 (인자 값을 여러 개 받는) 생성자 만들어보기
1. 피카츄 클래스에 인자 값을 받는 생성자 하나 더 추가
2. 메인에서 객체 생성 출력 테스트
- 13번 Line – 객체가 태어나는 순간/ 출력문이 있으므로~ / 생성됨과 동시에 메시지 출력
review
이번 시간에는 게터 세터를 사용해보았다.
private 변수를 다른 곳에서 사용하게 해 주기 위해서
get/set메소드를 만들어 준다.
public으로 하지 왜 게터 세터로 사용?
- 이유 나중에 말해준다고 안 해주셨는데 -
나의 생각으로는
변수 자체를 public으로 해서 모든 곳에서
변경가능하도록해주면
작업하다가 변수명이나 사용이 쉬워서
오류가 발생할 가능성이 커지고
오류 발생 시
어디서 발생하였는지 추적이 어려워서 그런 것 같다.
함수로 사용 시 어디서 사용하였는지
추적이 용이할 것 같고(어떻게 하는지는 아직 모르겠지만)
+ 사용하는 사람도 함수를 사용해야 하므로
명확한 목적으로 사용하므로
애초의 오류 발생 가능성이 줄어들 것 같다는 생각.
이외에도 가슴에 와닿았던 부분은
"객체는 태어나는 순간부터 잘 태어나도록 해주는 것이다."
말씀해 주셨던 부분.
일단 객체 만드는 것에 집중을 하고 값은 나중에 넣어줘도
괜찮지. 오류안나지라고만 생각했었는데
객체에 대한 관점이 바뀌었다. ㅎㅎ
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 4월' 카테고리의 다른 글
22. 04. 26 - 상속(super, override), 다형성, 바인딩 (0) | 2022.04.29 |
---|---|
22. 04. 25 - 시험, 주말 과제 발표 (0) | 2022.04.27 |
22. 04. 21 - 생성자(Constructor), 오버로딩(overloading) (0) | 2022.04.26 |
22. 04. 20 - this, 객체 배열, 인자 값 받는 메소드 (0) | 2022.04.22 |
22. 04. 19 - 객체 생성, 객체의 메소드 호출, 객체의 변수 접근 (0) | 2022.04.22 |