7. 클래스 - (3) 캡슐화

한승록·2023년 4월 21일
0

자바 기초

목록 보기
13/21
post-thumbnail
'캡슐화'는 서로 멤버 필드의 여러 변수와 메서드 들을 묶어 하나의 객체로 나타내는 것을 의미합니다.
따라서 캡슐화객체를 생성하기 위해서 필요한 구성요소에 대해 이해하셔야 합니다.
먼저 말씀드릴 구성요소는 '멤버 필드' 입니다.
객체는 속성정보를 저장할 수 있어야 하는데 해당 역할을 수행하는 것이 '멤버 필드' 입니다.
(필드는 반드시 클래스 하위에 작성해야 하며 main함수 내부에 작성하시면 안됩니다.)
    class Student {

        // 멤버 필드
        // - 필드와 메서드는 반드시 클래스 바로 하위에만 작성해야 합니다
        String name;
        int age;
    }

    public class Velog {

        public static void main(String[] args) {
            // 해당 구역에 생성되는 변수는 지역변수 입니다
        }
    }
다음은 '멤버 메서드' 입니다.
실생활에서도 객체를 생성하기 위해 설계도(클래스)재료(멤버 필드) 가 있다고 하더라도 도구(메서드) 없이는 생성할 수 없습니다.
		class Student {

          	// 멤버 필드
          	// - 필드와 메서드는 반드시 클래스 바로 하위에만 작성해야 합니다
            // - 멤버 필드는 함수 실행이 끝나도 객체가 남아있다면 데이터가 유지됩니다
          	String name;
          	int age;
        
			void show() {
				System.out.printf("이름은 %s이고, 나이는 %d살 입니다\n", name, age);
			}
            
            Student st1 = new Student();
		
			st1.name = "이지은";
			st1.age = 31;
		
			st1.show();	
            // 메서드의 내용이 아무리 길어도 호출을 통하여 손쉽게 지시할 수 있다
            
            Student st2 = new Student();
			
            st2.name = "나단비";	// 멤버 필드는 객체마다 다른 속성을 저장할 수 있다
			st2.age = 5;
			
            st2.show();	
		}
'생성자''객체'가 생성될 수 있도록 호출하는 독특한 역할을 수행하는 함수입니다.
위에서 클래스설계도멤버 필드재료, 메서드도구 로 설명드렸습니다.
하지만 여기서 생성자'객체'생성할 수 있도록 하는 실질적인 역할을 수행합니다.

따라서 자바에서는 오로지 생성자를 통해서만 객체생성이 가능하며 참조변수를 여러개 생성하더라도 생성자를 호출하지 않았다면 객체는 없는 것입니다.
(다음 예시를 통해 조금 더 자세히 설명을 드리겠습니다.)
        class Product {
            // 필드 (상품의 이름과 가격을 기재한다)
            String name;
            int price;

            // 메서드 (상품정보를 간략히 출력하는 기능)
            void show() {
                System.out.printf("%s : %,d원\n", name, price);
            }

        }

		public class Velog {
			public static void main(String[] args) {
		// 생성자는 클래스를 이용하여 객체를 생성할 때 호출하는 특수한 함수이다

		p1.name = "아메리카노";		// 값을 전달하지 않고 생성했으니
		p1.price = 2000;		// 멤버 필드에 직접 값을 대입해야 한다
		p1.show();
		

		Product p2 = new Product("돌체라떼", 4000);
		p2.show();
        
        Product p3 = null;
		p3.show();

<※ 결과는 다음과 같습니다.>

생성자가 없는 상황에서 객체를 생성하게 되면 해당 구문이 표시가 됩니다.
The constructor Product(String, int) is undefined
해당 유형의 생성자를 찾을 수 없다는 구문입니다.
그런데 'p1' 객체 생성에서 보시면 해당 경고문이 발생하지 않는 것을 알 수 있을겁니다.


이는 생성자의 규칙에서 알 수 있습니다.

생성자는 기본 생성자 가 클래스 생성 시 디폴트 값으로 생성되게 됩니다. 따라서 인자를 포함하는 새로운 생성자를 작성하지 않는 이상 기본 생성자는 사용할 수 있게 됩니다.
(이 말은 즉 인자가 전달되는 새로운 생성자를 작성하게 되면 기본 생성자는 작동하지 않는다는 의미를 가집니다.)

마지막으로 'p3' 객체의 결과를 통해 생성자의 특성에 대해 말씀드려볼까 합니다.

보시는 바와 같이 NullPointer 예외가 발생하게 됩니다. 이를 통해 클래스의 생성자를 호출하지 않으면 객체가 생성되지 않는다는 것을 알 수 있습니다.
마지막 구성요소는 외부의 다른 객체와의 상호작용을 담당하는 '접근 제한자' 입니다.
'접근 제한자'는 클래스에 작성된 멤버요소의 접근에 대하여 제한을 설정하는 키워드를 의미합니다.
종류는 다음과 같습니다.
  • private : 클래스 내부에서만 접근 가능, 같은 클래스의 서로 다른 객체끼리는 접근 가능
  • package : 같은 패키지 폴더 내부의 클래스끼리 접근 가능, 기본값
  • protected : 패키지 범위를 포함하며, 패키지가 달라도 상속관계라면 접근 가능
  • public : 클래스 외부에서도 누구나 접근 가능한 요소
		private int n1 = 1;
		int n2 = 2;
		protected int n3 = 3;
		public int n4 = 4;
	
	
        // 메서드는 클래스 내부에서 수행되므로, private 이라도 접근하여 출력할 수 있다
        void show() {
            System.out.println("n1 : " + n1);
            System.out.println("n2 : " + n2);
            System.out.println("n3 : " + n3);
            System.out.println("n4 : " + n4);
        }
        
        Test ob = new Test();
		ob.show();
		
		System.out.println("======================");
		
		// The field Test.n1 is not visible
		// 공개하지 않았기 때문에, 외부에서 볼 수 없다 (존재하지 않는다라고 하지 않고 보이지 않는다 라고함)
		System.out.println("n1 : " + ob.n1);
		System.out.println("n2 : " + ob.n2);
		System.out.println("n3 : " + ob.n3);
		System.out.println("n4 : " + ob.n4);
		
		
		
		// private 필드의 값은 직접 참조할 수 없다
		// 그러나, ob.show() 의 형태처럼[내부 메서드]를 통해서는 접근할 수 있다

<※ 결과는 다음과 같습니다.>

위의 요소를 통해 클래스 내부에서 생성한 메서드와 외부 객체 생성을 통해 호출한 함수의 출력 결과를 통해 'private'호환성이 넓지 않으며 보안을 위해 사용될 수 있다는 점을 아실 수 있으실 겁니다.

하지만 결국 프로그래밍은 외부에서 접근이 가능해야 하는데 해당 요소를 사용할 필요가 있을까요?

해당 물음에 대한 대답은 다음 포스트에서 설명 드리겠습니다
profile
개발 학습

0개의 댓글