1.  final 필드와 상수

✏️  값을 변경하는 것을 막고 읽기만 허용할 때 사용

 

1)  final 필드 선언

final 타입 필드 [ =초기값];

 

  ⚒️  final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어 실행 도중 값을 수정 X

  ⚒️  final 필드에 초기값을 줄 수 있는 방법은 2가지

  • 필드 선언 시에 초기값 대입
  • 생성자에서 초기값 대입

  ⚒️ 고정된 값이라면 필드 선언 시에 주는 것이 간단하지만 복잡한 초기화 코드가 필요하거나 객체 생성 시에 외부에서 전달된 값으로 초기화한다면 생성자에서 해야 한다.

        ⚡️  초기값을 주지 않고 final 필드를 그대로 남겨두면 컴파일 에러가 생김

public class Korean {
	//인스턴스 final 필드 선언
	final String nation = "대한민국";
	final String ssn;
	
	//인스턴스 필드 선언
	String name;

	//생성자 선언
	public Korean(String ssn, String name) {
		this.ssn = ssn;
		this.name = name;
	}
}
public class KoreanExample {
	public static void main(String[] args) {
		//객체 생성 시 주민등록번호와 이름 전달
		Korean k1 = new Korean("123456-1234567", "감자바");
		
		//필드값 읽기
		System.out.println(k1.nation);
		System.out.println(k1.ssn);
		System.out.println(k1.name);

		//Final 필드는 값을 변경할 수 없음
		//k1.nation = "USA";
		//k1.ssn = "123-12-1234";

		//비 final 필드는 값 변경 가능
		k1.name = "김자바";
	}
}

 


2)  상수 선언

static final 타입 상수 [ =초기값];

 

  ⚒️  불변의 값을 저장하는 필드를 자바에서는 상수 constant 라고 부름

         ex. 원주율 파이나 지구의 무게 및 둘레 등

  ⚒️  상수는 객체마다 저장할 필요가 없고, 여러 개의 값을 가져도 안되기 때문에 static이면서 final인 특성을 가져야 함.

  ⚒️  상수 이름은 모두 대문자로 작성하는 것이 관례. 서로 다른 단어가 혼합된 이름이라면 언더바(_)로 단어들을 연결함

static final double PI = 3.14159;
static final double EARTH_SURFACE_AREA = 5.147185403641517E8;

 

  ⚒️  상수는 정적 필드 이므로 클래스로 접근

클래스명.상수

 

public class Earth {
	//상수 선언 및 초기화
	static final double EARTH_RADIUS = 6400;

	//상수 선언
	static final double EARTH_SURFACE_AREA;
	
	//정적 블록에서 상수 초기화
	static {
		EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
	}
}
public class EarthExample {
	public static void main(String[] args) {
		//상수 읽기
		System.out.println("지구의 반지름: " + Earth.EARTH_RADIUS + "km");
		System.out.println("지구의 표면적: " + Earth.EARTH_SURFACE_AREA + "km^2");
	}
}

 

 


2.  접근 제한자  Access Modifier

 

🚀  중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성(결점이 없는 성질)을 유지

🚀  default는 접근 제한자가 아니라 접근 제한자가 붙지 않은 상태!

접근 제한자 제한 대상 제한 범위
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 같은 패키지이거나, 자식 객체에만 사용 가능
(default) 클래스, 필드, 생성자, 메소드 같은 패키지
private 필드, 생성자, 메소드 객체 내부

 

 

1)  클래스의 접근 제한

  ⚒️  클래스는 public과 default 접근 제한을 가질 수 있다.

[ public ] class 클래스 { ... }
  • 클래스 선언할 때 public 접근 제한자를 생략했다면 클래스는 default 접근 제한을 가진다.
  • 이 경우 클래스는 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없게 된다.
  • public을 붙였다면 다른 패키지에서도 사용 가능

 

 


2)  생성자의 접근 제한

  ⚒️  생성자는 public, default, private 접근 제한을 가질 수 있다.

public class ClassName {
    // 생성자 선언
    [ public | private ] ClassName(...) {...}
}

 

접근 제한자 생성자 설명
public 클래스(...) 모든 패키지에서 생성자를 호출할 수 있다.
= 모든 패키지에서 객체를 생성할 수 있다.
default 클래스(...) 같은 패키지에서만 생성자를 호출할 수 있다.
= 같은 패키지에서만 객체를 생성할 수 있다.
private 클래스(...) 클래스 내부에서만 생성자를 호출할 수 있다.
= 클래스 내부에서만 객체를 생성할 수 있다.

 

package ch06.sec13.exam02.package1;

public class A {
	//필드 선언
	A a1 = new A(true);
	A a2 = new A(1);
	A a3 = new A("문자열");

	//public 접근 제한 생성자 선언
	public A(boolean b) {
	}
	
	//default 접근 제한 생성자 선언
	A(int b) {
	}

	//private 접근 제한 생성자 선언
	private A(String s) {
	}
}
package ch06.sec13.exam02.package1;

public class B {
	// 필드 선언
	A a1 = new A(true); 	//o
	A a2 = new A(1); 	    //o
	//A a3 = new A("문자열");	//x
}

 


3)  필드와 메소드의 접근 제한

  ⚒️  필드와 메소드는 public, default, private 접근 제한을 가질 수 있다.

// 필드 선언
[ public | private ] 타입 필드;

// 메소드 선언
[ public | private ] 리턴타입 메소드(...) { ... }

 

접근 제한자 생성자 설명
public 필드
메소드(...)
모든 패키지에서 필드를 읽고 변경할 수 있다.
모든 패키지에서 메소드를 호출할 수 있다.
default 필드
메소드(...)
같은 패키지에서만 필드를 읽고 변경할 수 있다.
같은 패키지에서만 메소드를 호출할 수 있다.
private 필드
메소드(...)
클래스 내부에서만 필드를 읽고 변경할 수 있다.
클래스 내부에서만 메소드를 호출할 수 있다.

 

public class A {
	//public 접근 제한을 갖는 필드 선언
	public int field1;
	//default 접근 제한을 갖는 필드 선언
	int field2;
	//private 접근 제한을 갖는 필드 선언
	private int field3;

	//생성자 선언
	public A() {
		field1 = 1; 		//o
		field2 = 1; 		//o
		field3 = 1; 		//o

		method1(); 			//o
		method2(); 			//o
		method3(); 			//o
	}

	//public 접근 제한을 갖는 메소드 선언
	public void method1() {
	}
	
	//default 접근 제한을 갖는 메소드 선언
	void method2() {
	}
	
	//private 접근 제한을 갖는 메소드 선언
	private void method3() {
	}
}

 

같은 패키지
package ch06.sec13.exam03.package1;

public class B {
	public void method() {
		//객체 생성
		A a = new A();

		//필드값 변경
		a.field1 = 1; 		// o
		a.field2 = 1; 		// o
		//a.field3 = 1;		// x

		//메소드 호출
		a.method1(); 		// o
		a.method2(); 		// o
		//a.method3(); 		// x
	}
}

 

다른 패키지
package ch06.sec13.exam03.package2;

import ch06.sec13.exam03.package1.*;

public class C {
	public C() {
		//객체 생성 
		A a = new A();
		
		//필드값 변경 
		a.field1 = 1; 		// (o)
		//a.field2 = 1; 	// (x)
		//a.field3 = 1; 	// (x)

		//메소드 호출 
		a.method1(); 		// (o)
		//a.method2(); 		// (x)
		//a.method3(); 		// (x)
	}
}

 

 

 

 

* 내용 참고 - 책 '이것이 자바다'

+ Recent posts