brunch

You can make anything
by writing

C.S.Lewis

정적(static) 멤버

* 이 내용은 철저히 초심자를 위해 알기 쉽게 설명하는 것을 목적으로 하고 있습니다.

* 더 정확하고 자세한 개념은 다른 고수님들의 글들을 참고하시길 바랍니다.

* 그리고 이 글에서는 코드 최소한으로 다루고 있습니다.


이전 시간에 멤버 필드에 대해서 배워 보았습니다.

멤버 필드는 객체가 생성되어 사라질 때까지 유지되는 변수라 하였죠?


잔인한 비유일 수 있지만, 사람도 죽으면 그 사람의 기억이 모두 사라지는 것과 같다고 볼 수 있습니다.


하지만 너무도 중요한 지식이라면 그 사람의 수명과 함께 끝나는 것은 너무 아깝다는 생각이 들 수 있습니다. 그래서 우리는 별도의 기록을 하게 됩니다.

유명한 사람들은 자신의 지식을 책 등의 기록으로 남기게 되죠?


다시 객체의 이야기로 들어가 보겠습니다.

객체는 클래스의 복사본이라고 했습니다.

그렇기 때문에 복사본이 사라지면 복사본 안에 있는 내용도 사라지게 됩니다.


하지만 그 내용이 원본에 저장되어 있다면?

복사본의 내용이 사라진다 하여도 원본에 남아 있기에 해당 값은 사라지지 않습니다.


이렇게 원본 영역에 저장되어 있는 클래스의 멤버들을 static 멤버라고 부릅니다.

여기서 static 은 클래스 원본이 저장되는 영역인 것은 이미 알고 있죠?


static 멤버와 객체 멤버 차이점

static 멤버는 일반 객체의 멤버와는 차이점이 있습니다.

첫 번째로 static이라는 키워드가 붙습니다.

나는 원본 영역에 저장되는 멤버야!

는걸 알려 주는 것이죠


두 번째로 static 은 원본 영역에 있기 때문에 불러올 때 객체의 이름이 아닌, 원본 클래스의 이름으로 불어와야 합니다.

Puppy 클래스의 goal 은 일반 멤버이기 때문에 복사본인 p를 통해 값을 넣지만, name 은 static 멤버 이기 때문에 원본인 Puppy를 불러서 값을 넣어야 합니다.

나중에 넣은 값을 확인할 때도 마찬가지죠.


세 번째로 static 멤버는 원본영역에 있는 멤버 이기 때문에 객체화 후 사용되는 생성자를 통해서 초기화할 수 없습니다.

생성자는 복사본 영역에, static 은 원본영역에 있기 때문에 서로가 닿을 수 없는 것이죠!


같은 클래스에 있다 해도 영역이 다르기에 서로 소통이 불가능합니다.

같은 공간에 있어도 다른 차원에 존재하기 때문에 소통할 수 없는 것과 같습니다.


인터스텔라에서 비슷한 장면이 나오죠?


그리고 마지막으로 이 static 멤버는 필드뿐 아니라 메서드도 포함됩니다.

그래서 호출할 때 원본 클래스 명을 불러서 사용하는 것은 변함없습니다.


복사본인 객체가 죽더라도 계속해서 존재할 수 있는 static 멤버에 대해서 알아보았습니다.

static 이 붙은 멤버는 일반 멤버와 사는 영역이 다르다.

이것만 확실히 기억해 두도록 합시다.

매거진의 이전글 클래스멤버 - 변수
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari