날아라쩡글이의 블로그입니다.

접근제한자 (modifier) 본문

중앙 HTA (2106기) story/java story

접근제한자 (modifier)

날아라쩡글이 2021. 9. 13. 20:12
반응형
  • 객체는 구성요소가 필드, 생성자, 메소드로 구성이 되어있다. 객체내의 구성요소에서 맴버의 접근을 제한하기 위해 접근제한을 설정할 수 있다. 그것이 접근제한자이다.
  • 구분 공개 부분 접근 불가능
    public  같은 클래스내에서 접근가능 없음
    protected  패키지 공개 + 자식클래스 공개 다른 패키지
    default 패키지 공개 자식 패키지 + 다른 패키지 
    private 같은 클래스 공개 다른 패키지, 다른 클래스
  • 어떤 접근 제한자를 붙이느냐에 따라서 접근이 가능한지 정해진다. 
  • public 의 경우 전부 공개, 완전 공개를 의미한다. 
  • protected의 경우 다른 패캐키지지만 이것을 상속받은 애의 자식 클래스면 가능하다. --> 자식 extected 부모
  • default(아무것도 적지않음) 의 경우 패키지 공개 
  • private의 경우 완전 비공개로 같은 클래스만 확인 가능한 접근제한자를 갖고 있다. 
  • 보통은 완전공개( public )와 완전 비공개 ( private ) 로 주로 사용한다. 
  • protected 와 default의 경우 잘 사용을 하지 않는다. 

접근제한자의 사용

구분 사용 가능한 접근제한자
클래스  public , default
멤버 변수 public, protected, default, private
Static 정적 변수  public, protected, default, private
생성자 className () { } public, protected, default, private
멤버 메소드 public, protected, default, private
Static 정적 메소드 public, protected, default, private
매개 변수, 지역 변수  사용불가 
  • 두꺼운 글자로 작성된 접근제한자가 많이 사용되는 접근제한자 이다. 
  • 정적변수의 경우 상수로 입력이 되기 때문에 public 을 붙여도 상관이 없다. 
  • 멤버변수의 경우 변수가 변경이 될 수 있기 때문에, 거의 private로 관리를 해준다. 
  • 생성자는 다른 class에서 Book book1 = new Book();으로 생성을 해주고 만들어 줘야하기 때문에 public을 사용해준다. 

다른 패키지에서 값을 부를 때는 import를 해서 경로를 작성해주어야한다. 같은패키지에서는 상관이 없다. 일반적으로는 private을 붙여서 같은 필드도 접근하지 못하도록 하는 것이 일반적이다. 

접근제한자의 이유

  • 은닉화, 캡슐화의 특징으로 사용하기 위해서이다. 
  • 객체의 실제 구현내용을 감추는 것을 은닉화, 캡슐화라고 하는데, 함부로 사용하지 않고, 인식하지 않도록 한다. 잘못된 사용으로 인해 객체의 손상을 방지하기 위해서 이다. 
  • 접근차단으로는 private와 default의 접근제한자를 많이 사용한다. 
  • 접근 공개를 위해서는 public을 사용한다. 

