회사 에서 static 클래스로 구현하란다/// 그래서 인터넷에서 자료를 뒤져 이렇게 정리해 본다
내부 클래스란 무엇일까여? 클래스안에 또 클래스가 들어가 있는것을 말한다 . 왜이런 내부 클래스를 만드는 목적과 필요성에 대해 알아보자
내부클래스라는 것은 클래스 안에 또 클래스가 있는것을 말합니다
일단 내부 클래스에 어떤 놈들이 잇고 어떻게 사용되는지를 알아야 할것입니다 첫 번째로 정적 내부 클래스(Static Class)에 대해 알아보도록 하겟습니다
정적 내부 클래스라는것은 내부 클래스가 static 으로 정의 되어 있다는것입니다
내부 클래스는 외부 클래스의 멤버로보면 됩니다 / 이번놈은 static 이니까 static멤버!!!!!!!!! static 멤버만을 사용할수 잇습니다
static 멤버쓰는거 기억 하시나요?? 해당 클래스의 객체를 따로 생성하지 않아도 쓸수 잇습니다 내부 클래스도 마찬가지입니다
public class Example
{
static class InnerClass{
}
}
Example 클래스에 InnerClass 라는 static 멤버가 있습니다 이것을 다른 클래스 그러니까 Example 클래스의 외부에서 Example 클래스의
객체 없이도 다음과 같이 InnerClass클래스를 만들수 있습니다
public class Test
{
public static void main(String[] args{
Example.InnerClass test = new Example.InnerClass();
}
}
또 한가지 정적 클래스도 static 이기 때문에 static 변수와 메소드만 참조할수 잇습니다
public class Example {
static private int K =1;
private int T = 10;
static void display(){};
static class InnerClass{
public void printK(){
System.out.printIn(K);
System.out.printIn(T); // compile error
display();
}
}
}
테스트 소스 입니다
public class Example
{
static private int K=1;
static void display()
{
System.OUT.printIn("TEST 시작");
}
static class InnerClass
{
private int a =36;
public void printIn(K+a)
{
System.OUT.printIn(K+a);
display();
}
}
}
class Test
{
public static void main(String[] args)
{
Example.InnerClass test = new Example.InnerClass();
test.printIn();
}
}
==============================================================================
다음은 static method 에 대해 kldp 에 질의 응답한 내용을 발췌 하엿다
private static은 아마 메모리를 절약하거나 서로 다른 인스턴스에서 공통 접근 가능이 필요할때 쓰는게 아닐까 싶습니다
클래스 인스턴스는 각각 다른 메모리를 가지고 있는 상황에서 static한 필드나 메서드는 공용으로 쉽게 말하면 공유메모리와 같은 역할을 하게 되니까요.
물론 그에 따른 위험성도 존재 하겠지만 그렇게 쓰는 이유가 있겠죠. 설계의 관점에서.
속도의 측면에선 테스트를 안해봐서 잘 모르지만 큰 차이는 없을것 같네요. 오히려 final로 정의된게 속도에선 낫다는 이야기가 있으니까요.
만일 다른 객체지향 언어를 말씀하시는 거라면 거기에도 적용이 되는건지는 잘 모르겠네요. ㅡㅡㅋ
class 내의 static 함수는 그것이 private, public, protected 상관없이 숨어서 넘어가는 this pointer를 전달하지 말도록하는 것입니다.
그렇기 때문에 static member function 은 static 아닌 멤버 변수나 함수를 호출 할 수가 없습니다. 대신, 일반적인 c 의 callback 함수로 넘길때 유용하게 사용됩니다
C++을 기준으로 설명을 해 드리자면, (Java도 동일합니다)
클래스의 static member function은 개념적으로는 클래스의 static data member에만 접근 가능한 멤버함수임을 나타냅니다.
즉, 객체별로 설정되는 non-static data member에는 접근이 불가능합니다. non-static data member에 접근할 수 있으면 안되므로 당연히 this포인터(자바의 경우는 this 리퍼런스)를 static member function에서는 사용할 수 업습니다. 즉, 멤버함수의 인자로 this포인터가 넘어오질 않습니다.
따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다. 클래스 스코프에 들어가야 하는 순수함수(pure function) 즉, 내부상태를 가지지 않는, 입력값에 의해서만 출력이 결정되는 함수라면 static 멤버함수로 설계하는 것이 좋죠.
또한 static member function은 오버라이딩 불가합니다. this포인터가 넘어오질 않으므로 객체에 따라 다르게 설정되는 가상함수 테이블 역시 사용불가능하며, 결국 static member function은 컴파일타임에 정적으로 바인딩되게 됩니다. (결국 static member function은 virtual 함수가 될 수 없는 결과를 가져오지요)
따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다. 클래스 스코프에 들어가야 하는 순수함수(pure function) 즉, 내부상태를 가지지 않는, 입력값에 의해서만 출력이 결정되는 함수라면 static 멤버함수로 설계하는 것이 좋죠.
C++을 기준으로 설명을 해 드리자면, (Java도 동일합니다)따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다.
꼭 정적멤버함수만이 아니고 객체지향적으로 잘 설계된 클래스라면 C 언어에서처럼 함수의 인수로 데이타를 전달받는 것이 아니고 클래스의 멤버에 직접 접근하여 데이타를 가져올 수 있으므로 성능향상이 있게됩니다
또한 static member function은 오버라이딩 불가합니다. this포인터가 넘어오질 않으므로 객체에 따라 다르게 설정되는 가상함수 테이블 역시 사용불가능하며, 결국 static member function은 컴파일타임에 정적으로 바인딩되게 됩니다. (결국 static member function은 virtual 함수가 될 수 없는 결과를 가져오지요)
정적 멤버 함수에 가상함수 적용은 안되지만 오버라이딩 및 오버로딩 모두 자유롭게 할 수 있습니다. (C++ 기준)
[출처] Static Class 에 대한 정의 |작성자 이대리