☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND]JAVA_ECLIPSE14 인스턴스 멤버와 정적 멤버

조반짝 2023. 8. 24. 15:16
728x90
반응형

 

인스턴스 멤버

인스턴스멤버: 객체로 만들어진 자신만의 속성을 가지고 있는 멤버

 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데 이를 각각 인스턴스 필드, 인스턴스메소드라고 부른다.

 

this: 자기 자신의 영역을 동적표현으로 표현할 때 , 객체 외부에서 인스터스멤버에 접근하기 위해 참좊변수를 사용하는 것과 마찬가지로 객체 내부에서도 인스턴스 멤버에 접근하기위해 this를 사용할 수있다.


인스턴스 멤버와 this

 

실행 클래스

package chapter06.sec05.exam01;

// 인스턴스 멤버(필드, 메서드)와 this(자기 자신 객체의미)를 이해하기 위한 Car 클래스를 생성
public class Car {

	//필드(Field) 선언
	String model;
	int speed;
	
	// 생성자(Constructor)
	// Source - Generate Constructor Using Fields... 클릭 활용
	//public 접근제어자, 생략가능
	public Car(String model) {
		this.model = model;
	}

	
	//메서드(Method) 
	// // Source - Generate Getter and Setters... 클릭활용
	public void setSpeed(int speed) {
		this.speed = speed;
	}
	
	void run() {
		for (int i = 10; i <= 50; i+= 10) {
			//this = Car class
			this.setSpeed(i);
			System.out.println(this.model + "가 달립니다! (시속 = " + this.speed +"km/h)");
			
		}
	}
	
	 
}
package chapter06.sec05.exam01;

// 앞서 생성한 Car 클래스를 활용하는 CarExample 실행 클래스를 소스 코딩합니다.
public class CarExample {
	
	public static void main(String[] args) {
		
		//myCar 참조객체이자 인스턴스 객체이다.
		Car myCar = new Car("포르쉐");
		myCar.run();
		
		Car yourCar = new Car("벤츠");
		yourCar.run();
	}
}

정적멤버: 클래스에 위치하고 객체들이 공유하는 멤버

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

메소드 메모리 영역에 적재할 떄 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나면 바로 사용 가능. 

 

** static을 붙이면 프로그램이 구동될때 메모리영역에 올라간다.

장점은 언제든지 갖다쓰기가 용이하다.

단점은 static 을 붙이면 프로그램이 구동될때 메모리영역에 올라가기때문에 메모리에 부화가 걸리고 프로그램이 무거워지기 때문에 느려지게 된다. 퍼포먼스에 안좋은 영향을 줄 수 있음

어쩔 수 없이 사용하게 된다면 최소화해야한다. 대체로 함수형 프로그램을 사용해야한다.

 

 


정적 멤버 사용

 

변수 앞에 static을 붙이면 outline 에 s 가 붙은걸 볼 수 있다.

실행 클래스 생성

정적멤버를 클래스이름으로 접근하지 않고 객체 참조 변수로 접근했을 경우 노란색 경고가 나타난다.

경고만 나올 뿐 실행 결과는 같다.


정적 메소드(Static Method)는 객체가 아닌 클래스 자체에 속하는 메소드입니다. 정적 메소드는 클래스 레벨에서 호출되며, 객체의 상태에 의존하지 않는 독립적인 기능을 구현할 때 주로 사용됩니다. 정적 메소드를 선언할 때 주의해야 할 몇 가지 사항이 있습니다:

인스턴스 변수와 메소드에 접근 불가능: 정적 메소드는 객체의 상태에 접근할 수 없습니다. 따라서 정적 메소드 내부에서는 인스턴스 변수나 인스턴스 메소드를 직접 사용할 수 없습니다.

this 키워드 사용 불가능: 정적 메소드는 클래스 레벨에서 호출되기 때문에 this 키워드를 사용할 수 없습니다. this는 인스턴스 자신을 참조하는데 사용되므로, 정적 메소드에서는 사용할 수 없습니다.

정적 메소드 내부에서 다른 정적 메소드 호출: 정적 메소드 내부에서 다른 정적 메소드를 호출할 수 있습니다. 하지만 이때 호출되는 정적 메소드도 마찬가지로 위의 규칙을 따라야 합니다.

정적 메소드는 상속되지 않음: 하위 클래스에서 정적 메소드를 오버라이드할 수 없습니다. 정적 메소드는 클래스의 구현과 관련된 것이 아니라 클래스 자체에 속하므로, 하위 클래스에서 재정의되지 않습니다.

정적 메소드는 클래스 이름으로 직접 호출: 인스턴스를 생성하지 않고도 클래스 이름을 통해 정적 메소드를 호출할 수 있습니다. 예를 들어, ClassName.staticMethod()와 같이 호출합니다.

정적 메소드 내에서 인스턴스 생성 불가능: 정적 메소드 내부에서는 인스턴스를 생성할 수 없습니다. 인스턴스 생성은 객체의 상태를 가지는 것이므로 정적 메소드에서는 허용되지 않습니다.