Java Bean, VO, DTO를 사용하는 방법

  • 값을 저장하는 객체를 생성하는데 사용되는 클래스의 일반적인 접근제한
  •  
    멤버변수는 일반적으로 완전 비공개로 작성을 하여 데이터를 보호한다. 
  • 생성자는 완전공개로 작성을 한다. 
  • 멤버메소드도 완전 공개로 작성하지만, java의 경우 값을 바로 변경하는 것보다는 간접적으로 값을 변환하는 것을 좋아한다. 그렇게 나온 메소드 이름이 
  • Getter  -->값을 읽는(조회) 메소드 // Setter  -->값을 변경하는 메소드 이다. 
  • 분 류 Getter Setter
    접근 제한자 public  public 
    반환 타입 해당 필드의 타입 void(없다)
    메소드 명 get필드이름(대문자로 시작) set필드이름(대문자로 시작)
    매개 변수 없음 해당필드의 타입과 같은 타입의 매개변수를 선언(입력을 해야하니까 )
    사용 방법 public String getTitle() {
    return title;}
    public void setTitle(String title){
    this.title = title;}
  • 변수/ 생성자 /메소드를 getter /setter로 만들어서 private의 값을 함부로 접근하지 못 하도록 설정해놓았다. 
  • 생성자만 완전 공개로 만들 경우 값을 설정, 조회할 수 도없기 때문에 대체제가 필요했고, 그렇게 등장한게 getter(조회), setter(입력)이다. 
  • 일반적으로는 전부 입력, 변경을 할 수 있게 조회를 해주어야한다. 
  • 나중에 Spring 으로 들어가게되면 import.lomba.Getter; 로 import후 @getter /@setter을 입력하면 자동으로 컴파일하면서 값이 추가가된다. 
  • 지금은 source -> Generate Getters and Setter --> 알파벳 순으로 입력이 되고, select All 이면 전체 select getter , select setter ->으로 선택하고 고를 수 있다. 
  • boolean 타입으로 작성하면 변수의 이름은 isPassed를 넣을 경우 getter setter의 값을 source로 추가할 경우 getter은 passed에서 is빠진 값에서 get이 붙고 setter의 경우 is가 빠지고 setPassed로 입력이 된다. 

메모리는 덩어리로 만들어진, 사용자가 사용가능할 수 있도록 만들어진 것이 객체이다. 

객체 생성을 new라는 키워드로 이뤄진 생성된 주소값을 반환하고, 생성된 주소값을 참조변수를 입력하여 주소값을 대입한다. 주소값과 변수들이 작성 되어 있는 객체를 배열에 입력할 때에는 인덱스 값에 주소 값을 입력하여 참조하도록 만들어주는 것이다. 

java에서는 주소값을 직접 알려주지 않는다. C언어의 경우 주소값을 알려주지만, java는 알려주지 않고, 생성된 객체를 참조변수 값에 대한 해시코드의 값을 작성하여 알려준다. 

  1. 참조 변수의 값을 변경하던지, 
  2. 참조 변수를 참조하고 있는 변수의 인덱스 값을 변경하던지 
  3. 참조 변수를 참조하고 있는 변수의 인덱스 값을 참조하는 변수를 생성하여 값을 변경하면

같은 주소값을 바라보고 있는 사실을 보여주는 자바의 해시코드의 값이 나오는 걸 확인할 수 있다. 

자바의 경우 주소값을 보여주지 않고, 중복될 수 있는 일련번호의 해쉬코드를 출력하는데, 산출공식에 의해서 나오는 값을 출력을 하기 때문에 같은 값이 나올 수 있고, 어떻게 값이 나오는지는 알 수 없다. 주소값은 다른 위치에서 생긴 물리적 위치로 중복이 되지 않는 수 이다. 

메모리 주소값이 중복되지 않는 이유, 해시코드의 값이 부여되는 방법

그렇다면 위에 

  1. 참조 변수의 값을 변경하던지, 
  2. 참조 변수를 참조하고 있는 변수의 인덱스 값을 변경하던지 
  3. 참조 변수를 참조하고 있는 변수의 인덱스 값을 참조하는 변수를 생성하여 값을 변경하면
  4. 같은 주소값을 바라보고 있다는 사실을 해시코드가 같은 것을 보고 알 수 있다. 

getter / setter 지정값이 얼마 되지 않는 경우 필드를 작성, 생성자를 입력 후 setN + ctrl + space를 누르면 자동으로 메소드의 모양이 생겨서 이렇게 getter /setter의 값을 지정해주면 된다. 

total과 average의 값을 필드로 정의하지 않고 

