접근 제한자

클래스는 변수와 함수, 셍성자로 이루어져 있는데 이 세가지 속성을 접근하기 위해 접근제한자가 필요하다

접근제한자는 함수나 변수에 접근하는 방식에 대한 것을 설정하는 것.

 

  • public
  • protected
  • default
  • private

접근 허용 범위 크기는 위쪽부터 아래순

 

접근제한자는 객체 지향의 특징 중 '캡슐화' 와 관련있다

캡슐화란? 클래스 안에 기능과 속성을 묶어서 데이터 외부로부터 보호하는 뜻

 

 

public , private

public은 외부에서 접근가능하여 접근 제한이 없다 같은 패키지/다른 패키지에서도 접근가능하다

private은 캡슐화를 위해 자기 자신의 클래스 내에서만 접근이 가능하다 

class A {
	public String one = "public";
	private String two = "private";
}

public class Student{
	public static void main(String[] args) {
		A a = new A();
		System.out.println("public 테스트 : "+ a.one); // public 테스트 : public
		System.out.println("private 테스트 : "+ a.two); // 컴파일 에러
    }
}

 

 

public 다른 패키지여도 접근가능

package model;

public class School{
	public static String region = "울산";
}
package demo;

public class Student{
	public static void main(String[] args) {
    	School school = new School();
		System.out.println(school.region);
    }
}

 

 

default

변수 앞에 아무것도 안 적으면 default 적용이 되어 같은 패키지 내에서만 접근가능

하지만 자바에서 비명시적 (default)를 권장하지 않으니 되도록 명시적 private, public, protected를 설정해준다.

class A {
	String one = "default";
}

public class Student{
	public static void main(String[] args) {
		A a = new A();
		System.out.println("default 테스트 : "+ a.one); // default 테스트 : default
    }
}

 

 

 

protected

 

같은 패키지 내에서 접근이 가능하나 다른 패키지에 접근 가능하다

다른 패키지에 접근이 가능하게 하려면 파생 클래스에서만 멤버를 접근할 수 있다.

 

파생클래스란? 

부모 클래스의 상속을 통해 새롭게 작성된 클래스

class 자식 클래스 extend 부모 클래스

 

다른 패키지에 접근 가능하기 위해 School 클래스를 상속받고  School 클래스의 멤버에 접근한다 (단 static 변수)

public class Student extends School

 

package model;

public class School{
	protected static String region = "울산";
   	protected String name;
}
package demo;

public class Student extends School{
	
	public static void main(String[] args) {
        	System.out.println(region); // 방법1. static 멤버면 바로 접근가능
        	System.out.println(School.region);  // 방법2. 클래스명.static변수명

        	School school = new School(); // 방법3. 객체 생성해서도 static 변수 접근가능
		System.out.println(school.region); 
        
     	 	System.out.println(school.name); // 변수에 static 을 사용하지 않고(=인스턴스 변수) 객체를 생성하여 호출
    }
    
}

 

  • static변수에 접근하는 방법
방법1. static 멤버면 바로 접근가능 
System.out.println(region);

방법2. 클래스이름.static변수이름
System.out.println(School.name);

방법3. 객체생성 후 static변수 접근하지만 static변수가 아닌 인스턴스 변수일때도 접근가능
School school = new School();
System.out.println(school.name);

 

기본적으로 new 연산자를 이용해 객체를 생성(인스턴스 생성)하면 메모리에 할당을 하고 사용하는데

이때 멤버와 메소드에 static 을 써줘서 같은 시점에 메모리에 올라가기 때문에

객체를 생성하지 않아도 model 패키지의 클래스 변수(static)에 접근가능하다. 

하지만 static변수는 메모리에 올라가면 계속 상주해 있기때문에 되도록이면 안 쓰는게 좋다

 

 

만약 멤버변수에 static을 안써줬다면? 메모리에 로드되는 시점이 안맞아서 에러가 뜬다

