Java

νŒ¨ν‚€μ§€, μ ‘κ·Ό μ œμ–΄μž, static λ³€μˆ˜, singleton νŒ¨ν„΄

쑰밈밍 2022. 2. 28. 17:13

πŸ’‘ νŒ¨ν‚€μ§€ Package

: 보톡 μ†Œλ¬Έμžλ‘œ μž‘μ„±

: 클래슀의 λΆ„λ₯˜κ°€ μš©μ΄ν•˜λ‹€ (λΉ„μŠ·ν•œ 것 끼리 λ¬ΆλŠ”λ‹€)

: νŒ¨ν‚€μ§€κ°€ λ‹€λ₯΄λ©΄ λ™μΌν•œ 클래슀λͺ…을 μ‚¬μš©ν•  수 μžˆλ‹€ <- μΆ©λŒμ•ˆλ‚œλ‹€

 

πŸ’‘ μ ‘κ·Ό μ œμ–΄μž

πŸ”Ž private

: ν•΄λ‹Ή λ³€μˆ˜, λ©”μ„œλ“œλŠ” ν•΄λ‹Ή ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€

πŸ”Ž default

: μ ‘κ·Ό μ œμ–΄μžλ₯Ό λ³„λ„λ‘œ μ„€μ •ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ ‘κ·Όμ œμ–΄μžκ°€ μ—†λŠ” λ³€μˆ˜, λ©”μ„œλ“œλŠ” default μ ‘κ·Ό μ œμ–΄μžκ°€ λ˜μ–΄

  ν•΄λ‹Ή 동일 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€

πŸ”Ž protected

: ν•΄λ‹Ή λ³€μˆ˜, λ©”μ„œλ“œλŠ” λ™μΌ νŒ¨ν‚€μ§€μ˜ 클래슀 λ˜λŠ” ν•΄λ‹Ή 클래슀λ₯Ό 상속받은 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€

πŸ”Ž public 

: ν•΄λ‹Ή λ³€μˆ˜, λ©”μ„œλ“œλŠ” μ–΄λ–€ ν΄λž˜μŠ€μ—μ„œλΌλ„ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€ (λͺ¨λ‘ μ ‘κ·Ό κ°€λŠ₯)

 

πŸ’‘ static λ³€μˆ˜

: μ—¬λŸ¬κ°œμ˜ μΈμŠ€ν„΄μŠ€(각각 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 가짐)κ°€ 같은 λ©”λͺ¨λ¦¬μ˜ 값을 κ³΅μœ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

: 기쀀이 λ˜λŠ” κ°’(항상 값이 λ³€ν•˜μ§€ μ•ŠλŠ” 경우)은 static λ³€μˆ˜λ‘œ 생성 <- λ©”λͺ¨λ¦¬ ν• λ‹Ή λ”± ν•œλ²ˆλ§Œ ν•œλ‹€

* 값이 λ³€κ²½λ˜μ§€ μ•ŠκΈ°λ₯Ό λ°”λž€λ‹€λ©΄ static μ•žμ— final 뢙이기

: ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ— μ μž¬(load) λ λ•Œ λ°μ΄ν„° μ˜μ—­μ˜ λ©”λͺ¨λ¦¬μ— μƒμ„±λœλ‹€

 

πŸ”Ž static λ©”μ„œλ“œ

: 객체 생성없이 클래슀 μ΄λ¦„μœΌλ‘œ 직접 ν˜ΈμΆœν•œλ‹€ 

 

package staticex;

public class Student {
	
	static int serialNum = 10000;	// κ³΅μœ λ˜λŠ” κ°’
	
	int studentID;
	String studentName;
	
	public Student() {	// constructor : 클래슀의 μΈμŠ€ν„΄μŠ€ 객체λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”
		serialNum++;
		studentID = serialNum;
	}