필드 변수값으로 지정하지 않고, getter의 메소드로 작성하여 return값을 필드의 값으로 출력이 가능한 부분이다. 필드 변수값으로 계산할 수 있는 것을 특별하게 매개 변수 설정하지 않고 작성해도 무관하다. 저장데이터를 만드는 것보다는 메소드로 기능을  출력하도록 하는 것이 더 좋다.

 

객체는 두가지로 나눠서 정의할 수 있다. 하나는 포함관계 하나는 상속관계포함의 경우 실제로 포함하는 객체를 이야기한다. 자동차 안에 에어컨을 포함하고 있다처럼, 포함하며 그 객체를 사용하는 것을 의미한다. -->에어컨도 하나의 객체로 사용할 수 있지만 자동차에서도 포함하여 사용할 수 있는 것처럼 자동차 객체 안에서 에어컨에 대한 필드를 정의한 후 getter / setter메소드로 사용할 수 있다는 것이다. 객체의 상위와 하위의 관계란 상속관계를 의미한다. 같은 특성을 모아둔 것을 의미하기도 하며, 하위로 갈수록 구체적인 표현이 가능한 값을 의미한다. 자동차도 기계의 한 부분이다. 핸드폰도 아이폰의 분류할 수 있는 큰 부분으로, 큰 부분에서 하위분류로 나눠가는 것을 is a 관계, 상속관계 라고 한다. 상속관계를 이용하여,  객체지향프로그래밍의 한 부분인 추상화를 구현할 수 있다. 

자바의 오류 

  1. Error 오류 (에러)
    • 시스템의 문제, JVM의 문제로 발생되는 오류 
    • 개발자의 코딩과 거의 무관한 오류
    • 코드를 고쳐서 해결되는 문제가 아니다. 
  2. Exception 오류 (예외)
    • 사용자의 잘못된 사용으로 발생되는 오류 
    • 개발자의 코딩 실수로 발생되는 오류 

 

자주 보게 될 NullPointerException오류
여기서 오류가 있다. getScore안의 eng를 출력한 것인데, 0x4567의 주소가 잘 못들어감

private로 숨겨진 값을 getter / setter의 메소드로 출력을 할 수 있다. 

Student1의 객체를 출력할 때 getScore()의 주소값에서 kor의 값을 출력할 수 있다는 것을 알 수 있다. getScore의 값을 직접입력함으로써 주소값을 직접입력후 그 안에 있는 변수를 출력하는 것이다. 

그런데 

Student3의 김날라의 값을 확인하자. 김날라의 경우 학교에 들어온지 얼마 안되었기 때문에 이 3가지에 대한 값 밖에 없고 getScore()의 값은 null값으로 주소값이 존재하지 않는다 . 그렇기 때문에 null값에서 getKor()값을 참조하게 만들 수는 없기 때문에 error가 존재한다 . null / pointer / Exception의 에러가 발생하는데  pointer이라는 뜻은 주소값을 쫒다라는 의미, null의 값을, 그럼으로 일어나는 에러 라는 뜻이다. 비어있는 주소값을 쫒아서 값을 바라보게 만들 수 없다고 이야기하는 것이다. 

기본형의 경우 값을 전달 시키면 끝이고, 메소드를 사용하는 객체의 주소값과 참조시키는 주소값의 경우 전달하려면 객체를 만들어야한다. String 빼고는 전부 new를 붙여서 작성한다고 생각하면된다. 객체를 만드는 것을 주저하지 말고 만들어서 입력하여, 주소값을 전달해줘서 표현이 되도록 노력하자 

아래와 같이!! 

 

반응형

'중앙 HTA (2106기) story > java story' 카테고리의 다른 글

메소드 재정의 (Overriding)  (0) 2021.09.16
상속  (0) 2021.09.14
Static , 정적메소드, 정적변수  (0) 2021.09.12
생성자 (constructor)  (0) 2021.09.09
메소드  (0) 2021.09.08
Comments