ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210420_1~2(static변수,singleton pattern,final)
    JAVA(Sol)(정리대기중..언젠가) 2021. 4. 20. 11:27

    static변수 ,

    정적영역, 객체생성없이, 곧바로메모리할당, 실행빠름.

    즉 클래스 변수는 단 한번만 생성되고 모든 인스턴스가 같이 공유해서 사용한다.

    단 한번만 생성되고: 멤버변수는 인스턴스가 생성될때, 각각 객체영역에 할당받는다.

    그런데 클래스 변수는 객체를 생성하는 것과 무관하게 static 영역에 한번만 할당 받는것.

     

    cnt는 각 객체에 생성이되서 사용이되기때문에 cnt = 0+1가 반복된다

    boxID는 하나의 객체로 모두가 같이쓰기때문에  boxID값에 누적이되는것.

    package chapter9;
    
    class Box {
    	int cnt = 0; // 멤버변수
    	static long boxID = 0; // 클래스변수(static영역)
    	// (누적을일으킨다.모든객체에서 하나의변수를 사용가능)
    
    	public Box() {
    //		long count = 0; 쓸데없이 메모리만 차지한다~
    		boxID = boxID +1; 
    		//boxID = boxID++; 변화중인값을 boxID에 대입하라..
    	// boxID=boxID+1; == boxID++; 또는 ++box;
    		cnt = cnt+1;
    		System.out.println("cnt :" + cnt);
    		System.out.println("BoxID:" + boxID);
    	}
    }
    
    public class StaticDemo {
    	public static void main(String[] args) {
    		Box mybox1 = new Box(); // mybox가 생성만되고 사용되지않아서 경고떠있음
    		Box mybox2 = new Box();
    		Box mybox3 = new Box();
    		Box mybox4 = new Box();
    
    	}
    
    }
    //cnt1
    //BoxID:1
    //cnt1
    //BoxID:2
    //cnt1
    //BoxID:3
    //cnt1
    //BoxID:4

     

    package chapter9;
    class StaticClass{
    	public static StaticClass sc= null; //스태틱변수sc
    	int kuk=100; //멤버변수kuk
    }
    
    public class StaticClassMain {
    
    	public static void main(String[] args) {
    		StaticClass sc=new StaticClass(); // 지역변수 sc
    		StaticClass sc2= new StaticClass();
    		
    		System.out.println("sc.hashCode:" +sc.hashCode());
    		System.out.println("sc.kuk:" +sc.kuk);
    		System.out.println("sc2.hashCode:" +sc2.hashCode());
    		System.out.println("sc2.kuk:" +sc2.kuk);
    	}
    
    }
    

     


    싱글톤패턴 singleton pattern

    하나의 객체 영역을 사용하는 여러개 인스턴스 변수 :

     

    우리반 40명의 국영수점수 총합 평균 구하시오

    방법1 : 객체 40명분을 생성해서 각각을 총합과 평균을 구한다. <===동시성 홍길동->이순신->홍길동

                                                                                                    [국|영|수]/[국|영|수]/[국|영|수]     

    방법2 : 그런데, 만약에 40명분의 데이타처리를 순서대로 처리하는 것이라면 (메모리를획기적으로줄임)

    객체를 한개만 생성해서 반복문으로 돌아가면서 처리한다.         홍길동->이순신->유관순 ...

                                                                                       --------[국|영|수]---------한개영역만 존재하면된다.

                                                                                                저장/출력

    package chapter9;
    class StaticClass2{
    	public static StaticClass2 sc = null;
    	int kuk=100;
    
    	public static StaticClass2 getInstance() {
    	if(sc==null) {
    		sc = new StaticClass2();
    	}
    	return sc;
    	
    }
    }
    public class StaticClassMain2 {
    	public static void main(String[] args) {
    		
    		StaticClass2 sc = new StaticClass2();    // 각각의 객체를 생성해서 sc와
    		StaticClass2 sc2 = new StaticClass2();   // sc2는 다르다
    		
    		System.out.println("sc.hashCode : " + sc.hashCode());
    		sc.kuk=1000;
    		System.out.println("sc.kuk:" + sc.kuk);
    		System.out.println("sc2.hashCode :" + sc2.hashCode());
    		sc2.kuk=1500;
    		System.out.println("sc2.kuk :" + sc2.kuk);
    		System.out.println("sc.kuk : " + sc.kuk);
    		
    		System.out.println("-----------------");
    		StaticClass2 sc3= StaticClass2.getInstance(); // 한개의 객체를 돌아가면서씀 sc3, sc4
    		StaticClass2 sc4 = StaticClass2.getInstance(); // 
            
    		sc3.kuk=2000;
    		System.out.println("sc3.kuk : "+ sc3.kuk);
    		System.out.println("sc4.kuk : "+ sc4.kuk);
    		System.out.println("sc3.hashCode : "+ sc3.hashCode());
    		System.out.println("sc4.hashCode : "+ sc4.hashCode());
    
    		sc4.kuk=2500;
    		System.out.println("sc4.kuk : " + sc4.kuk);
    		System.out.println("sc3.kuk :" + sc3.kuk);
    		System.out.println("sc3.hashCode : "+ sc3.hashCode());
    		System.out.println("sc4.hashCode : "+ sc4.hashCode());
    				
    	}
    
    }
    
    

     


    Final

    Final변수 : 값을 변경할 수 없다.  <---상수 만들때

    final 메서드 : 오버라이딩(재정의) 불가능 <--->비교: 오버로딩(중첩함수)

    final 클래스 : 상속(확장)이 불가능 하다.

    package chapter9;
    
    class Final {
    	int money = 20000;
    	final int day = 7;
    	final int week = 4;
    	final int month = 12;
    
    	public Final() {
    
    	}
    }
    
    public class Finalmain {
    
    	public static void main(String[] args) {
    		Final fi = new Final();
    		fi.money = 30000; // final이 없기때문에 초기화가능
            //final가 붙은 상수는 fi.day 이런식으로 초기화할수없다.
    		System.out.println("1주일 용돈: " + fi.money * fi.day);
    
    	}
    
    }
    

     

Designed by Tistory.