코딩/2-JAVA

C17스태틱

tree0505 2025. 7. 11. 12:40
반응형
    • C17스태틱

  • C1701스태틱_개념

  • C1701개념01스태틱
package C1701스태틱_개념;


class Test01 {
								// 클래스영역의 변수의 종류
	public int a;				// non-static 변수 = 인스턴스 변수
	//변수가 있으면 접근제어자를 붙일 수 있다. publikc => 어디서든 접근 할 수 있다. 
	public static int b;		// static 변수	  = 클래스 변수
	//스태틱 옵션을 붙일 수 있다. 
	//스태틱을 붙이면 new를 하지 않아도 사용할 수 있다. 
	//스태틱은 전역 변수이다. //3번 
	
	static void test() {
		System.out.println("!!");
	}
}

public class C1701개념01스태틱 {
	public static void main(String[] args) {
			
		//main이 실행되면서 static붙은 애들은 3번 전역에 만들어져 있다. 
		//public int a;
		//public static int b;	
			//이것들은 이미 3번 전역에서 만들어져 있다. 
		
		
			// static 키워드 
			// static 은  시작하자마자 바로 메모리에 생성이되서 
		    // new 를 하지않아도 사용할수있다.
		
			// static으로 생성한 변수에 접근하는법
	        // 클래스명.변수명  ==> Test01.b
		
			Test01.b = 10;
			//new를 하지 않아도. 미리 전역3번에 만들어져 있기 때문에 넣을 수 있다. 
			
			System.out.println(Test01.b);
			System.out.println("-------------------------------------");
			// static으로 생성된 변수는 new 를 할때 새로 생성되지않는다. 
			
			Test01 t1 = new Test01();
			//main에 t1이 생긴다. //스태틱 붙은것은 t1에 안 만들어져 있다. //3번에 있으니까.
			//a만 만들어 진다. 2번에 //public int a;
			
			t1.a = 20;
			System.out.println(t1.a); //이 a는 2번째 a이고 
			System.out.println(t1.b); // 같은결과가나온다. Test01.b 와 같다.
			//이 b는 3번 영역에 b이다. 
			System.out.println("-------------------------------------");
			Test01 t2 = new Test01();
			//1번에 t2를 만들었다. 
			//new를 하면 a만 만들어 지는것이다. 
			
			t2.a = 30;
			System.out.println(t2.a);
			//이 a는 t2의 a . 출력은 2번영역에서 출력이 되는거다. 
			System.out.println(t2.b); // 위와 같다.
			//이 b는 3번에 있는 b인것이다. 
			
	}
}

