클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
접근 제어자: public, protected , (default) , private
그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp
public class Test{
public static final int WIDTH = 200;
public static void main(String[] args){
System.out.println(WIDTH);
}
}
class StaticTest{
static int width = 100;
static int height = 120;
static {
// static 변수의 복잡한 초기화 수행
}
static int max(int a, int b){
return a>b ? a : b;
}
}
final class FinalTest{ // 조상이 될 수 없는 클래스
final int MAX_WIDTH = 100; // 값을 변경할 수 없는 멤버변수
final void getMaxSize(){ // 오버라이딩이 불가능한 메서드
final int PIE = 3.14; // 값을 변경할 수 없는 지역변수
}
}
클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
추상 클래스의 인스턴스 생성 불가! -> 추상 클래스를 상속 받아서 완전한 클래스를 만든 후에 객체를 생성할 수 있다!
추상 클래스 : 추상 메서드를 하나라도 가지고 있는 클래스
cf) 인터페이스 : 추상 메서드만 존재하는 클래스
추상 클래스와 인터 페이스는 상속 받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메서드를 구현하도록 강제한다!
의문점? 결국 추상 메서드를 구현하는 건데 굳이 인터페이스가 있어야 하나?
-> 링크로 이동!
abstract class AbstractTest{ // 추상 클래스(추상 메서드를 포함한 클래스)
abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}
AbstractTest a = new AbstractTest(); // 에러. 추상 클래스의 인스턴스 생성불가
: 같은 클래스 내에서만 접근이 가능하다
: 같은 패키지 내에서만 접근이 가능하다.
: 같은 패키지 내에서. 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.
: 접근 제힌이 없다.
<범위에 따라>
<대상에 따라>
참고) public class 이름이랑 소스 파일 이름은 같아야함. 그리고 public class는 한 소스 코드에 한 개만 존재해야함. 가독성 때문.
패키지 : pkg1
// MyParent.java
package pkg1
public class MyParent{
private int prv;
int dft;
protected int prt;
public int pub;
public void printMembers(){
System.out.println(prv); // ok , 같은 클래스
System.out.println(dft); // ok , 같은 패키지
System.out.println(prt); // ok , 같은 패키지 + 자손
System.out.println(pub); // ok , 접근제한 없음.
}
}
class MyParentTest{
public static void main(String[] args){
MyParent p = new MyParent();
System.out.println(p.prv); // 에러 같은 클래스 내에서만 사용가능
System.out.println(p.dft); // ok
System.out.println(p.prt); // ok
System.out.println(p.pub); // ok
}
}
패키지 : pkg2
// MyParentTest2.java
package pkg2
class MyChild extends pkg1.MyParent{
public void printMembers(){
System.out.println(prv); // 에러 , 같은 클래스에서만
System.out.println(dft); // 에러 , 같은 패키지에서만
System.out.println(prt); // ok , 같은 패키지 + 자손(다른 패키지)
System.out.println(pub); // ok , 접근제한 없음.
}
}
public class MyParentTest2{
public static void main(String[] args){
MyParent p = new MyParent();
System.out.println(p.prv); // 에러
System.out.println(p.dft); // 에러
System.out.println(p.prt); // 에러, 다른 패키지에다가 자손도 아니기 때문.
System.out.println(p.pub); // ok
}
}
자바의 정석 - 남궁성의 정석코딩(유튜브)
https://brunch.co.kr/@kd4/6
https://all-record.tistory.com/53 - 이미지 출처