mojo's Blog
클래스, 멤버 접근 지정 및 static과 non-static, final 메소드 본문
클래스 접근 지정
public Class : 클래스 이름 앞에 public 으로 선언된 클래스로서, 패키지에 상관없이 다른 어떤 클래스에게도 사용이 허용된다.
default Class(접근 지정자 생략) : 접근 지정자 없이 클래스를 선언한 경우, 디폴트 접근 지정으로 선언되었다고 한다. 디폴트 클래스는 같은 패키지 내의 클래스들에게만 사용이 허용된다.
멤버 접근 지정
public 멤버 : public 멤버는 패키지를 막론하고 모든 클래스들이 접근 가능하다.
private 멤버 : private 접근 지정자는 비공개를 지시하는 것으로, private 멤버는 클래스 내의 멤버들에게만 접근이 허용된다.
protected 멤버 : protected 접근 지정자는 보호된 공개를 지시하는 것으로, 2가지 유형의 클래스에만 접근을 허용한다. 첫째, 같은 패키지의 모든 클래스에 접근이 허용된다.
둘째, 다른 패키지에 있더라고 자식 클래스의 경우 접근이 허용된다.
default 멤버 : 접근 지정자가 생략된 멤버의 경우, 디폴트 멤버라고 하며 동일한 패키지 내에 있는 클래스들만 디폴트 멤버를 자유롭게 접근할 수 있다.
non-static 멤버와 static 멤버의 차이점
static 멤버는 객체를 생성하지 않고도 사용할 수 있는 멤버이며 클래스당 하나만 생성되는 멤버로서 동일한 클래스의 모든 객체들이 공유한다.
그리고 main() 메소드가 실행되기 전에 이미 생성된다.
static 멤버는 static 멤버가 포함된 객체를 생성하기 전에도 사용할 수 있다.
non-static 멤버는 객체가 생길 때 객체마다 생기며, 다른 객체들과 공유하지 않는다. 객체가 사라지면 non-static 멤버도 함께 사라지며 더 이상 접근할 수 없다.
static 멤버는 클래스당 하나씩 생긴다고 해서 클래스 멤버라고도 부르며, non-static 멤버는 각 객체마다 하나씩 생긴다고 해서 인스턴스 멤버라고 부른다.
비교 Table
non-static 멤버 | static 멤버 | |
선언 | class Sample{ int n; void g() { ... } } |
class Sample{ static int m; static void g() { ... } } |
공간적 특성 | 멤버는 객체마다 별도 존재 인스턴스 멤버라고 부름 |
멤버는 클래스당 하나 생성 멤버는 객체 내부가 아닌 별도의 공간(클래스 코드가 적재되는 메모리)에 생성 클래스 멤버라고 부름 |
시간적 특성 | 객체 생성 시에 멤버 생성됨 객체가 생길 때 멤버도 생성 객체 생성 후 멤버 사용 가능 객체가 사라지면 멤버도 사라짐 |
클래스 로딩 시에 멤버 생성 객체가 생기기 전에 이미 생성 객체가 생기기 전에도 사용 가능 객체가 사라져도 멤버는 사라지지 않음 멤버는 프로그램이 종료될 때 사라짐 |
공유의 특성 | 공유되지 않음 멤버는 객체 내에 각각 공간 유지 |
동일한 클래스의 모든 객체들에 의해 공유됨 |
static 멤버 접근
객체.static필드 (ex : s1.m = 50; )
객체.static메소드 (ex : s2.f(); )
static 멤버의 생성 및 활용
클래스명.static멤버 (ex : StaticSample.m = 10; , StaticSample.f(); )
non-static 메소드는 클래스 이름으로 접근할 수 없다. (ex : StaticSample.h(); 는 틀린 코드)
static 메소드는 this를 사용할 수 없다.
ex) static void s1(int x) { this.n = x; } // Compile Error. Static method is impossible to use the this.
final 클래스
final이 클래스 이름 앞에 사용되면 클래스를 상속받을 수 없음을 지정한다.
ex) final class FinalClass { ... } // 이 클래스는 상속이 불가능하다.
class SubClass extends FinalClass { ... } // Compile Error. FinalClass Inheritance is impossible.
final로 메소드를 선언하면 오버라이딩할 수 없는 메소드임을 선언한다. 자식 클래스가 부모 클래스의 특정 메소드를 오버라이딩하지 못하게 하고 무조건 상속받아 사용하도록 하고자 한다면 다음과 같이 final로 지정하면 된다.
ex) public class SuperClass {
protected final int finalMethod() { ... } // finalMethod()는 자식이 오버라이딩 불가
}
class Subclass extends SuperClass { // SuperClass에 final이 붙어있지 않으므로 상속 가능하다.
protected int finalMethod() { ... } // Compile Error. finalMethod() overriding is impossible.
}
final로 필드를 선언하면 필드는 상수가 된다.
ex) final int ROWS = 10;
ROWS = 30; // Compile Error. final field values is impossible to change.
'Java' 카테고리의 다른 글
명품 JAVA Programming 제 5장 실습문제 12번 (0) | 2021.07.19 |
---|---|
명품 JAVA Programming 제 5장 Open Challenge (0) | 2021.07.19 |
this reference (0) | 2021.07.17 |
문자열의 n 번째 문자 가져오기 (0) | 2021.07.17 |
임의의 수 생성하기 (0) | 2021.07.17 |