본문 바로가기
Web

[Java] static 활용

by DuncanKim 2022. 7. 10.
728x90

[Java] static 활용

 

intelliJ를 사용하다보면, psvm이라는 단축어를 쓸 때가 있다. 메인 메소드를 만들 때 쓰는 것이다.

메인 메소드는 다음과 같은 코드를 써야 만들 수 있다.

public static void main(String[] args){

}

public은 그렇다 치고, main은 메소드 이름이고, void는 메소드 타입이고, 그럼 static은 무엇인가?

 

static은 ‘고정된’이라는 의미를 가지고 있다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 의미한다. 각각 정적 필드, 정적 메소드라고 부른다. 정적 멤버는 객체에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.

 

쉽게 이야기하면, 하나의 클래스를 가지고 여러 개의 인스턴스를 생성했다고 하자.

 

String 반 이름의 경우, 각각을 수정할 수 있다. 각각의 인스턴스는 개별화되어 있기 때문이다.

그러나 static의 경우, 변수를 ‘공유’한다. String 교훈은 정적 필드에 해당한다. 하나의 변수를 고치는 순간 원본 클래스부터 다른 인스턴스들의 ‘교훈’ 부분이 바뀌게 되는 것이다.

어느 하나라도 바뀌면, 그 전체가 연대 책임으로 똑같이 바뀌게 되는 '정적'인 변수라고 할 수 있겠다.

 

CS적인 측면에서 보면, static은 메모리 구조상 데이터 영역에 바로 배치가 되는데, 이 경우 static으로 선언된 것들은 인스턴스 생성 없이 모두 “클래스.변수 or 클래스.메소드()”와 같은 형식으로 실행을 할 수 있다.

 

System.out.println(학교.교훈);

//출력 : 제일 잘나가

 

 

1) 기본 사용 방법

달리다() 메소드를 쓰기 위해서는 두 가지의 방식을 선택할 수 있다.

class Main {
    public static void main(String[] args) {
        자동차.달리다();
    }
}

class 자동차 {
    public void 달리다() {
        System.out.println("자동차가 달립니다.");
    }
}

 

(1) 객체를 생성하는 방법

class Main {
    public static void main(String[] args) {
        new 자동차().달리다();

        자동차 a자동차 = new 자동차();
        a자동차.달리다();
    }
}

class 자동차 {
    void 달리다() {
        System.out.println("자동차가 달립니다.");
    }
}

 

(2) static을 사용하는 방법

class Main {
    public static void main(String[] args) {
        자동차.달리다();
    }
}

class 자동차 {
    static void 달리다() {
        System.out.println("자동차가 달립니다.");
    }
}

static은 변수 타입 또는 메소드 타입 앞에 붙여준다. 만약 접근 제한자(protected, private, public)가 있다면 접근 제한자 바로 뒤에 입력해주면 된다.

 

 

2) static의 올바른 사용법

//code.oa.gg/java8/948
// 문제 : 아래 코드의 잘 못된 점을 고쳐보세요.

class Main {
    public static void main(String[] args) {
        사람 a사람1 = new 사람();
        a사람1.이름 = "홍길동";
        a사람1.나이 = 22;

        a사람1.자기소개();
        // 출력 : 저는 22살 홍길동 입니다.

        사람 a사람2 = new 사람();
        a사람2.이름 = "홍길순";
        a사람2.나이 = 25;

        a사람2.자기소개();
        // 출력 : 저는 25살 홍길순 입니다.

        a사람1.자기소개();
        // 출력 : 저는 22살 홍길동 입니다.
    }
}

class 사람 {
    static int 나이;
    static String 이름;

    static void 자기소개() {
        System.out.println("저는 " + 나이 + "살 " + 이름 + " 입니다.");
    }
}

// 출력
/*
출력 : 저는 22살 홍길동 입니다.
출력 : 저는 25살 홍길순 입니다.
출력 : 저는 25살 홍길순 입니다.
*/

 

맨 아래 출력이 22살 홍길동이 출력되도록 만들어야 하는데, 25살 홍길순이 나온다.

이렇게 출력되는 이유는 static을 통해 변수를 공유하고 있기 때문이다.

즉, a사람2.자기소개()를 호출할 경우, 사람 클래스의 모든 변수는 홍길순, 25로 바뀌게 되고, 그 다음에 a사람1의 자기소개를 호출했을 때, 그 전에 바뀐 변수가 그대로 출력되는 것이다.

이런 경우 static을 사용하면 안 된다. static을 모두 삭제하면 제대로 결과가 출력되는 것을 알 수 있다.

 

class Main {
    public static void main(String[] args) {
        사람 a사람1 = new 사람();
        a사람1.이름 = "홍길동";
        a사람1.나이 = 22;

        a사람1.자기소개();
        // 출력 : 저는 22살 홍길동 입니다.

        사람 a사람2 = new 사람();
        a사람2.이름 = "홍길순";
        a사람2.나이 = 25;

        a사람2.자기소개();
        // 출력 : 저는 25살 홍길순 입니다.

        a사람1.자기소개();
        // 출력 : 저는 22살 홍길동 입니다.
    }
}

class 사람 {
    int 나이;
    String 이름;

    void 자기소개() {
        System.out.println("저는 " + 나이 + "살 " + 이름 + " 입니다.");
    }
}

/*
출력 : 저는 22살 홍길동 입니다.
출력 : 저는 25살 홍길순 입니다.
출력 : 저는 22살 홍길동 입니다.
*/
728x90

댓글