정적 메소드의 가용성과 범위: 정적 메소드는 해당 클래스가 로드되고 메모리에 적재될 때 사용 가능해집니다. 정적 메소드는 해당 클래스의 모든 객체와 관련없이 클래스 이름을 통해 호출 가능합니다.

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

package chapter06.sec05.exam03;

// 정적(static) 메서드(method) 선언(declaration) 시 주의할 점 이해를 위해 
// Car 클래스를 코딩합니다.
public class Car {
	int speed; // instance member field speed 선언
	
	// 인스턴스 멤버 메서드 run() 선언
	void run() {
	System.out.println(speed + "으로 달립니다.");		
}

		
	
	public static void main(String[] arges) {
		
		
//		speed = 60;
//		run();
		
		Car myCar = new Car();
		myCar.speed = 60;
		myCar.run(); //60으로 달립니다.
	}	
}

 

싱글톤

하나의 형식을 변경하고 싶지 않을 때 (일관성있고, 재사용이 편리한) 패턴을 만들 때 필요.

private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 한다.

대신 외부에서 호출할 수 있는 정적 메소드 getInstance()을 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.


싱글톤

실행클래스 생성

package chapter06.sec05.exam04;

// 싱글톤 패턴(singleton pattern) 이해를 위해 Singleton 클래스를 선언합니다.
public class Singleton {

	private static Singleton singleton = new Singleton();
	
	private Singleton() {
		System.out.println("싱글톤 생성자가 만들어졌습니다!");
	}
	
	static Singleton getInstance() {
		return singleton;
	}
	
}
package chapter06.sec05.exam04;

// 앞서 생성한 싱글톤 객체(Singleton)을 활용하는
// SingletonExample 실행 클래스를 소스 코딩합니다.
public class SingletonExample {

	public static void main(String[] args) {
		
//		Singleton obj1 = new Singleton(); // 컴파일 에러
		Singleton obj1 = Singleton.getInstance();
		Singleton obj2 = Singleton.getInstance();
		// 결과값이 한번만 나온다. obj1 변수1 , obj2 변수2 가 같은 객체를 보고있다.
		
		//== 주소 메모리 비교
		if(obj1 == obj2) {
			System.out.println("같은 Singleton 객체를 참조합니다!");
		}else {
			System.out.println("다른 Singleton 객체를 참조합니다!");
		}
	}
}

final 필드

상수 표현할 때 사용 

 


final 필드 선언과 초기화

 

 

최종 확정된  선언만 나오게하기

 

상수값을 받는 객체는 대문자로 표현한다.

package chapter06.sec05.exam05;

// final 필드 선언과 초기화 이해를 위한 사람(Person) 클래스를 생성합니다.
public class Person {
	
		// 확정됨
		final String NATION = "Korea";
		// final 필드 ssn은 아래 Person 생성자 매개값으로 
		// ssn을 받아서 초기값으로 지정되었습니다.
		//매개변수로 받아서 출력되는 값이 확정이다.
		final String SSN; 
		//name은 확정된 값이 아님
		String name;
		
		public Person(String SSN, String name) {
			this.SSN = SSN;
			this.name = name;
		}
		
		

}
package chapter06.sec05.exam05;

// 앞서 생성한 Person 클래스를 활용하여, final 필드를 테스트할 PersonExample 실행 클래스를 코딩합니다.
public class PersonExample {

	public static void main(String[] args) {
		Person p1 = new Person("998821-2324587", "장나라");
//		p1.nation = "Japan"; //final을 지우면 변경가능하다.
//		p1.ssn = "8848345-1249493";
		p1.name = "장발장";
		
		System.out.println(p1.NATION); //Korea
		System.out.println(p1.SSN); //998821-2324587
		System.out.println(p1.name); // 장발장
	}
	
}

상수

일반적으로 불변의 값을 상수라고 부른다.

FINAL필드를 상수라고 불리지않는다. 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러가지 값으로 초기화 될 수없기 때문에 Static이면서 final이어야 한다.

객체마다 존재하지 않고 클래스에만 존재, 그리고 한번 초기값이 저장되면 변경할 수 없다.


상수선언

상수선언이 되면 outline 에 static final 표시가 뜬다.

상수사용

상수선언

package chapter06.sec05.exam06;

// 상수(static final) 선언(declaration) 이해를 위해 Earth 클래스를 생성합니다.
public class Earth {

	//현재는 상수가 아님
//	double EARTH_RADIUS = 6400;
	// 상수가 되려면
	static final double EARTH_RADIUS = 6400;
	static final double EARHT_AREA = 4 * Math.PI * EARTH_RADIUS;
}

상수사용

package chapter06.sec05.exam06;

// 앞서 생성한 Earth 클래스를 활용하는 EarthExample 실행 클래스를 소스 코딩합니다.
public class EarthExample {

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

//실행결과
//지구의 반지름 =6400.0km
//지구의 표면적 = 80424.77193189871km^2

 

 

 

728x90
반응형