본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch06 인스턴스 및 정적 멤버

728x90
반응형

1. 인스턴스(Instance) 멤버

 

◎ 인스턴스 멤버 : 필드와 메소드 등 객체(class)에 소속된 멤버

   ▷ 객체가 생성되어야만 사용 가능한 필드, 메소드입니다.

 

◎ this 키워드

   ▷ 객체 내부에서는 인스턴스 멤버에 접근하기 위해 this를 사용합니다. 객체는 자신을 'this'라고 지칭합니다.

   ▷ 생성자와 메소드의 매개변수명이 인스턴스 멤버인 필드명과 동일한 경우,

       인스턴스 필드임을 강조하고자 할 때 this를 주로 사용합니다.

 

public class Car {
	// 필드
	String model;
	int speed;
	
	Car(String model){
		this.model = model;
	}
	
	// 메서드
	void setSpeed(int speed) {
		this.speed = speed;
	}
	
	// 메서드
	void run() {
		this.setSpeed(100);
		System.out.println(this.model + "가 달립니다.(시속:" + this.speed + "km/h)");
	}
}


인스턴스 멤버 : moded, speed, setSpeed(), run()

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

//	출력:
//	포르쉐가 달립니다.(시속:100km/h)
//	벤츠가 달립니다.(시속:100km/h)

 

 

 

2. 정적(Static) 멤버

 

◎ 정적 멤버 : 정적멤버 선언만으로도 바로 사용 가능한 필드, 메소드

   ▷ 객체를 생성하더라도 같은 번지를 지칭하게 됩니다.

   ▷ 메소드 영역의 클래스에 고정적으로 위치하는 멤버입니다.

 

 static 키워드를 추가해 정적 필드와 정적 메소드로 선업합니다.

 

◎ 정적 멤버 사용

   ▷ 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있습니다.

   ▷ 클래스 이름과 함께 도트(.) 연산자로 접근합니다.

 

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;
	}
}

 

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

//	출력 :
//	result1 : 314.159
//	result2 : 15.0
//	result3 : 5.0


static의 장점은 별도로 객체를 하나 만들지 않아도 된다는 것입니다.

만약 instance 멤버를 사용했다면 별도의 객체를 만들었을 것입니다.
ex) Calculator myCalc = new Calculator();

 

 정적 블록

   ▷ 정적 필드를 선언할 때 복잡한 초기화 작업이 필요하다면 정적 블록을 이용합니다.

   ▷ 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행합니다.

   ▷ 정적 블록이 클래스 내부에 여러 개가 선언되어 있을 경우에는 선언된 순서대로 실행합니다.

   ▷ 정적 필드는 객체 생성 없이도 사용할 수 있기 때문에 생성자에서 초기화 작업을 하지 않습니다.

 

public class Television {
	static String company = "MyCompany";
	static String model = "LCD";
	static String info;
	
	static {
		info = company + "-" + model;
	}
}

 

public class TelevisionExample {
	public static void main(String[] args) {
		System.out.println(Television.info);
	}
}

// 출력:
// MyCompany-LCD

 

 

 인스턴스 멤버를 사용할 수 없을 때

   ▷ 정적 메소드와 정적 블록은 내부에 인스턴스 필드, 인스턴스 메소드, this를 사용할 수 없습니다.

   ▷ 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근합니다.

 

public class test {
	// 인스턴스 멤버와 메소드 선언  <- 객체가 생성이 되어야지만 메모리에 올라간다.
	int field1;
	void method1() {
	}
	
	// 정적 멤버와 메소드 선언 <- 클래스 파일 생성만으로도 정적 멤버와 메소드가 메모리에 올라가진다.
	static int field2;
	static void method2() {
	}
	
	static {
		// field1 = 10;
		// method1();
		field2 = 10;
		method2();
	}
	
	static void method3() {
		// this.field1 = 10;
		// this.method1();
		field2 = 10;
		method2();
		
		test obj = new test();
		obj.field1 = 10;
		obj.method1();
	}
}

 

public class Car {
	// 인스턴스 필드
	int speed;

	// 인스턴스 메소드
	void run() {
		System.out.println(speed + "으로 달립니다.");
	}
	
	// 정적 메소드
	static void simulate() {
		Car myCar = new Car();
		myCar.speed = 200;
		myCar.run();
	}
	
	public static void main(String[] args) {
		simulate();  // 정적 메소드 호출
		
		Car myCar = new Car();
		myCar.speed = 60;
		myCar.run();		
	}
}

//	출력 : 
//	200으로 달립니다.
//	60으로 달립니다.

 

인스턴스 멤버와 정적 멤버를 잘 이용해야 class 끼리 연결하거나 새로운 메서드를 연결할 때 문제없이 연결할 수 있습니다. 여기서 인스턴스란 객체의 의미로 사용하는 인스턴스와는 다르니 주의하셔야해요!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

 

728x90
반응형