	public static int getSerialNum() {
		int i = 10;				
        // μ§€μ—­λ³€μˆ˜ : getSerialNum()λ©”μ„œλ“œ μ‹€ν–‰μ‹œ μƒμ„±λœλ‹€ -> λλ‚˜λ©΄ 사라짐
        
		i++;
		System.out.println(i);
		
		studentName = "홍길동"; 
        // λ©€λ²„λ³€μˆ˜, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ : newλ λ•Œ 생성 => static λ©”μ„œλ“œμ—μ„œλŠ” λ©€λ²„λ³€μˆ˜ μ‚¬μš©λΆˆκ°€
		
		return serialNum;		// static λ³€μˆ˜, 클래슀 λ³€μˆ˜
	}
}
package staticex;

public class StudentTest {

	public static void main(String[] args) {
		System.out.println(Student.getSerialNum());	
        // staticλ©”μ„œλ“œ μ•ˆμ— λ©€λ²„λ³€μˆ˜ μ‚¬μš©X -> 아직 생성 μ•ˆλ¨
		
		Student james = new Student();	// new ν• λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ ID값이 +1λ˜λŠ”κ²ƒμ„ 원함
		System.out.println(james.studentID);
		System.out.println(Student.serialNum);
		
		Student tomas = new Student();
		System.out.println(tomas.studentID);
		System.out.println(Student.serialNum);
		
		System.out.println(james.serialNum);	// λ‘κ°œκ°€ κ³΅μœ ν•˜λŠ” κ°’
		System.out.println(tomas.serialNum);
	}
}

: κ²°κ³Ό

 

πŸ’‘ singleton νŒ¨ν„΄

: static μ‘μš© 

: 단 ν•˜λ‚˜μ˜ κ°μ²΄λ§Œμ„ μƒμ„±ν•˜κ²Œ κ°•μ œν•˜λŠ” νŒ¨ν„΄

-> 클래슀λ₯Ό 톡해 생성할 수 μžˆλŠ” κ°μ²΄λŠ” 단 ν•˜λ‚˜.

ex) λ‚ μ§œ == 단,ν•˜λ‚˜ 

: static λ³€μˆ˜ μ‚¬μš© + public 으둜 μ„ μ–Έλœ static λ©”μ„œλ“œ μ‚¬μš©

class Singleton {
    private Singleton() {
    }
}

public class Sample {
    public static void main(String[] args) {
        Singleton singleton = new Singleton();  // 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
    }
}

* private -> λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ Singleton 클래슀의 μƒμ„±μžλ‘œμ˜ μ ‘κ·Ό λ§‰μ•˜λ‹€

            -> λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ Singleton 클래슀λ₯Ό newλ₯Ό μ΄μš©ν•˜μ—¬ 생성할 수 μ—†κ²Œ λ§Œλ“€μ—ˆλ‹€

 

package singleton;

public class Company {
	
	private static Company instance = new Company();	
	// 2. μ „μ²΄μ—μ„œ μœ μΌν•˜κ²Œ μ‚¬μš©λ  instance, ν•¨λΆ€λŸ¬ κ°’ λ°”λ€Œλ©΄ μ•ˆλ¨ -> private, 단 ν•œκ°œλ§Œ 쑴재 -> static
	
	private Company(){	
	}
	// 1. μƒμ„±μž private -> μ™ΈλΆ€μ—μ„œ new Company μƒμ„±λΆˆκ°€ -> 내뢀에 생성
	
	public static Company getInstance() {	
		return instance;
	}
	// 3. μΈμŠ€ν„΄μŠ€ 객체 μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•¨, 객체 μƒμ„±ν•˜μ§€ μ•Šκ³  λ©”μ„œλ“œ μ‚¬μš© -> static
}
package singleton;

public class CompanyTest {

	public static void main(String[] args) {
		Company c1 = Company.getInstance();
		Company c2 = Company.getInstance();
		
		System.out.println(c1 == c2);	// true λ™μΌν•œ κ°’
	}
}

 

cf ) singleton λ¬Έμ œμ΄κ΅¬λ‚˜~