-
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); } }'JAVA(Sol)(정리대기중..언젠가)' 카테고리의 다른 글
210420_5~7_210421_1chapter11.(Call by value/reference, 문자열) (0) 2021.04.20 210420_3~4(변수 유효범위,생성자특징) (0) 2021.04.20 210419_7~8 (생성자오버로딩) (0) 2021.04.19 210419_5~6(chapter9.메모리운영,객체구별,기본생성자) (0) 2021.04.19 210419_3~4(getter,setter) (0) 2021.04.19