본문 바로가기
Java

[Java] 인스턴스 멤버와 정적 멤버

by lmyourpearl 2025. 11. 10.

인스턴스(Instance)멤버

객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데, 이들을 각각 인스턴스 필드, 인스턴스 메소드라고 부름. 인스턴스 필드와 메소드는 객체에 소속된 멤버이기 때문에 객체 없이는 사용할 수 없음.

 

this

this는 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용됨.

 

// 인스턴스 멤버와 this

package sec05.exam01;

public class Car {
	// 필드
    String model;
    int speed;
    
    // 생성자
    Car(String model) {
    	this.model = model;
    }
    
    // 메소드
    void setSpeed(int speed) {
    	this.speed = speed;
    }
    
    void run() {
    	for(int i=10; i<=50; i+=10) {
        	this.setSpeed(i);
            System.out.println(this.model+ "가 달립니다.(시속:"+ this.speed +"km/h)");
        }
    }
}
// 인스턴스 멤버와 this

package sec05.exam01;

public class CarExample {
	public static void main(String[] args) {
    	Car myCar = new Car("포르쉐");
        Car yourCar = new Car("벤츠");
        
        myCar.run();
        yourCar.run();
    }
}

 


정적 멤버(static)

정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말함.

정적 필드와 메소드를 선언하려면 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 됨.

정적 필드와 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리되고 클래스의 로딩이 끝나면 바로 사용할 수 있음.

 

필드를 선언할 때 인스턴스 필드로 선언할 것인지 정적 필드로 선언할 것인지를 판단하는 기준은 객체마다 가지고 있어야 할 데이터라면

인스턴스 필드로 선언하고, 객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드로 선언하는 것이 좋음.

 

// 정적 멤버 사용

package sec05.exam02;

public class Calculator {
	static double pi = 3.14159;
    
    static int plus(int x, int y) {
    	return x + y;
    }
    
    static int minus(int x, int y) {
    	return x - y;
    }
}
// 정적 멤버 사용

package sec05.exam02;

public class CalculatorExample {
	public static void main(String[] args) {
    	double result1 = 10 * 10 * Calculator.pi;
        int result2 = Calculator.plus(10,5);
        int result3 = Calculator.minus(10,5);
        
        System.out.println("result1: " + result1);
        System.out.println("result2: " + result2);
        System.out.println("result3: " + result3);
    }
}

* 객체가 없어도 실행된다는 측징 때문에 정적 메소드를 선언할 때는 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없으며, 객체 자신의 참조인 this 키워드도 사용이 불가능함. 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 함.

// 정적 메소드 선언 시 주의할 점

package sec05.exam03;

public class Car {
	int speed;
    
    void run() {
    	System.out.println(speed + "으로 달립니다.");
    }
    
    public static void main(String[] args) {
    	Car myCar = new Car();
        myCar.speed = 60;
        myCar.run()
    }
}

// 실행 결과
// 60으로 달립니다.

싱글톤(Singleton)

프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우.

생성자를 호출한 만큼 객체가 생성되기 때문에 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 하는데, 생성자를 외부에서 호출할 수 없도록 하려면 생성자 앞에 private 접근 제한자를 붙여주면 됨.

// 싱글톤

package sec05.exam04;

public class Singletone {
	private static Singleton singleton = new Singleton();
    
    private Singleton() {}
    
    static Singleton getInstance() {
    	return singleton;
    }
}
// 싱글톤 객체

package sec05.exam04;

public class SingletonExample {
	public static void main(String[] args) {
    
    Singleton obj1 = Singleton.getInstance();
    Singleton obj2 = Singleton.getInstance();
    
    if(obj1 == obj2) {
     System.out.println("같은 Singleton 객체입니다.");
    } else {
   	 System.out.println("다른 Singleton 객체입니다.");
    }
  }
}

// 실행 결과
// 같은 Singleton 객체입니다.

final 필드

초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 것.

필드 선언 시에 final 필드의 초기값을 주거나 생성자에서 줄 수 있음.

// final 필드 선언과 초기화

package sec05.exam05;

public class Person {
	final String nation = "Korea";
    final String ssn;
    String name;
    
    public Person(String ssn, String name) {
    	this.ssn = ssn;
        this.name = name;
    }
}
// final 필드 테스트

package sec05.exam05;

public class PersonExample {
	public static void main(String[] args) {
    	Person p1 = new Person("123456-1234567", "홍길동");
        
        System.out.println(p1.nation);
        System.out.println(p1.ssn);
        System.out.println(p1.name);
        
        p1.name = "홍삼원";
     }
 }
 
 // 실행 결과
 // Korea
 // 123456-1234567
 // 홍길동

상수(constant)

일반적으로 불변의 값을 상수(static final)라고 부르는데, 불변의 값은 수학에서 사용되는 원주율 파이나 지구의 무게 및 둘레 등이 해당됨.

이런 불변의 값을 저장하는 필드를 자바에서는 상수라고 함.

상수는 static이면서 final이어야함. static final 필드는 객체마다 존재하지 않고 클래스에만 존재하고 한 번 초기값이 저장되면 변경할 수 없다. 상수 이름은 모두 대문자로 작성하고 혼합된 이름이라면 언더바(_)를 사용하는 것이 관례이다.

// 상수 선언

package sec05.exam06;

public class Earth {
	static final double EARTH_RADIUS = 6400;
    static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
  }
}
// 상수 사용

package sec05.exam06;

public class EarthExample {
	public static void main(String[] args) {
    	System.out.println("지구의 반지름:" + Earth.EARTH_RADIUS +"km");
        System.out.println("지구의 표면적:" + Earth.EARTH_AREA +" km^2");
    }
}

// 실행 결과
// 지구의 반지름: 6400.0km
// 지구의 표면적: 5.147185403641517E8 km^2

🔘 인스턴스 멤버: 인스턴스 멤버란 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데, 이들을 각각 인스턴스 필드, 인스턴스 메소드 라고 함.

 

🔘 this: 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있는데, 예를 들어 this.model은 자신이 가지고 있는 model 필드 라는 뜻. this는 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용됨.

 

🔘 정적 멤버 : 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말하며, 이들을 각각 정적 필드, 정적 메소드 라고 함.

 

🔘 static: 정적 멤버를 선언할 때 사용하는 키워드

 

🔘 싱글톤: 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있는데,  단 하나만 생성 된다고 해서 이 객체를 싱글톤 이라고 함.

 

🔘 final 필드: 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 필드를 말함. final 키워드로 선언.

 

🔘 성수: 수학에서 사용되는 원주율 파이나 지구의 무게 및 둘레 같은 불변의 값을 저장하는 필드를 자바에서는 상수라고 하며 final static 키워드로 선언함.

'Java' 카테고리의 다른 글

[Java] 상속  (0) 2025.11.10
[Java] 패키지와 접근 제한자  (0) 2025.11.10
[Java] 메소드  (0) 2025.11.09
[Java] 생성자  (0) 2025.11.09
[Java] 필드  (0) 2025.11.06