Binary World

JAVA CLASS : 접근 제한 수식어(private, (package), protected, public) 본문

개발자의 길/JAVA

JAVA CLASS : 접근 제한 수식어(private, (package), protected, public)

모쿠 2016. 12. 29. 14:53

<접근 제한 수식어(Access Modifier)>


1. 종류: private, (package), protected, public


2. 기능: 

1) 멤버 변수에 대한 접근 권한을 설정

2) 메소드에 대한 접근 권한을 설정

3) 생성자에 대한 접근 권한을 설정

4) 클래스에 대한 접근 권한을 설정(package, public만 사용 가능)


3. 의미

1) private : 선언(정의)된 클래스 안에서만 직접 접근(사용)이 가능

2) (package) : 같은 패키지에 있는 클래스들에서 직접 접근(사용)이 가능

3) protected : 같은 패키지에 있거나 상속받는 클래스들에서 직접 접근(사용) 가능

4) public : 어디서든지 직접 접근(사용) 가능

 

4. 사용 범위 : private < (package) < protected < public


5. 캡슐화(encapsulation): 클래스를 설계할 때, 멤버 변수(필드)들을 private으로 선언해서 외부 클래스에서 필드들을 직접 접근해서 읽거나 쓰지 못하게 하는 것. 필요한 경우에 한해서 public 메소드를 정의해서 private 멤버 변수를 간접적으로 읽거나 쓰는 것을 가능하게 할 수 있음.




<Java Practice>


1. 접근 제한 수식어에 대한 테스트


Test01.java(멤버 변수를 선언할 클래스)


package edu.java.access01;


// 접근 제한 수식어(Access Modifier)

// 1. 종류: private, (package), protected, public


public class Test01 {

// 멤버 변수

private int n1;

int n2;

protected int n3;

public int n4;

// 메소드

public void display() {

System.out.println("n1 = " + n1);

System.out.println("n2 = " + n2);

System.out.println("n3 = " + n3);

System.out.println("n4 = " + n4);

}

} // end class test01


* AccessMain01.java(Test01 클래스의 변수들을 출력할 메인 클래스)


package edu.java.access01;


public class AccessMain01 {

// field 는 멤버 변수 또는 프로퍼티


public static void main(String[] args) {

// Test01 클래스의 인스턴스를 생성

Test01 t1 = new Test01();

t1.display(); // 메소드 내에 선언된 내용은 출력됨

// t1.n1 = 100; // 컴파일 에러

// private 멤버 변수는 다른 클래스에서 직접 접근이 불가능(보이지 않음)

// -> 값을 변경하거나 읽어오지 못함

System.out.println("===========");

t1.n2 = 200; // (package): 같은 패키지에 있기 때문에 접근 가능

t1.n3 = 300; // protected: 같은 패키지에 있기 때문에 접근 가능

t1.n4 = 400; // public: 어디에서든지 접근 가능

t1.display();

} // end main()


} // end class AccessMain01


*출력화면

n1 = 0

n2 = 0

n3 = 0

n4 = 0

===========

n1 = 0

n2 = 200

n3 = 300

n4 = 400



2. 접근 제한 수식어에 대한 두번째 테스트


*AccessMain02(access01 패키지의 클래스를 불러오는 메인 클래스)


package edu.java.access02;


import edu.java.access01.Test01;

// access01패키지에서 test01 클래스의 인스턴스 생성


public class AccessMain02 {


public static void main(String[] args) {

// edu.java.access01.Test01 클래스의 인스턴스 생성

Test01 t2 = new Test01();

t2.display();

//t2.n1 = 100;  //외부 사용 불가능 

//t2.n2 = 200;  //다른 패키지라서 불가능

//t2.n3 = 300;  //다른 패키지고 상속받지 못해서 불가능

t2.n4 = 400; //public으로 선언했기 때문에 다른 패키지라도 사용이 가능

} // end main()


} // end class AccessMain02


*출력화면


package edu.java.access02;


import edu.java.access01.Test01;

// access01패키지에서 test01 클래스의 인스턴스 생성


public class AccessMain02 {


public static void main(String[] args) {

// edu.java.access01.Test01 클래스의 인스턴스 생성

Test01 t2 = new Test01();

t2.display();

//t2.n1 = 100;  //외부 사용 불가능 

//t2.n2 = 200;  //다른 패키지라서 불가능

//t2.n3 = 300;  //다른 패키지고 상속받지 못해서 불가능

t2.n4 = 400; //public으로 선언했기 때문에 다른 패키지라도 사용이 가능

} // end main()


} // end class AccessMain02