// 스태틱_개념01_기본이론1.main(null);

  • 메모리 
    • 스태틱은 전역 변수에 만들어진다. 즉 3번 메모리 
    • 스태틱 영역. 주석. 클래스. 문자 . 많이 있다.
    • 공통점 
      • 처음부터 만들어져서 끝날때까지 살아있다. 
    • 프로그램이 시작되면 .
      • MAIN이 16번부터 실행 
      • 16번 부터. static 붙은 애들은 3번에 미리 만들어져 있다. 
        • a와 b가 만들어 진다. 


  • test
  • MemberTest

 

  • DB에 데이터를 넣고 싶으면 
    • class Member1을 해서 
      • 변수를 만든다. 즉 db의 틀을 만드는것 
      • 하지만 자바는 데이터를 직접 넣는것을 안 좋아하니. 
      • private String name; 
        • 변수는 private로 막고 
      • private : 자신 클래스에서만 사용 가능 
      • publick : 어디서든 사용 가능 . 다른 패키지에서도 사용 가능 
      •  public void setName(String name) {
        • this.name = name; 
          • 이렇게 사용하라는 것 
          • 변수는 private로 막고 
          • 데이터를 집어 넣고 싶으면 set과 get 을 써서 넣으라는 것 
          • 그것은 밑 main에서 가능하고  
  • 하지만 배열은 매번 new를 하기 싫어서 static에 만드는것이다. 
    • static은 3번 전역에 만들어져 있다. 
      • 즉 프로그램이 다 끝나면 데이터가 사라진다. 
      • 즉 main에 new를 할 필요 없이 사용이 가능해지는것 
    • class Member1DAO {   //배열
      • static publi Member1 [ ] memberList = new Member1 [ 1000]; 
      • 배열 
      • 배열에는 스태틱을 붙인다. new를 하기 싫으니까.  
    • }
  • 데이터는 컨트롤러에서 집어 넣는것이다. 
    • public class MemberTest {  //컨트롤러 
      • public static void main (String[ ] args) {  //main함수 
        • Member1DAO dao = new Member1 DAO (); 
          • NEW를 하기 싫다. 
        • Member m1 = new Member1 ( ) ; 
          • m1는 1번 메모리에 생기고 
          • new Member1은 2번째 heap에 생기면서 name과 number가 생긴다. 그 주소를 m1에게 주고 
        • m1. setName("aa"); 
          • 이때 데이터가 들어간다. 
          • m1.name = "aa"; 
            • 자바는 이렇게 직접 넣는것을 싫어한다. 
            • 즉 변수는 private로 막고 
            • 데이터를 집어넣는것은 set과 get을 이용해라. 
        • Member1DAO.memberList[0] = m1; 
          • dao 배열에 들어간것 
          • dao.memberList[0] = m1 
            • 이것은 안된다. dao는 지금 3번 영역에 있으니까. 
package test;
// static => 처음부터 한개만 만들어지기 

class Member1{
	private String name;
	//변수는 private로 막고 
	public int number;
	//db 틀 
	
	public void setName(String name) {
		this.name = name;
		//이렇게 써라. 
	}
}
//------------------------------------
class Member1DAO{
	static public Member1[] memberList = new Member1[1000];
	//배열 
	//배열에는 스태틱을 붙인다. new하기 싫으니까. 
}
public class MemberTest {
	//컨트롤러
		//데이터를 집어 넣기 db 
		// .(점) 찍어서 	
	public static void main(String[] args) {
	//	Member1DAO dao = new Member1DAO();
			//계속 new하기 싫으니까. 
			//여기서 new를 했을때. 1번에 생긴다. 
			//main이 끝나면 데이터가 사라진다. 
			//3번에 적으면 아예 다 끝나야지 데이터가 사라진다. 
		
		Member1 m1 = new Member1();
		//new를 했을 떄. 1번에 m1이 생기고 
		//new Member1() => 2번 heap 생기고 
		//m1는 1번에 생기고 .heap의 주소를 가지고 있다. 
		//m1의 데이터는 name1개랑 number 1개씩만 저장이 가능하다. 
		//데이터를 더 만들고 싶으면 m2로 new를 더 해야지 만들 수 있다. 
		
		//m1.name = "aa";
		m1.setName("aa");
		
		// m1에 주소가 
		// aa => heap에있고. 이 주소를 m1에 넘겨주기 
		m1.number = 1001;
		
		//dao.memberList[0] = m1;
		Member1DAO.memberList[0] = m1;
		//dao배열에 들어간거. 
		//----------------------------
		Member1 m2 = new Member1();
		//m2.name = "bb";
		m2.setName("bb");
		m2.number = 1002;
		Member1DAO.memberList[1] = m2;
		
		
	}
}


접근제어자
private - 자신 클래스에서만 사용 가능 
public - 어디서든 사용 가능 . 다른 클래스 사용 가능  

class A{
private int a; - 자신
public int b; - 어디서든 
}
class B{
void test(){
A a = new A();
a.a는안보임
a.b만보임 - 되고.  
}
}
----------------------------------
전역변수
static
------------------------------
자바에서 클래스 영역의 변수 종류 
public 
static 
private


  • C1701개념02스태틱
package C1701스태틱_개념;

import java.util.Vector;



class StaticTest {

	static private int score; // 내용이 담긴 변수는 static 으로 만들면 공유되어 버린다.
	static private String name;
	//static은 해도 new를해도 만들어지지 않는다.

	private int score2;
	private String name2;
	//------------------------------
	//함수 2개씩 만든것 
	static public int getScore() {
		return score;
	}

	static public void setScore(int score) {
		StaticTest.score = score;
	}

	static public String getName() {
		return name;
	}

	static public void setName(String name) {
		StaticTest.name = name;
	}
	//--------------------------------------------
	public int getScore2() {
		return score2;
	}

	public void setScore2(int score2) {
		this.score2 = score2;
	}

	public String getName2() {
		return name2;
	}

	public void setName2(String name2) {
		this.name2 = name2;
	}

}
//----------------------------------------------------------------
class StaticTestDAO {
	public Vector<StaticTest> testList = new Vector<StaticTest>();

	public void addTest(StaticTest test) {
		testList.add(test);
	}

	public void printTestList() {
		for (int i = 0; i < testList.size(); i++) { // 전부 같은내용이 나온다.
			System.out.print(testList.get(i).getName());
			System.out.println(" " + testList.get(i).getScore());
		}
		System.out.println("--------------------------------------------");
		for (int i = 0; i < testList.size(); i++) {
			System.out.print(testList.get(i).getName2());
			System.out.println(" " + testList.get(i).getScore2());
		}
	}
}

public class C1701개념02스태틱 {
	public static void main(String[] args) {
		/*
		 * [스태틱 활용시 주의 할점] DAO 는 static 으로 만들어도되지만 
		 * 객체는 개수를 따로count 하는 변수를 제외하곤 실제
		 * 내용이들어가는 변수를 static으로 만들면안된다.
		 */
		StaticTestDAO STD = new StaticTestDAO();

		String[] dataName = { "aaa", "bbb", "ccc", "ddd" };
		int[] dataScore = { 43, 54, 12, 94 };
		for (int i = 0; i < dataName.length; i++) {
			
			StaticTest t = new StaticTest();
			// static(클래스) 메서드
			//new를 해도 만들어지지 않는다. 
			StaticTest.setName(dataName[i]);
			StaticTest.setScore(dataScore[i]);
			
			// non-static(인스턴스) 메서드
			t.setName2(dataName[i]);
			t.setScore2(dataScore[i]);

			STD.addTest(t);
		}
		STD.printTestList();

	}
}
//스태틱_기본이론2.main(new String[] args);

  • C1701개념03스태틱
    • 왜 스테틱을 사용하냐.
    • 스프링이라는 프레임워크를 쓰는데. 전부 스태틱을 쓴다. 
    • 즉 배열열은 스태틱을 쓴다. 
package C1701스태틱_개념;

import java.util.Vector;

// Data Transfer Object
//----------------------------------
//위의 것이 db에 들어가는 애들 
//여기에는 static을 쓰지 않는다. 
//변수에는 static을 사용하지 않는다. 
class Client {	
	private int number;
	private String name;
}

//-----------------------------------------------------------------
// Data Access Object

//static은 DAO 배열에 접근이 가능한 애들한테. static을 쓴다. 
//db에 접근하는 애들 
class StaticClientDAO{
	public static Vector<Client> clientList = new Vector<Client>();	
	static public void addClient(Client c) {
		clientList.add(c);
	}	
}

class ClientDAO{
	public Vector<Client> clientList = new Vector<Client>();
	public void addClient(Client c) {
		clientList.add(c);
	}	
}
//------------------------------------------------------------
public class C1701개념03스태틱 {
	public static void main(String[] args) {
		
		// static 활용 (1) DAO를 static 으로 만들면 편하다.
		for(int i = 0; i < 10; i++) {
			StaticClientDAO.addClient(new Client());
			//static이 붙으면 바로 사용이 가능하다.  //new를 안해도 
		}
		
		System.out.println("-----------------------------------");		
		ClientDAO clientDAO = new ClientDAO();	
		//static을 안 붙이면 new를 하고 사용해야 한다. 
		
		for(int i = 0; i < 10; i++) {
			clientDAO.addClient(new Client());
		}
		
		
		
	}
}

  • C1701개념04스태틱
package C1701스태틱_개념;

class Monster {
	
	static int count;
	//static을 활용할 수 있는것은 개수 세는것 
	
	void init() {
		System.out.println("몬스터가 탄생했습니다.");
		count += 1;
	}
	
	void die() {
		System.out.println("몬스터가 죽었습니다.");
		count -= 1;
		
		if(count == 0) {
			System.out.println("몬스터가 전멸했습니다.");
		} else {
			System.out.println("현재 몬스터는 " + count + "명 남았습니다.");
		}
	}
}

public class C1701개념04스태틱 {
	public static void main(String[] args) {
		
		Monster m1 = new Monster();
		m1.init();
		
		Monster m2 = new Monster();
		m2.init();
		
		Monster m3 = new Monster();
		m3.init();
		
		m1.die();
		
	}
}

  • C1701개념05스태틱
package C1701스태틱_개념;

class Product{
	static public int count;
	
	public String name;
	public Product(){
		Product.count += 1;
	}
}

public class C1701개념05스태틱 {
	public static void main(String[] args) {
		
		for(int i = 0; i < 10; i++) {
			Product p = new Product();
		}
		
		// 현재까지 생성된 Product갯수를 알수있다. (메모리 누수확인용)
		System.out.println(Product.count);
		
	}
}

  • C1702스태틱사용전_암기

  • _BankMain
package C1702스태틱사용전_암기;

/*
	[문제]
		계좌추가, 이체, 회원탈퇴 기능을 구현해보시오.
		단, 회원탈퇴 시 갖고 있는 계좌도 전부 삭제하시오.
 */

public class _BankMain {
	public static void main(String[] args) {
		
		Controller bank = new Controller();		
		//new를 한다. 
		bank.setSampleData();
		bank.run();
		
	}
}

  • Controller
package C1702스태틱사용전_암기;

import java.util.Scanner;

public class Controller {
	private AccountDAO am;
	private UserDAO um;
	private Scanner scan  = new Scanner(System.in);
	
	public Controller() {		
		um = new UserDAO();		//new를 한것 
		am = new AccountDAO();
	}
	
	public void setSampleData() {
		String userdata = "test01/pw1/김철수\n";
		userdata += "test02/pw2/이영희\n";
		userdata += "test03/pw3/신민수\n";
		userdata += "test04/pw4/최상민";
				
		String accountdata = "test01/1111-1111-1111/8000\n";
		accountdata += "test02/2222-2222-2222/5000\n";
		accountdata += "test01/3333-3333-3333/11000\n";
		accountdata += "test03/4444-4444-4444/9000\n";
		accountdata += "test01/5555-5555-5555/5400\n";
		accountdata += "test02/6666-6666-6666/1000\n";
		accountdata += "test03/7777-7777-7777/1000\n";
		accountdata += "test04/8888-8888-8888/1000";		
		// 1) test01 김철수 는 계좌를 3개 가지고있다.
		// 2) test02 이영희 는 계좌를 2개 가지고있다.
		// 3) test03 신민수 는 계좌를 2개 가지고있다.
		// 4) test04 최상민 은 계좌를 1개 가지고있다. 
		
		um.dataSetting(userdata);
		am.dataSetting(accountdata);
	}
	
	public void run() {
		
		while(true) {
			System.out.println("(1)회원가입  (2)입금 (3)조회 (4)계좌추가 (5)이체 (6)회원탈퇴 (7)계좌삭제 (0)종료");
			int sel = scan.nextInt();
			if(sel == 1) {
				um.join(am);				
			} else if(sel == 2) {
				am.deposit(um);
			} else if(sel == 3) {
				am.checkBalance(um);
			} else if(sel == 4) {
				/* 직접 만들어보세요. */
			} else if(sel == 5) {
				/* 직접 만들어보세요. */
			} else if(sel == 6) {
					/* 
					 직접 만들어보세요.
					 단, 회원 탈퇴 시 가지고 있는 계좌도 전부 삭제하기 
					 */
			} else if(sel == 0) {
				System.out.println("종료");
				break;
			}
		}		
	}
}

  • C1702스태틱사용후_암기

  • _BankMain
package C1702스태틱사용후_암기;

/*
	[문제]
		계좌추가, 이체, 회원탈퇴 기능을 구현해보시오.
		단, 회원탈퇴 시 갖고 있는 계좌도 전부 삭제하시오.
*/

public class _BankMain {
	public static void main(String[] args) {
		//new를 안 한다. 
		
		Controller.setSampleData();
		Controller.run();
		
	}
}

  • Controller
package C1702스태틱사용후_암기;

import java.util.Scanner;

public class Controller {
	//dao도 없다. 
	
	static private Scanner scan  = new Scanner(System.in);
	
	static public void setSampleData() {
		String userdata = "test01/pw1/김철수\n";
		userdata += "test02/pw2/이영희\n";
		userdata += "test03/pw3/신민수\n";
		userdata += "test04/pw4/최상민";
				
		String accountdata = "test01/1111-1111-1111/8000\n";
		accountdata += "test02/2222-2222-2222/5000\n";
		accountdata += "test01/3333-3333-3333/11000\n";
		accountdata += "test03/4444-4444-4444/9000\n";
		accountdata += "test01/5555-5555-5555/5400\n";
		accountdata += "test02/6666-6666-6666/1000\n";
		accountdata += "test03/7777-7777-7777/1000\n";
		accountdata += "test04/8888-8888-8888/1000";		
		// 1) test01 김철수 는 계좌를 3개 가지고있다.
		// 2) test02 이영희 는 계좌를 2개 가지고있다.
		// 3) test03 신민수 는 계좌를 2개 가지고있다.
		// 4) test04 최상민 은 계좌를 1개 가지고있다. 
		
		UserDAO.dataSetting(userdata);
		AccountDAO.dataSetting(accountdata);
		//그냥 사용하면 되니까. 
		//단점은 추적하기 어렵다. //출처를 알기 어렵다. 
	}
	
	static public void run() {
		
		while(true) {
			System.out.println("(1)회원가입  (2)입금 (3)조회 (4)계좌추가 (5)이체 (6)회원탈퇴 (7)계좌삭제 (0)종료");
			int sel = scan.nextInt();
			if(sel == 1) {
				UserDAO.join();				
			} else if(sel == 2) {
				AccountDAO.deposit();
			} else if(sel == 3) {
				AccountDAO.checkBalance();
			} else if(sel == 4) {
				/* 직접 만들어보세요. */
			} else if(sel == 5) {
				/* 직접 만들어보세요. */
			} else if(sel == 6) {
			} else if(sel == 6) {
				/* 
				 직접 만들어보세요.
				 단, 회원 탈퇴 시 가지고 있는 계좌도 전부 삭제하기 
				 */
			}
			else if(sel == 0) {
				System.out.println("종료");
				break;
			}
		}		
	}
}

  • C1704전체스태틱_개념

  • C1704개념01_전체스태틱
package C1704전체스태틱_개념;

import java.util.Vector;

class User{
	String name;
}

class UserDAO{
	 static UserDAO instance = new UserDAO();
	 //static을 다 붙이기 힘드니까.
	 //대표로 붙여놓은것 //여기 안에서는 new를 한것 
	
	 Vector<User> userList = new Vector<User>();
	 void insert() {}
	 void remove() {}
	 void update() {}
	 void print() {}
	 //위의 것들을 static을 뺀것 
}

class Sub{
	String name;
	String userName;
}

class SubDAO{
	static Vector<Sub> subList = new Vector<Sub>();
	static void insert() {
		
		UserDAO.instance.userList.get(0);
		Vector<User>userList = UserDAO.instance.userList;
		//사용할때는 .이 더 들어간다. 
		userList.get(0);
		
		int arr[][] = {{1},{1},{1}};		
		arr[0][0] = 10;
		
		int temp[] =arr[0];
		temp[0] = 10;
		
	}
	static void remove() {
	}
	static void update() {}
	static void print() {}
}

public class C1704개념01_전체스태틱 {
	public static void main(String[] args) {
		
	}
}

  • C1704개념02_전체스태틱
package C1704전체스태틱_개념;

import java.util.Vector;

class Member{
	public int num; 
	public String name;
}

class MemberDAO {
	
	public static MemberDAO instance = new MemberDAO();
	public Vector<Member> memberList;
	
	public MemberDAO() {
		memberList = new Vector<Member>();
	}
	public void create() {}
	public void read() {}
	public void update() {}
	public void delete() {}
}

class Controller{
	static Controller intance = new Controller();	
	
	void run() {				
		while(true) {
			int sel = 0;
			if(sel == 1) {
				MemberDAO.instance.create();
			}else if(sel == 2) {
				MemberDAO.instance.read();
			}
		}
	}
}

public class C1704개념02_전체스태틱 {
	public static void main(String[] args) {
		Controller.intance.run();		
	}
}
반응형

'코딩 > 2-JAVA' 카테고리의 다른 글

C19추상화  (1) 2025.07.17
C18상속  (2) 2025.07.17
C16캡슐화  (5) 2025.07.10
C1404콜렉션벡터_개념  (0) 2025.07.09
C14콜렉션 => C1401가변배열_개념  (0) 2025.07.07