클래스 - 은닉성, 캡슐화

조혜진·2022년 5월 12일
0

java 이론

목록 보기
9/10

📌 은닉성이란 ?

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

📌 접근한정자

  • 변수 이름이나 메서드 이름앞에 "접근 한정자"를 지정한다.
package hiding;
class Student{
	public String name = "자바학생";
	private int weight = 100;
}
public class Main01 {
	public static void main(String[] args) {
		Student std = new Student();
		// public 이므로 접근 가능
		System.out.println(std.name);
		// private 이므로 접근 불가능
		// System.out.println(std.weight
	}	
}

📌 클래스와 접근한정자

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

📌 멤버변수의 은닉처리

  • 거의 대부분의 멤버변수는 은닉처리를 기본으로 한다.

📌 getter, setter

  • 멤버변수가 은닉된 형태로 선언된 경우 프로그램의 가장 근본적인 목적인 데이터에 접근하는 방법이 사라진다.
  • 메서드를 통하여 간접적으로 접근하는 방법이 마련되어야 한다.
  • getter, setter는 은닉된 멤버변수에 간접적으로 접근하기 위하여 정의된 메서드들을 의미하는 용어이다.
  • 메서드 작성 예
  • 'get', 'set' 접두사 뒤에 변수이름을 첫 글자가 대문자인 형태로 명시
  • getter는 연결된 멤버변수의 데이터 타입을 리턴형으로 명시
  • setter는 연결된 멤버변수의 데이터 타입을 파라미터 형으로 명시
    package hiding;
    class StudentJava2{
    	// 은닉된 멤버변수 -> 현재 블록 안에서만 접근가능함
    	private String name;
    	private int age;	
    	// getter 메서드 2개
    	// 은닉된 멤버변수의 값을 읽는 방법
    	public String getName() {
    		return this.name;
    	}
    	public int getAge() {
    		return this.age;
    	}	
    	// setter 메서드 2개
    	// 은닉된 멤버변수에 값을 넣는 방법
    	public void setName(String name) {
    		this.name = name;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}		
    }
    public class Main03 {
    	public static void main(String[] args) {
    		// 객체생성
    		StudentJava2 sj = new StudentJava2();		
    		// setter 임의의 데이터 세팅, name, age 모두
    		sj.setName("JAVA학생");
    		sj.setAge(20);		
    		// getter 출력, name, age 모두
    		System.out.println(sj.getName());
    		System.out.println(sj.getAge())	
    	}
    }

📌 자바빈즈(JavaBeans)

  • 자바 언어에서 사용하는 복합적인 데이터 표현의 최소 단위로서, 재사용 가능한 컴포넌트(구성요소)를 생성할 수 있다.
  • 자바빈즈 클래스로서 작동하기 위해서, 객체 클래스는 명명법, 생성법 그리고 행동에 관련되어 일련의 관례를 따라야만 한다.
  • 지켜야할 관례
    -> 클래스는 생성자를 가지고 있어야한다.
    -> 클래스 속성들은 getter, setter 메서드들을 사용해 접근할 수 있어야 한다.

📌 캡슐화 (자바빈즈 사용이유)

  • 접근 제한자는 객체지향의 캡슐화, 그리고 그를 통한 은닉화를 위한 도구이다.
  • 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다.
  • 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게하고 코드를 명확히 함
  • 외부에서 멤버를 엑세스하는 방법을 지정할 수 있도록, 직접 접근을 막거나 접근 전
    부가적인 처리를 요구함
  • 정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함
    	class Person{
    		int age;
    		void howOld(){
    			system.out.println( age );
    		}
    	}
    	class Main{
    		public static void main( String[] args ){
    			Person p1 = new Person();
    			p1.age = -1;
    			p1.howOld();
    		}
    	}
    //------------------------------------------------------------------
    // setter는 이렇게 변수의 값 대입이 여러 곳에서, 제한 없이 가능한 것을 접근 제한자로 막고,
    // 접근 범위에 한해서 메소드로 대입전 값을 처리 후 대입되게 하기 위해 사용된다.
      		 class Person{
    			private int age;
    			public void setAge( int age ){
    				if( age >= 0 ){
    					this.age = age;
    				} else {
    					this.age = 0;
    				}
    			}
    			void howOld(){
    				system.out.println( age );
    			}
    		}
    	class Main{
    		public static void main( String[] args ){
    			Person p1 = new Person();
    			p1.age = -1;
    			p1.howOld();
    		}
    	}
    /* 변수의 접근을 private로 처리해서 해당 클래스 안에서만 노출되게 바꾸고, 
       다른 사람들도 사용할 필요가 있는 변수들만 getter를 이용해서 드러냈다.
       이렇게 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것이 getter */
       class Person{
    		private int age;
    		private String name;
    		private String hobby;
    		private String gender;
    		public void setGender( String gender ){
    			this.gender = gender;
    		}
    		public void setAge( int age ){
    			if( age >= 0 ){
    				this.age = age;
    			} else {
    				this.age = 0;
    			}
    		}
    		void howOld(){
    			system.out.println( age );
    		}
    	}
profile
안녕하세요

0개의 댓글

관련 채용 정보