3. 캡슐화와 관련된 변수, 메소드들


*MyNumber.java(번호를 저장하는 클래스)


package edu.java.access03;


// 캡슐화(encapsulation):

// 클래스를 설계할 때, 멤버 변수(필드)들을 private으로 선언해서

// 외부 클래스에서 필드들을 직접 접근해서 읽거나 쓰지 못하게 하는 것.

// 필요한 경우에 한해서 public 메소드를 정의해서

// private 멤버 변수를 간접적으로 읽거나 쓰는 것을 가능하게 할 수 있음.

public class MyNumber {

// 멤버 변수

private int number;

// 생성자

public MyNumber(int number){

this.number = number;

}

// 메소드

public int add(int x){

number += x;

return number;

}

// private 멤버 변수를 간접적으로 읽어 오는 메소드 - getter

public int getNumber() {

return number;

}

// private 멤버 변수를 간접적으로 변경하는 메소드 - setter

public void setNumber(int number) {

this.number = number;

}


} // end class MyNumber



* AccessMain03


package edu.java.access03;


public class AccessMain03 {


public static void main(String[] args) {

// MyNumber 클래스의 인스턴스 생성

MyNumber num = new MyNumber(100);

int result = num.add(1);

System.out.println("result = " + result);

result = num.add(1);

System.out.println("result = " + result);


System.out.println("========================");

MyNumber x = new MyNumber(0);

//System.out.println("result = " + x.number);

//직접 접근은 불가능

System.out.println("number = " + x.getNumber());

// x.number = 10;

x.setNumber(10);


} // end main()


} // end class AccessMain03 


* 출력화면 


result = 101

result = 102

========================

number = 0



4. 연락처를 생성하고 저장하는 기능


*Contact.java(연락처에 관련된 변수와 메소드, 생성자를 만든다)


package edu.java.access04;


public class Contact {

// 멤버 변수(필드, 프로퍼티)

private String name;

private String phone; 

private String email;

//생성자

public Contact() {}

public Contact(String name, String phone, String email) {

this.name = name;

this.phone = phone;

this.email = email;

}

// getter/setter 메소드

public String getName(){

return name;

}

public void setName(String name){

this.name = name;

}

public String getPhone(){

return phone;

}

public void setPhone(String phone){

this.phone = phone;

}

public String getEmail() {

return email;

}

public void setEmail(String email){

this.email = email;

}

public void displayInfo() {

System.out.println("--- 연락처 정보 ---");

System.out.println("이름: " + name);

System.out.println("전화번호: " + phone);

System.out.println("이메일: " + email);

}


} // end class Contact 


* AccessMain04(연락처 정보를 불러오거나 입력하는 메인 클래스)


package edu.java.access04;


public class AccessMain04 {


public static void main(String[] args) {

// 매개변수가 있는 생성자를 사용해서 Contact 클래스의 인스턴스 생성

Contact c1 = new Contact("진혁", "010-333-333", "quest@test.com");

c1.displayInfo();

c1.setPhone("010-222-22");

c1.displayInfo();

System.out.println("==================");

// 기본 생성자를 사용해서 Contact 클래스의 인스턴스를 생성

Contact c2 = new Contact();

c2.displayInfo();

System.out.println();

c2.setName("홍길동");

c2.setPhone("010-1111-2222");

c2.setEmail("gildong@gmail.com");

c2.displayInfo();

} // end main()


} // end class AccessMain04 


* 출력화면


--- 연락처 정보 ---

이름: 진혁

전화번호: 010-333-333

이메일: quest@test.com

--- 연락처 정보 ---

이름: 진혁

전화번호: 010-222-22

이메일: quest@test.com

==================

--- 연락처 정보 ---

이름: null

전화번호: null

이메일: null


--- 연락처 정보 ---

이름: 홍길동

전화번호: 010-1111-2222

이메일: gildong@gmail.com 



5. 클래스의 접근 제한 수식어


*AccessMain06(클래스 호출)


package edu.java.access06;


// 클래스의 접근 권한 수식어: public, (package)

// 1. public class : 어디서든지 인스턴스 생성이 가능한 클래스

