Java - Static

RoyBae·2022년 8월 11일
0

프로그래머스 코테 연습 문제를 풀고 있었는데, 다른 사람들 풀이를 보고 다른 케이스의 풀이가 있었다.
내부 Static 클래스를 만들어서 각 기능을 하는 매서드들을 구현하는 것을 보았다.

내가 풀었던 풀이와 비교하며 내 코드에 다시 적용을 하려던 찰라에 갑자기 Static 원리와 개념에 대해 헷갈리고 궁금한게 생기게 되었다.

이말은 즉, 그동안 제대로 알지 못하고 사용했다는 뜻이 되버리는데 내심 무척 창피하였다.

다시 개념을 다지고자 잘 정리되어 있는 내용을 퍼와보았다.

출처: https://vaert.tistory.com/101 [Vaert Street:티스토리]


자바를 한번쯤 공부해본사람이라면 static키워드를 모르지는 않을 것입니다. 
하지만, 바르게 알고 있는 사람들은 그리 많지 않습니다.  

자바경력자를 면접볼 때 static키워드에 대해서 질문하곤 합니다. 

면접관 : static키워드에 대해서 설명해보세요.
응시자 : static키워드를 쓰면, 객체를 생성하지 않고도 변수나 함수를 사용할 수 있습니다. 

면접관 : 왜 static키워드를 쓰나요?
응시자 : 객체를 생성하지 않아도 되니까 편리하고 속도도 빠릅니다. 

면접관 : 그렇다면 모든 변수와 함수에 static을 붙이는 것이 좋겠네요?
응시자 : 가능한한 static을 붙이는 것이 좋다고 생각합니다. 

면접관 : 어떤 경우에 static을 붙일 수 있고, 어떤 경우에 static을 붙일 수 없습니까?
응시자 : ...  

면접관 : 만일 당신이 새로운 클래스를 작성한다고 할 때, 어떤 경우에 static키워드를 사용해야한다고 생각합니까?
응시자 : ...  

대부분의 경우 위와 같은 내용으로 문답이 진행됩니다.  
사실 응시자의 대답은 다 맞는 얘기입니다.
하지만, static의 핵심적인 개념을 모르기 때문에 어떤 경우에 왜 static을 사용해야하는지는 잘모르는 것 같습니다.   

먼저 결론부터 간단히 정리하면 다음과 같습니다.   

1.클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.

  • 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적기 때문에 서로 다른 값을 유지한다. 경우에
    따라서는 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙인다.   
  1. static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있다. 
  • static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기
    때문이다.   
  1. static이 붙은 메서드(함수)에서는 인스턴스 변수를 사용할 수 없다. 
  • static이 메서드는 인스턴스 생성 없이 호출가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만
    존재하기 때문에... static이 붙은 메서드(클래스메서드)를 호출할 때 인스턴스가 생성되어있을수도 그렇지 않을 수도 있어서 static이 붙은 메서드에서 인스턴스변수의 사용을 허용하지 않는다. (반대로, 인스턴스변수나 인스턴스메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.)   
  1. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다. 
  • 메서드의 작업내용중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없다. 반대로 인스턴스변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다. 메서드 호출시간이 짧아지기 때문에 효율이 높아진다. (static을 안붙인 메서드는 실행시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.)   
  1. 클래스 설계시 static의 사용지침 
  • 먼저 클래스의 멤버변수중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면,
    static을 붙여준다. 
  • 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을 붙일 것을 고려한다. 
    일반적으로 인스턴스변수와 관련된 작업을 하는 메서드는 인스턴스메서드(static이 안붙은 메서드)이고 static변수(클래스변수)와 관련된 작업을 하는 메서드는 클래스메서드static이 붙은 메서드)라고 보면 된다.  

static은 객체지향개념을 이해하는 가장 중요한 첫걸음이니 확실히 알아두셔야합니다.


profile
반도체 IT System Developer

0개의 댓글

Powered by GraphCDN, the GraphQL CDN