[day14]

1. 싱글턴 Singleton (싱글인스턴스)  모두에게 도서관이 필요하다해서 여러개 지을 필요는 없다!
여기서 도서관은 인스턴스! (객체 =인스턴스(물품) + 클래스(설계도))

1) 싱글턴의 구성 요소 
1 - 자기 클래스 타입의 private static 변수 (객체 생성해 초기화) 
private static 클래스명 instance = new 클래스명(); 

외부에서 객체생성 못하니 내 안에 미리 만들고, 
자기 자신 타입으로 객체생성하므로 무한로딩에 빠지지 않게
한번만 로딩되라고 static붙혀 클래스 변수로 만든다.
함부로 외부에서 변수값 수정 못하게 private 해놓기 

2 - private 생성자 
private 클래스명() {...}

외부에서 이 클래스 객체 생성 못하게 
생성자에 private 붙히기 

3 - instance의 get 메서드 생성해서 공개
public static 클래스명 getInstance() {  
return instance; 
}

외부에서 객체 생성못하니,
메서드도 static 붙혀 클래스명.메서드명()으로 
사용가능하게, 그리고 어디서든 필요하면 사용가능하게
public으로 완전 공개

2. 내부 클래스 inner class , nested class (*이런게 있구나 정도만 알면됨)
클래스 내부에 또 다른 클래스를 정의하는 것. 
이유 : 은닉화를 위해 사용 

1) 구조
class 외부클래스 {
외부 변수; 
외부 메서드;

class 내부클래스 {
내부 변수;
내부 메서드;
}
}

2) 종류 : 클래스 정의 위치에 따라 구분 
1. 멤버 클래스 
1 - 인스턴스 멤버 클래스 
: A클래스 객체를 생성해야만 사용할 수 있는 B 내부 클래스 

class A {
class B {
B() {}
int x;
void method(){}
//static int y; 
//static void method2() {}
}
}

# 객체 생성 & 사용 
A a = new A(); 
A.B b = a.new B(); 
b.x = 10; 
b.method();

2 - static 멤버 클래스 
: A클래스를 통해 바로 접근 가능한 B 내부 클래스 

class A {
static class B {
B() {}
int x;
void method(){}
static int y; 
static void method2() {}
}
}

# 객체 생성 & 사용 
A.B b = new A.B(); 
b.x = 10; 
b.method(); 
A.B.y = 20; 
A.B.method2(); 

# 멤버 클래스도 하나의 클래스이므로 
컴파일하면 바이트코드파일(.class) 별도로 생성 
A$B.class 

2. 로컬(지역) 클래스 
: method() 가 실행될때만 사용할 수 있는 B 내부 클래스 

class A {
void method() {
class B {
B() {}
int x;
void method(){}
//static int y; 
//static void method2() {}
}
# 객체 생성 & 사용
B b = new B(); 
b.x = 10; 
b.method(); 
}
}

A$1 B.class

3. 익명 클래스 anonymous class 
: 이름이 없는 클래스 
클래스를 정의하고 동시에 객체 생성해서 사용. 

변수의 초기값, 지역변수의 초기값, 매개변수의 매개값으로 주로 대입됨.
이벤트처리할때나 스레드 객체를 간편하게 생성할 목적으로 많이 활용됨.
단독으로 생성 불가, 클래스를 상속하거나 인터페이스를 구현해야 생성가능.

1) 구조 
new 클래스명() {
// 클래스 정의 
}

new 인터페이스() {

}



package day14;
class SingleT{
	static int b = 1;
	int a = 100;
	//싱글턴
	private static SingleT instance = new SingleT();
	private SingleT() {}
	public static SingleT getInstance() {
		return instance;
	}
	
	void func() {
		System.out.println("~~~");
	}
}


public class ClassEx31 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//SingleT sing = new SingT();
		SingleT sing = SingleT.getInstance();
		SingleT sing2 = SingleT.getInstance();
		
		sing.func();
		
		System.out.println(sing.a);
		sing.a= 123;
		System.out.println(sing.a);
				
	}
}




package day14;

public class ClassEx32 {

	
	interface MyInter{
		void func();

		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
			
			//	MyInter a = new MyInter();
			//	a.func();
		//-> 계속생성가능
			//MyInter 인터페이스 규겍에 맞는 
			// 구현 익명 클래스 만들어서 객체 생성하고, 메서드 호출!
			new MyInter() {
				@Override
				public void func() {
					System.out.println("MyInter의 func 구현부 ~~");
				}
			}.func();
		// 1회성 코드
	}
}




package day14;
class Person{
	void wake() {
		System.out.println("7시에 기상");
	}
	
}

class Anony{
	Person p2 = new Person();
	// 변수의 초기값 대입
	Person p = new Person() {
		void walk() {
			System.out.println("출근~~~");
		}
		@Override
		void wake() {
			System.out.println("6시에 기상!");
			
		}
	};
	
	void func() {
		//지역 변수의 초기값으로 대입
		Person localP = new Person() {
			@Override
			void wake() {
				System.out.println("8에 일어나서....");
				
				
			}
		};
		localP.wake();
	}
	void func2(Person person) {
		person.wake();
		
	}
}
public class ClassEx33 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Anony anony = new Anony();
		//anony.p.wake();
		//anony.p2.wake();
		
		anony.func2(new Person(){
			//void study() };
	}		
}















 

 

 

 

 

 

 

 

+ Recent posts