mojo's Blog

클래스, 멤버 접근 지정 및 static과 non-static, final 메소드 본문

Java

클래스, 멤버 접근 지정 및 static과 non-static, final 메소드

_mojo_ 2021. 7. 17. 23:31

클래스 접근 지정

 

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
Comments