코딩 기록들

[Java Programming] 5.2 패키지, 접근제어지시자, 정보은닉&캡슐화 본문

Java

[Java Programming] 5.2 패키지, 접근제어지시자, 정보은닉&캡슐화

코딩펭귄 2024. 1. 23. 17:14

패키지

- 윈도우에 있는 폴더라고 생각하기

- 여러 자바파일 중 관련된 파일들만 정리하여 모아둔 폴더

- 한 패키지 내에서 같은이름의 java파일은 만들 수 없음

패키지 이름 쓰는 방법

- 규칙 : 소문자와 점(".")을 제외한 다른문자는 쓰지 않음 (단어와 단어가 합쳐져도 구분되지 않음. 다 소문자로 작성)

- 애플리케이션을 개발하는 회사의 도메인을 역순으로 작성

   ex) naver.com 에서package_exam애플리케이션을 개발한다면 -> com.naver가 기본 패키지명이 됨

        업무명이 회원관리 -> com.naver.member.management

 

-> 이런식으로 패키지를 만든다면, 

 

 

 

 

 

 -> 이렇게 폴더가 생성되는것을 확인할수있음

 

 

 

-> 이클립스에서 패키지및 파일들을 좀더 깔끔하게 보기위한 설정

 

 

 

 

 

 

 

-> 위의 설정을 하면 이렇게 보임

 


접근제어지시자

- 패키지와는 별개의 문제로 클래스, 멤버변수, 메소드 등은 다른 클래스나 인스턴스가 접근을 마음대로 할 수 없도록 제한하는 기능이 있는데, 이것을 접근제어지시자라고 함

잘못된 접근제어지시자를 사용할때 발생하는 에러 -

The field Member.id is not visible
The field Member.name is not visible

 

- 지시자는 제공되는 범위에따라 4개로 구분됨

** 접근제어 지시자를 안쓴경우 자동으로 default로 지정

 


 

정보은닉

- 무엇을 숨기는가? : 인스턴스의 정보를 표현하는 멤버변수는 데이터의 보호를 위해 외부로부터 접근이 제한돼야함

  -> 따라서 멤버변수의 접근제한자는 public이 아닌 private으로 사용해야하고, 생성자를 통해 멤버변수의 값을 설정해야함

- 메모리 주소의 연결을 끊기 위함

- 멤버변수를 외부에서 변경하지못하게 하도록 private 붙임 -> 확인도 못함 -> 해결방법 : getter 정의 (값을 돌려돌려서 줌)

getter 형태 
public + 멤버변수의 타입 + get+멤버변수(첫글자 대문자로) {
return this.멤버변수;
}

 

- 멤버 인스턴스의 멤버변수들은 private로 제한 + 값할당은 생성자에서만 가능 + 멤버변수의 값은 Getter로 반환하여 사용

 

   Getter   

- 외부에서 값을 받아 필드를 변경하는 메소드

- 외부의 데이터를 읽을 때 메소드 사용

-> 메소드로 필드값을 가공한 후 외부로 전달

 

캡슐화

기능이 없는 데이터클래스에서 '만', 멤버변수의 값은 재할당이 불가능할까? -> Setter 사용 ! 

- 외부에서 멤버변수에게 접근할수 있게 됨

- setter 는 데이터를 반환시키지 않음! (void)

 

    Setter     

- 필드의 값을 외부로 리턴해주는 메소드

- 메소드를 통해 필드를 변경하는 방법 

- 필드는 외부에서 접근할 수 없게 막고, 메소드는 공개해서 외부 메소드를 통해 필드에 접근하도록 유도 (가능한 이유 : 메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있기 때문)

 

 

Getter Setter 사용예제

package com.naver.member.management; // 자바파일의 위치를 알려줌

public class Member {
	
	private String id;
	private String name;
	
	public Member(String id, String name) {
		this.id = id;
		this.name = name;
		
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

- 데이터를 가져오는 getter
- 데이터를 넣는 setter

package com.naver.bbs.management;

//다른패키지에 있는 클래스를 사용하려면, 어떤패키지에 있는지 살펴봐야함
import com.naver.member.management.Member;

public class Article {

	public static void main(String[] args) {
		
		Member member = new Member("ID", "관리자");
		
		//데이터를 가져오는 getter
		String id = member.getId();
		String name = member.getName();
		
		System.out.println(id);
		System.out.println(name);
		
		//데이터를 넣는 setter
		member.setId("changed_id");
		member.setName("일반사용자");
		
		id = member.getId();
		name = member.getName();
		
		System.out.println(id);
		System.out.println(name);
	}
}

 

- 단, 필드타입이 boolean일경우 -> Getter은 get으로 시작하지않고, is로 시작하는것이 관례임

- 만약, 외부에서 필드값을 읽을수만 있고, 변경하지 못하도록 하고싶다면

  -> Getter메소드만 선언(=읽기전용)   or  Setter메소드가 private 접근제한을 갖도록 선언