profile image

L o a d i n g . . .

 

클래스는 객체의 설계도.

클래스로부터 객체(인스턴스)는 하나가 아닌 여러 개가 만들어 질 수 있다. 이 경우 자바에서는 클래스멤버를 객체마다 모두 가지고 있는대신 인스턴스멤버정적멤버로 구분하여 선언할 수 있도록 한다.

 

 

 

 

 


인스턴스멤버?

객체마다 가지고 있는 멤버. 객체(인스턴스) 생성 후 사용할 수 있는 필드와 메소드.

public class Car {
	//field
	int gas;
	
	//method
	void setSpeed(int speed) {...};
}

위 gas 필드와 setSpeed를 외부 클래스에서 사용하려면

new 연산자를 통해 객체를 생성해야한다.

 

Car myCar = new Car();
myCar.gas = 10; 
myCar.setSpeed(60);

Car yourCar = new Car();
yourCar.gas = 20; 
yourCar.setSpeed(80);

위 코드 실행 후 

JVM 내부 메모리상태를 살펴보면 위처럼 되어있다

인스턴스 필드 gas는 객체마다 존재하고 인스턴스 메소드 setSpeed()는 메소드 영역에 저장되어 공유된다.

이유는

메소드는 코드블록이기때문에 객체마다 동일한 코드블록을 갖고 있을 필요가 없고, 메모리 블록 내부에 인스턴스 필드등이 사용되는 경우가 있기 때문

 

 

this?

객체 내부에서 자신을 참조할 때. 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용

Car (String model){
	this.model = model;
}

void setModel(String model){
	this.model = model;
}

 

 

package a220707;

public class Car {
	//field
	int gas;
	String model;
	int speed;
	
	//constructor
	Car(String model){
		this.model = model;
	}
	
		//method
	void setSpeed(int speed) {
		this.speed = speed;
	};
	
	void run() {
		for (int i = 0; i <= 50; i+=10) {
			this.setSpeed(i);
			System.out.println(this.model+"가 달립니다.(시속:"+this.speed+"km/h)");
		}
	}
}

 

 

 

 

 

 

 

 


정적멤버? static?

정적(static)은 '고정된'이란 의미이다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지않고 사용할 수 있는 필드와 메소드를 말한다.

필드와 메소드 선언시 앞에 static 을 붙인다.

 

public class Calculator {
	
	String color;
	void setColor(String color) {this.color = color;};
	
	public static int plus(int x, int y) {return x + y;};
	public static int minus(int x, int y) {return x - y;};
	public static double pi = 3.14159;
}

 

위 경우 계산기의 색상은 다르나, pi의 값은 항상 똑같고 객체마다 가지고 있을 필요가  없는 공용데이터 이므로 정적 필드로 선언했다.

plus와 minus는 외부에서 주어진 값으로 계산을 수행하므로 정적메소드로 수행했다.

 

public class CalculatorEx {
	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);
	}
}

인스턴스 메서드는 new 연산자를 통해 접근했으나 정적 메서드는 클래스 이름으로 바로 접근 가능.

 

 

 

 

 

 


주의사항

객체가 없어도 실행된다는 특징때문에 정적메소드 선언 시 내부에 인스턴스 필드, 메소드, this 키워드 사용이 불가하다.

정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성해주어야 한다.

 

main() 메소드도 정적 메소드이기 때문에 객체 없이 인스턴스 필드와 메소드를 바로 사용할 수 없다.

 

 

 

 

 

 

 

 

 


싱글톤(singleton)?

전체 프로그램에서 단 하나의 객체만 생성됨 (동일한  객체)

클래스 외부에서 new 연산자로 생성자를  호출할 수 없도록 막아야한다.

그럴 때 prvate 접근  제한자를 붙여준다.

그리고 자신 타입인 정적 필드를 선언하고  자신의 객체를 생성해 초기화 한다.

public class Singleton {
	private static Singleton singleton = new Singleton();
	private Singleton() {}
	static Singleton getInstance() {
		return singleton;
	}
}

외부에서 getInstance()를 선언하고 정적필드에서 참조하고있는 자신의 객체를 리턴.

public class SingletonEx {
	public static void main(String[] args) {
//		Singleton obj1 = new Singleton(); 에러코드
		Singleton singleton1 = Singleton.getInstance();
		Singleton singleton2 = Singleton.getInstance();
		
		if (singleton1 == singleton2) {
			System.out.println("같은 싱글턴객체입니다.");
		} else {
			System.out.println("다른 싱글턴객체입니다.");
		}
	}
}

 

 

 

 

 

 

 

 

 

 


final 필드와 상수(static final)

초기값이 저장되면 최종적인 값이 되어 프로그램 실행 도중  할 수 없다

 

final 필드의 초기값 주는법

- 필드 선언시 부여

- 생성자에서 초기값 지정

 

public class Person {
	public final String  nation = "Korea";
	public final String ssn;
	public String name;
	
	public Person(String ssn, String name) {
		this.ssn = ssn;
		this.name = name;
	}
}
		Person person = new Person("123456-7891234", "홍길동");
		
		System.out.println(person.nation);
		System.out.println(person.ssn);
		System.out.println(person.name);

 

 

 

 

상수(constant)

상수는 static 이면서 final이기때문에 객체마다 존재하지않고 클래스에만 존재한다.

또한 대문자로 작성하는것이 관례

class Earth {
	static final double EARTH_RADIUS = 6400;
	static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
}

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

 

 

 

 

참고: 

- 혼자 공부하는 자바(신용권), 한빛미디어

반응형

'개발 > JAVA' 카테고리의 다른 글

[Java] 상속  (0) 2022.07.11
[Java] Getter & Setter  (0) 2022.07.08
[Java] 메소드  (0) 2022.07.06
[Java] 생성자(constructor)  (0) 2022.07.05
[Java] 필드(field)  (0) 2022.07.04
복사했습니다!