BE전문가 프로젝트

6. 인스턴스 멤버 및 정적 멤버 본문

JAVA

6. 인스턴스 멤버 및 정적 멤버

원호보고서 2023. 11. 8. 00:50

인스턴스 멤버

인스턴스 생성 후 사용할 수 있는 필드 및 메소드들을 말한다. 클래스 생성 시 필드 메소드들을 선언해왔는데 일반적으로 선언하는 것을 자세하게 말하면 인스턴스 필드와 인스턴스 메소드라고 한다.

 

정적 멤버

정적(static) 멤버는 클래스에 고정된 멤버를 의미한다. 고정되어 있기 때문에 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다. 따라서 변경되지 않고 고정적으로 같은 값을 가지고 싶을 때는 static을 사용한다.

정적 멤버는 클래스에 고정된 멤버이므로 클래스를 로딩해서 메소드 영역에 적재할 때 클래스별로 관리하기 때문에 클래스 로딩이 끝나면 바로 사용이 가능하다.

 

정적 멤버의 사용

필드

필드를 선언할 시에 어떤 상황에서 인스턴스 필드로 선언할 것인지, 정적 필드로 선언할 것인지에 대한 기준이 필요하다.

객체 생성시 따로 매게변수로 받을 필요 없는 고정된 값을 가진 공용 데이터를 설정하고 싶다면 정적필드로 설정하고 그렇지 않은 경우 인스턴스 필드로 설정하면 된다.

public class applePhone {
    String name;                    //인스턴스 필드
    static String brand = "apple";  //정적 필드
}

 

메소드

필드와 마찬가지로 인스턴스 메소드로 선언할 것인지, 정적 메소드로 선언할 것인지를 결정해야한다. 이는 인스턴스 필드를 포함하고 있다면 인스턴스 메소드로, 포함하고 있지 않다면 정적 메소드로 선언한다.

 

public class Calculator {
    String name;                        //인스턴스 필드
    static String group = "machine";    //정적 필드
    
    void setName(String name) {         //인스턴스 메소드
        this.name = name;
    }
    
    static int add(int num1, int num2) { //정적 메소드
        return num1 + num2;
    }
    
}

 

차이점

위에 Calculator 클래스가 작성되었다고 가정 후 선언한 메소드들을 다른 곳에서 사용해보겠다.

 

인스턴스 메소드

Calculator calculator = new Calculator();
int calculatedNum = calculator.setName("안녕");

이와 같이 인스턴스를 생성 후 메소드를 사용해야한다.

 

정적 메소드

String group = Calculator.group;
int calculatedNum = Calculator.add(1, 2);

객체를 별도로 생성하지 않고 클래스 이름만으로 메소드 및 필드 사용이 가능하다는 것을 알 수 있다.

 

정적 메소드 사용 시 주의점

정적 메소드 선언 시 인스턴스 멤버(필드, 메소드)를 사용할 수 없다. 따라서 정적 메소드안에 인스턴스 멤버를 사용하고 싶다면 정적 메소드 안에 따로 객체를 생성하여 참조 변수로 접근해야한다.

static int add(int num1, int num2) {
    Calcualtor cal = new Calculator();
    ...
}

우리가 사용하는 main 메소드를 살펴 보면 앞에 static이 붙어있는 것을 확인 할 수 있는데 인스턴스 메소드 사용시 인스턴스 생성 후 사용하는 것이 바로 이 이유이다.

 

싱글톤

하나의 객체만 생성할 수 있도록 하는 것이 바로 싱글톤이다. 따라서 클래스 외부에서 new 연산자로 인스턴스가 생성되는 것을 막아야한다. new 연산자로 객체를 생성할 때마다 힙영역에 다른 데이터를 생성하기 때문이다. 따라서 하나의 객체만을 보장하는 것을 의미한다.

싱글톤으로 클래스를 만들기 위해서는 private 접근 제한자를 붙여준다.

public class BoardDao {
    
    private static BoardDao boardDao = new BoardDao();  //1
    
    private BoardDao(){                                 //2
    }
    
    static BoardDao getInstance() {                     //3
        return boardDao;
    }
}
  1. 정적 필드에 private 제어자를 붙여 외부에서 필드값을 변경할 수 없게 만든다.
  2. 자신의 객체를 private으로 생성하여 초기화해준다.
  3. 외부에서 호출할 수 있는 getInstance() 메소드를 선언한다.

getInstace로 참조 변수를 생성하게 되면 정적 메소드이기 때문에 여러개의 객체를 생성해도 하나의 객체만 리턴하기 때문에 동일한 객체라고 할 수 있다.

 

final

초기값이 저장되면 최종 값이 되어 프로그램 실행 도중 수정할 수 없는 것을 의미한다.

final 필드의 초기값을 주는 방법은 두가지가 있는데 하나는 필드 선언시 초기값을 설정하는 방법이며 다른 하나는 생성자에서 주는 방법이다. 겍체 생성시 외부 데이터로 초기화해야하는 경우 생성자로 final 필드값을 설정하는 것이 좋다.

 

상수

static final이라고 하며 원주율과 같이 절대 불변하는 값을 설정할 때 사용한다.

'JAVA' 카테고리의 다른 글

8. 클래스의 타입 변환 및 다형성  (0) 2023.11.08
7.상속  (0) 2023.11.08
5.객체 지향 프로그래밍(객체 및 Class에 대하여)  (0) 2023.11.07
4. main mathod  (0) 2023.11.06
3. 참조 타입과 참조 변수  (0) 2023.11.06
Comments