인스턴스(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 |