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)
}
}
* 내용 참고 - 책 '이것이 자바다'
'Programming Language > JAVA' 카테고리의 다른 글
[Java] 상속 Inheritance (0) | 2024.08.11 |
---|---|
[Java] Getter와 Setter · 싱글톤 패턴 (0) | 2024.08.11 |
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2024.08.10 |
[Java] 생성자 Constructor (0) | 2024.08.10 |
[Java] 객체 지향 프로그래밍 (OOP) · 객체와 클래스 · 필드 (0) | 2024.08.10 |