정적멤버 static
객체와 상관없는 멤버, 클래스코드(메소드 영역)에 위치
static은 클래스 내에 저장된 메소드 영역에 존재한다, static이 안붙여진 것은 인스턴스 멤버
인스턴스 멤버는 객체 내에 저장이 되므로 객체가 생성되지 않으면 만들어지지 않는다
반면 정적멤버는 메소드 영역에 저장이 되므로 객체와 상관없이 존재한다
static에서 객체 내의 메소드를 불러내기 위해선 ' 객체이름.메소드 ' 로 주소를 붙여주면 가능하다.
정적멤버는 정적멤버 내 있는 것들은 제약없이 사용이 가능하다.
public class StaticTest {
int a = 0;
static int b = 20;
static String c = "100";
public void method1() {
// static과 상관없이 다 불러올 수 있음
}
public static void method2() {
// 변수 a와 메소드 method1를 호출할 수 없음
}
}
public class Person {
static int year;
String name;
@Override
public String toString() {
return year+", "+name;
}
}
public class PersonExample {
public static void main(String[] args) {
Person person = new Person(); // 객체 생성 전에도 메소드 영역에 year존재
person.name = "오리"; // 힙영역에 저장
person.year = 2023; // 메소드 영역에서 2023값 저장
Person person2 = new Person();
person2.name = "거위"; // 힙영역에 저장
person2.year = 2024; // 메소드 영역에서 2023년값이 삭제되고 2024값 저장
System.out.println(person);
System.out.println(person2);
}
}
2024, 오리
2024, 거위
- 정적멤버인 메소드를 다른 클래스에서 불러오려면 클래스이름.메소드이름()
ex) Arrays.sort();
Arrays.toString();
- 반면 인스턴스 멤버는 import해야사용 할 수 있다.
ex) new Random().nextInt(50);
(import java.util.Random를 해야 사용이 가능하다)
접근제한자
public | 외부 클래스가 자유롭게 사용 |
protected | 같은 패키지 또는 자식 클래스에서 사용 |
private | 외부에서 사용불가능 |
default (기본값) | 같은 패키지에 소속된 클래스에서만 사용 |
SingleTon
특정 클래스의 인스턴스를 1개만 생성되는 것을 보장하는 디자인 패턴
static이기 때문에 값이 1개만 존재한다. 자신의 객체를 담는다
처음에는 instance에는 아무값도 존재하지 않는다 (null)
기본 생성자가 만들어지지 않게 private 로 생성
새로운 객체를 생성해서 instance값을 담고 다시 불러올 때는 기존에 만들었던것을 돌린다.
public class SingleTon {
private static SingleTon instance;
private SingleTon() {
// 클래스 생성은 자기 자신만 사용가능
}
public static SingleTon getInstance() {
if(instance == null) {
instance = new SingleTon();
//singleton객체를 만들어서 힙메모리에 생성한 후에
//메소드 영역에있는 instance에 힙영역의 주소값을 저장한다
}
return instance;
// null값일 때만 만들어지므로
// 이미 만들어진 상태면 기존 값을 리턴하기 때문에
// 항상 객체는 하나만 만들어진다
}
}
부하를 줄이기 위해 DB접속 시에 사용
절대적인 값(잔액)같은 것에도 사용
public class SearchEngine {
private static SearchEngine instance;
private SearchEngine() {
System.out.println("파일 리딩중");
for(int i =0; i<20; i++) {
System.out.print(".");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static SearchEngine getInstance() {
if (instance == null) {
instance = new SearchEngine();
}
return instance;
}
}
import java.util.Date;
public class SearchExample {
public static void main(String[] args) {
//Date d1 = new Date();
SearchEngine se1 = SearchEngine.getInstance();
SearchEngine se2 = SearchEngine.getInstance();
SearchEngine se3 = SearchEngine.getInstance();
SearchEngine se4 = SearchEngine.getInstance();
SearchEngine se5 = SearchEngine.getInstance();
//Date d2 = new Date();
//System.out.println(d2.getTime()-d1.getTime());
}
}
여러 개를 실행 해도 한번만 검색되어 속도가 빠르기 때문에 시간이 오래걸리는 작업은 모두 싱글톤을 적용한다.
파일 리딩중
....................
실제로 DB에 연결해보기
import java.sql.Connection;
import java.sql.DriverManager;
public class DBConn {
private static Connection conn;
public static Connection getConnection() {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
//@localhost = ip (cmd에 ipconfig치면 확인가능)
String user = "ORI";
String pwd = "java";
if(conn==null){
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, user, pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return conn;
}
}
jar
하나의 프로젝트라고 생각할 수 있다
ojdbc는 db를 연결할 수 있게하는 jar파일
build path > Configure build path를 통해 연결
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBMain {
public static void main(String[] args) {
DBMain db = new DBMain();
db.selectAll();
}
private Connection conn = null;
private Statement stmt = null;
private ResultSet rs = null;
public void selectAll() {
try {
conn = DBConn.getConnection(); //싱글톤 접속
stmt = conn.createStatement();
String sql = "SELECT * FROM MEMBER";// sql 입력값
rs = stmt.executeQuery(sql); // 결과값 가져옴
while(rs.next()) {
String id = rs.getString("MEM_ID");
String pass = rs.getString("MEM_PASS");
String name = rs.getString("MEM_NAME");
System.out.println(id+"\t"+pass+"\t"+name);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
'JAVA > JAVA BASIC' 카테고리의 다른 글
3/22 Homework 회원가입 (0) | 2024.03.22 |
---|---|
3/21 Homework 로또생성기 (0) | 2024.03.22 |
[JAVA] 메소드 - 로또 생성 (0) | 2024.03.21 |
3/20 Homework 카드게임 (0) | 2024.03.20 |
[JAVA] 클래스, 함수 (0) | 2024.03.18 |