반응형
- 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에서 가능하고
- }
- this.name = name;
- class Member1을 해서
- 하지만 배열은 매번 new를 하기 싫어서 static에 만드는것이다.
- static은 3번 전역에 만들어져 있다.
- 즉 프로그램이 다 끝나면 데이터가 사라진다.
- 즉 main에 new를 할 필요 없이 사용이 가능해지는것
- class Member1DAO { //배열
- static publi Member1 [ ] memberList = new Member1 [ 1000];
- 배열
- 배열에는 스태틱을 붙인다. new를 하기 싫으니까.
- }
- static은 3번 전역에 만들어져 있다.
- 데이터는 컨트롤러에서 집어 넣는것이다.
- 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번 영역에 있으니까.
- Member1DAO dao = new Member1 DAO ();
- }
- public static void main (String[ ] args) { //main함수
- }
- public class MemberTest { //컨트롤러
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 |