The static field School.region should be accessed in a static way 

public class School{
	protected String region = "울산";
}

 

 

 

 

 

잠시 용어 정리!!

  • 참조변수 

참조변

 

여기서 mc 가 참조변수(변수) 이며 생성된 객체의 참조를 가진다.

생성 된 MyClass 객체를 mc가 참조를 하고  > mc.

MyClass 클래스 내에 있는 메소드에 인자값을 넣어 전달 > mc.setAge(27)

메소드를 호출하여 멤버 변수에 데이터를 저장. > int age;

 

 

객체 내에 존재하는 멤버 변수에 접근 > mc.age = 10;
객체 내에 존재하는 멤버 메소드에 접근 > mc.setAge(27);

 

 

 

 

 

 

 

지역변수, 전역변수 , static 

 

 

 

지역변수

함수내에 선언이 됐으면 그 안에서만 사용가능하고 밖에서 사용불가

public static void main(String[] args) {

    String b = "지역변수"; // 지역변수에 접근제한자 사용x
    System.out.println(b);

    run();
}

public static void run() {
    System.out.println(b);  //에러. 지역변수는 main함수 안에서만 사용가능
}

 

 

전역변수

전역변수에는 인스턴스 변수와 클래스 변수(static)이 있다.

 

1. 인스턴스 변수

다른 파일에서도 접근가능

클래스 영역에 static 없이 변수를 생성 후 객체를 생성해야 호출가능

public class Variable {

	//static을 사용하지 않고 호출하는법 객체를 생성하여 호출 (static을 많이 쓰면 프로그램 실행시 느려짐)
	public String a = "전역변수"; 
	
	public static void main(String[] args) {
		Variable v = new Variable(); //객체 생성 후
		System.out.println(v.a); // 인스턴스 변수 호출가능

		//에러. static 함수라서 클래식 변수(static)이여야함
        System.out.println(a);  
	}
    
    public void run() { // 전역변수. 클래식 전체에 사용가능
    	System.out.println(a);  
    }
 }

 

2. 클래스 변수 (static) = 정적변수

다른 파일에서 접근불가 해당 파일에서만 static 쓴 것끼리 접근가능

객체를 생성하지 않아도 사용가능하다 대신 static 은 메모리에 계속 상주해 있어서 프로그램이 종료할때까지 계속 있다

static을 많이 쓰면 느려지거나 시스템의 퍼포먼스에 악영향을 끼칠 수 있다..

package com.example.demo;

public class Variable {

	//클래스 변수(static)
	public static String a = "전역변수"; 
	
	public static void main(String[] args) {
    	//객체 생성할 필요없이 클래식 변수는 접근가능
		System.out.println(a); 			//static 전역 변수 접근방법
		System.out.println(Variable.a); //static 전역 변수 접근방법
        
		run();
	}
	
	public static void run() {
		System.out.println(a); 	 // static 변수(전역변수)는 클래스 전체에 사용가능
	}
}

 

 

 

정적변수(static)는 data영역에 저장되어 메모리상에 계속 할당되어 프로그램이 종료될까지 있다

모든 객체가 공유하는 메모리의 장점이 있으나 

위에서 말했듯 static을 남발하게 되면 시스템상으로 악영향을 주기에 많이 쓰면 안된다

(Garbage Collector 가 관리 안해줌)

 

전역변수는 new 연산을 통해 객체를 생성하여 사용하는데 이떄 생성된 객체는 Heap 영역에 저장되어 Garbage Collector 가 알아서 데이터를 관리해준다는 장점이 있다.

반응형
LIST

'공부' 카테고리의 다른 글

추상 메소드와 인터페이스 | 다중상속  (0) 2023.06.27
다형성  (0) 2023.06.22
생성자  (0) 2023.06.20
메소드화 | 객체화 | 인스턴스  (0) 2023.06.16
메소드  (1) 2023.06.16

+ Recent posts