숨 참고 JAVA 다이브 🌊 (8) - 은닉성, 접근 한정자

joyfulwave·2022년 8월 16일
0

숨 참고 JAVA 다이브

목록 보기
8/21

어려울 거 같아서 미뤄뒀던 프로그래밍 공부 이번에 숨 딱 참고 Java 다이브 💦


💡 은닉성

  • 멤버변수나 메서드가 객체에 노출되지 않도록 설정하는 기법
  • 객체를 사용하는 측의 실수로 인한 기능의 오작동을 방지하기 위해, 클래스의 일부를 숨기는 처리를 말해요.

📎 변수와 메서드의 접근 한정자

  • 변수의 이름이나 메서드의 이름 앞에 접근 한정자를 지정해줘요.

⚫️ public

  • 모든 곳에서 접근이 가능해요.
  • 일반적으로 모든 메서드 앞에 명시해요.

⚫️ private

  • 클래스 안에서 사용 가능하고, 객체를 통해 접근할 순 없어요.
  • 일반적으로 모든 멤버변수 앞에 명시해요.

⚫️ protected

  • 현재 클래스 내의 다른 자원이나, 같은 패키지 안에 존재하는 클래스와 하위 클래스에서 접근 가능해요. 그렇지만 잘 사용하지 는 않아요.

⚫️ default

  • 접근 한정자를 명시하지 않은 경우에요. 현재 클래스 내의 다른 자원이나 동일 패키지 내의 다른 클래스에서 접근 가능해요. default도 protected처럼 잘 사용하지는 않아요.

📎 getter, setter

  • 멤버변수가 은닉된 형태로 선언된 경우, 프로그램의 가장 근본적인 목적인 데이터에 접근하는 방법이 사라지므로, 메서드를 통하여 간접적으로 방법이 마련되어야 해요. getter, setter는 이러한 상황에서 은닉된 멤버변수에 간접적으로 접근하기 위하여 정의된 메서드들을 의미하는 용어에요.

⚫️ getter -> 은닉된 멤버 변수의 값을 리턴하기 위한 메서드

⚫️ setter -> 파라미터로 전달된 값을 멤버변수에 복사하기 위한 메서드

class User{
	private String userName;
    private int userAge;
    
    public String getUserName(){
    	return userName;
    }
    
    public void setUserName( String userName ){
    	this.userName = userName;
    }
    
    public int getUserAge(){
    	return userAge;
    }    
    
    public void setUserAge( int userAge ){
    	this.userAge = userAge;
    }
}
  • "get", "set" 접두사 뒤에 변수 이름을 첫 글자가 대문자의 형태로 명시
  • getter는 연결된 멤버변수의 데이터 타입을 리턴형으로 명시
  • setter는 연결된 멤버변수의 데이터 타입을 파라미터 형으로 명시

⚫️ getter, setter 굳이 필요한가요?

public 변수로 그냥 선언해도되는데 굳이 getter, setter은 사용하는 이유는 뭘까요? 그 이유는 비즈니스 로직(업무 로직)과 프로그래밍 로직의 차이가 있을 수 있기 때문이에요. 예를 들어, public int age 라는 변수가 선언이 되었다고 생각해보면 사람의 나이는 -1살이 될 수 없지만 int 라는 데이터타입의 프로그래밍상 -1은 충분히 입력될 수 있어요. getter, setter을 사용하여 의도치 않은 버그가 발생하여 잘못된 데이터의 입력이나 데이터가 손상되는 것을 방지할 수 있어요. 또는 getter을 아예 입력하지 않음으로써 다른 사용자의 접근을 아예 막을 수도 있어요.

	class HumanAge{
    	private int age;
        
        public int getAge(){
        	return age;
        }
        
        public void setAge(){
        	if(age >= 0){
              this.age = age;
            }else{
	  		this.age = 0;
	  		}	  
        }
    }

📎 클래스의 접근 한정자

⚫️ public

  • 객체 생성이 가능해요.
  • 서로 다른 소스코드에 정의된 클래스끼리도 객체 생성이 가능해요.

⚫️ default

  • 동일한 소스코드에 정의된 클래스끼리만 객체로 생성이 가능해요.

📎 클래스의 분리

  • 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적 이므로, 기능단위로 소스코드를 분리해야 해요.
  • 소스코드가 분리된 클래스끼리는 public이 명시되어야만 서로 객체 생성이 가능해요.
  • 일반적으로 클래스 정의에는 public 접근 한정자만 사용해요.
  • 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있어요.

📎 자바빈즈(Java Beans)

  • 자바 언어에서 사용하는 복합적 데이터 표현의 최소 단위로서, 재사용가능한 컴포넌트(구성요소)를 생성할 수 있어요.
  • 자바 빈즈 클래스로서 작동하기 위해서, 객체 클래스는 명명법, 생성법 그리고 행동에 관련된 일련의 관례를 따라야만 해요. 이러한 관례는 개발도구에서 자바 빈즈와의 연결을 통해 클래스의 사용과 재사용 그리고 클래스의 재배치를 가능하게 해줘요.

지켜야할 관례

  • 클래스는 생성자를 가지고 있어야한다.
  • 클래스의 속성들은 get, set 메서드를 통해 접근할 수 있어야한다.
	class User{ //자바빈즈에 기본 모습
    
      private String userName;

      public String getUserName(){
          return userName;
      }

      public void setUserName( String userName ){
          this.userName = userName;
      }
    
    }
    

📎 자동완성

⚫️ 파라미터가 있는 생성자


(1) 화면에서 마우스 오른쪽 버튼을 눌러요. - [Source] - [Generate Constructor using Fields]


(2) 포함할 변수를 체크해줘요 - [Access modifier]에서 접근 한정자를 선택해줘요 - [Generate]

(3) 파라미터가 있는 생정자가 만들어졌음을 확인할 수 있어요.

⚫️ getter, setter


(1) 화면에서 마우스 오른쪽 버튼을 눌러요. - [Source] - [Generate Getters and Setters]


(2) 포함할 변수를 체크해줘요 - [Access modifier]에서 접근 한정자를 선택해줘요 - [Generate]


(3) getter와 setter가 만들어졌음을 확인할 수 있어요.




다음 다이브에서 또 만나요 🌊




출처
https://media.giphy.com/media/l2Je1bFuOpkNpyqYM/giphy.gif
https://media.giphy.com/media/Jbb3KS22397YQ/giphy.gif

0개의 댓글