// 2. class : 같은 패키지에 속한 클래스들에서만 인스턴스 생성이 가능

// (주의)

// 1. public class의 이름은 반드시 java 파일의 이름과 같아야 함!

// 2. 하나의 java 파일에서 여러개의 클래스를 정의하는 것은 가능하지만

// 같은 파일에서는 public class는 오직 하나만 있어야 함!


public class AccessMain06 {


public static void main(String[] args) {

// 같은 패키지에 있는 public class 생성 가능

TestPublic test1 = new TestPublic();

System.out.println(test1); // 주소값이 출력됨

// 같은 패키지에 있는 class의 인스턴스 생성 가능

TestPackage test2 = new TestPackage();

System.out.println(test2); // 주소값이 출력됨


} // end main()


} // end class 


*TestPublic


package edu.java.access06;


// public은 자바 파일에 하나만 가능하고, 

// (package)로 선언하는건 여러개가 가능하다.

public class TestPublic {


} // end class TestPublic


class Test2 {

} // end class Test2


class Test3 {

}


*TestPackage


package edu.java.access06;


// public은 자바 파일에 하나만 가능하고, 

// (package)로 선언하는건 여러개가 가능하다.

public class TestPublic {


} // end class TestPublic


class Test2 {

} // end class Test2


class Test3 {

}


* 출력화면(주소값이 출력됨)


edu.java.access06.TestPublic@15db9742

edu.java.access06.TestPackage@6d06d69c


6. 인스턴스 생성


* AccessMain07(다른 패키지에 생성된 클래스들을 불러오는 메인 클래스)


package edu.java.access07;


import edu.java.access06.TestPublic;

// import edu.java.access06.TestPackage; 에러

// import edu.java.access06.TestTest; 에러

public class AccessMain07 {


public static void main(String[] args) {

// edu.java.access06.TestPublic의 인스턴스 생성 가능

// public으로 선언한 클래스이기 때문에 어디서든지 사용 가능

// 클래스를 사용하기 위해서 import문이 필요

// Ctrl+Shift+O: import문 자동 정리

TestPublic test1 = new TestPublic();

System.out.println(test1);

// edu.java.access06.TestPackage의 인스턴스 생성 불가능

// (package) class이기 때문에

// 다른 패키지에 속한 클래스에서는 인스턴스 생성 불가능

// TestPublic test2 = new TestPublic(); 

} // end main()


} // end class AccessMain07



7. 자기자신을 리턴하는 메소드


* MyNumber.java(숫자를 받아서 더하고 뺄 수 있는 클래스)


package edu.java.access08;


public class MyNumber {

private int data;


// default 생성자

public MyNumber() {}

// 매개변수 있는 생성자

public MyNumber(int data) {

this.data = data;

}


public int getData() {

return data;

}


public void setData(int data) {

this.data = data;

}

// MyNumber 타입을 매개 변수로 전달 받아서 

// 내가 가지고 있는 data와 매개변수에 있는 data를 더한 후

// 자기 자신(this)를 리턴하는 메소드

public MyNumber add(MyNumber number){

data += number.data; //this.data = this.data + number.data;

return this; // 나의 주소값을 리턴하겠다는 의미

}

public MyNumber subtract(MyNumber number) {

data -= number.data;

return this; // 나의 주소값을 리턴하겠다는 의미

}


} // class MyNumber


* AccessMain08


package edu.java.access08;


public class AccessMain08 {


public static void main(String[] args) {

// 기본 생성자를 사용해서 MyNumber 클래스의 인스턴스 생성

MyNumber num1 = new MyNumber();

System.out.println(num1); // 인스턴스의 참조값(주소)

System.out.println(num1.getData());

// 매개 변수 생성자를 사용해서 MyNumber 클래스의 인스턴스 생성

MyNumber num2 = new MyNumber(10);

System.out.println(num2.getData());

// num1의 메소드 호출

MyNumber result = num1.add(num2);

System.out.println(result);

System.out.println(result.getData());

MyNumber num3 = new MyNumber(20);

result = num1.add(num3); //num1 은 10을 갖고 있고 num3과 더한다

System.out.println(result.getData());

System.out.println("=====================");

MyNumber x = new MyNumber(1);

MyNumber y = new MyNumber(2);

MyNumber z = new MyNumber(3);

x.add(y).add(z); // x + y + z

System.out.println(x.getData());

} // end main()


} // end class AccessMain08




Comments