관리 메뉴

거니의 velog

230721 자바 강의 본문

대덕인재개발원_Java

230721 자바 강의

Unlimited00 2023. 7. 21. 16:00

[멤버 필드]

- 특정 객체를 특정지을 수 있는 속성들.

- 사람이라면 이름, 나이, 성별 등등

- 변수와 상수(final 제한자)가 포함되어 진다.

지역 변수는 반드시 초기화 해야 하나, 멤버 변수는 초기화가 필요 없다. 생성자로 처리.

정적 멤버는 오직 메소드 영역에 한 번만 실행.
초기화도 한 번 실행. 객체 생성과 전혀 무관하게 생성되거나 초기화되지 않는다.
객체가 공통으로 사용해야 할 메소드나 기억 공간으로 활용 가능.

정적 초기화 블록도 있다.
static {
}
정적 멤버를 초기화할 때 사용.

정적 메소드 안에서 this 사용 불가.

this 는 객체가 인스턴스화 되어 힙 메모리 저장되는데, static은 클래스 실행 전에 이미 메소드 영역에 생성되므로 주소를 참조할 수 없다.

일반 변수나 메소드는 static 메소드에서 참조될 수 없다. 발생되는 시차가 다르기 때문.

- Car.main() 으로 컴파일러가 실행 .

사이트 기능 하나하나 별로 사용자와 서버 사이의 연결이 만들어지는데, 그 수가 많아지면 서버가 다운됨. 자원 할당이 부족하기 때문.

여러 기능을 사용하더라도 하나의 연결점만 만들어주는 것이 싱글톤

요즘에는 비연결 지향적. 사용자와 서버 사이의 연결을 끊어버리고 필요한 자료를 클라이언트에게 카피해서 주고 돌아가게 하는 방법.

싱글톤 ? 커넥션 객체를 만드는데, 외부에서 객체를 아무리 호출한다 하더라도 요구할 때마다 생성되지 않고, 이미 생성된 객체 하나만 고정되어 주소값만 복사해서 준다.

특징 ?
생성자-멤버 변수 초기화.
객체 생성시 new 연산자와 생성자 메소드가 반드시 선언되어야 한다.
객체 생성을 위해서 생성자 메소드가 반드시 필요. 예외가 있다면 String 클래스.
이 생성자 메소드는 자기 클래스에서 사용되는 것보다 다른 클래스에서 사용을 더 많이 한다.
내가 생성하려는 클래스에 메소드를 불러 쓰기 위해 다른 클래스에서 객체가 생성되는 것이 배부문.
생성자 메소드 앞에 붙는 접근지정자가 default 이상 되어야 한다.
그런데, 생성자 메서드에 private이 붙는 것이 싱글톤. , 내부에서만 객체를 생성하고 외부에서 생성시킬 수 없다는 말.

집을 아무리 화려하게 만들어도 문을 만들지 않은 클래스를 생성한 것.
그렇다면 들락 거릴 수 있는 구멍이 있어야 함. 그 클래스의 외부에서 호출할 수 있는 public 메서드가 반드시 하나 있어야 한다. 거의 대부분 이름이 getInstance().

외부에서 유일하게 getInstance()만 호출 가능. 그 안에 객체 생성하는 정적 변수가 들어 있음.

private static 클래스명 instance = null;


static 클래스 getInstance() {
     if(instance = null) {
          instance = new 클래스명();
          return instance;

     }
}

주로 네트워크나 DB 프로그램에서 많이 사용됨.

시스템에 굉장한 부담을 안기는 경우에 많이 활용.


[FinalExample.java]

package ddit.chap06.sec06;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class FinalExample {

	public static void main(String[] args) {
		
		Final f1 = new Final("학교주변");
		System.out.println(f1.loc + "에서 허용된 속도 : " + f1.toString()); // 학교주변에서 허용된 속도 : 30km/h
		
		Final f2 = new Final("시내");
		System.out.println(f2.loc + "에서 허용된 속도 : " + f2.toString()); // 시내에서 허용된 속도 : 50km/h
		
		Final f3 = new Final("시외");
		System.out.println(f3.loc + "에서 허용된 속도 : " + f3.toString()); // 시외에서 허용된 속도 : 70km/h
		
		LocalDate now = LocalDate.now(); // LocalDate = 년-월-일. LocalTime = 시:분:초. LocalDateTime = 년-월-일 시:분:초
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
		String formatNow = now.format(formatter);
		System.out.println(now); // 2023-07-21 날짜 자체를 가져옴.
		System.out.println(formatNow); // 20230721 필요한 형식으로 재정의하여 가져옴.
		
	}

}

class Final {
	
	final int SCHOOL_ZONE_SPEED = 30; // 상수의 변수명은 다 대문자로 구성되므로 _ 로 단어를 구분(snake case)한다.
	final int DOWN_TOWN_SPEED = 50;
	final int COUNTRY_SIDE_SPEED = 70;
	String loc;
	
	Final() {}
	
	Final(String loc) {
		this.loc = loc;
	}

	@Override
	public String toString() {
		int speed = 0;
		if(loc.equals("학교주변")) {
			speed = SCHOOL_ZONE_SPEED;
		}else if(loc.equals("시내")) {
			speed = DOWN_TOWN_SPEED;
		}else if(loc.equals("시외")) {
			speed = COUNTRY_SIDE_SPEED;
		}
		return speed + "km/h";
	}
	
}

콘솔 결과


[StaticExample.java]

package ddit.chap06.sec07;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class StaticExample {

	public static void main(String[] args) {
		
		Product p1 = new Product("볼펜");
		System.out.println(p1.toString());
		
		Product p2 = new Product("샤프펜슬");
		System.out.println(p2.toString());
		
		Product p3 = new Product("만년필");
		System.out.println(p3.toString());
		
		Product p4 = new Product();
		System.out.println(p4.toString());
		
	}

}

// 제품 정보 클래스
// 제품번호(자동증가값 : 날짜(8)+3자리 증가값)
// 제품명
class Product {

	static LocalDate now = LocalDate.now();
	static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
	static long prodId = Long.parseLong(now.format(formatter) + "000"); // format() 메서드 반환 타입 : String, boxing-unboxing이 동시에 적용됨.
	
	String prodName = "제품명없음";
	
	Product() {
		prodId++;
	}
	
	Product(String prodName) {
		prodId++;
		this.prodName = prodName;
	}

	@Override
	public String toString() {
		return "제품번호 : " + prodId + "\n제품명 : " + prodName +"\n";
	}
	
}

콘솔 결과


[JDBC 라이브러리 붙이는 방법]


[JDBCUtil.java]

package ddit.chap06.sec08;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtil {

	// 싱글톤 패턴 예제
	private static JDBCUtil instance = null;
	private JDBCUtil() {}
	public static JDBCUtil getInstance() {
		if(instance==null) instance = new JDBCUtil();
		return instance;
	}
	
	// thin = ojdbc.java 파일 연동. 범용이라 안정적이지만 느리다. 전용을 쓰면 빠르나 범용성이 없음.
	// localhost : 127.0.0.1
	// 가상 주소 값. ipconfig
	// :1521. 컴퓨터에 오라클이 설치 되었을 때 오라클을 구별하는 논리적으로 배정되어진 포트 번호.
	// :xe. sqldeveloper에 계정 등록할 때 제일 밑에 sid 값이 기술됨. express edition의 약자. 
	// :orcl. 정식 버전.
	private String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
	private String user = "pc_21";
	private String password = "java";
	
	private Connection conn = null; // 연결 객체. ojdbc에서 제공 되는 DriverManager.getConnection() 매개변수로 url, user, password을 쓰면 이것을 가지고 접속을 시도.
	private Statement stmt = null; // 동적 쿼리 변환 // 정적 쿼리. 이미 조건을 다 제시해서 설정한 쿼리.
	private PreparedStatement pstmt = null; // 정적 쿼리 변환 // 동적 쿼리. 사용자로부터 입력 받은 값으로 변경되는 쿼리.
	private ResultSet rs = null; // select 문에서 뷰(가상 테이블)을 반환하여 ResultSet에 저장.
	
	public void selectlist(String sql) {
		try {
			conn = DriverManager.getConnection(url, user, password);
			stmt = conn.createStatement(); // 연결 객체를 명령어 객체로 변환.
//			conn.commit(); // DB 내용이 추가, 변경, 삭제되었을 때 commit
//			conn.rollback();
			rs = stmt.executeQuery(sql); // executeQuery(sql). select 문장만 실행하는 메서드.
			/*
			 * MEM_ID, MEM_PASS, MEM_NAME, MEM_REGNO1, MEM_REGNO2, MEM_BIR, MEM_ZIP, MEM_ADD1, MEM_ADD2, MEM_HOMETEL, MEM_COMTEL, MEM_HP, MEM_MAIL, MEM_JOB, MEM_LIKE, MEM_MEMORIAL, MEM_MEMORIALDAY, MEM_MILEAGE, MEM_DELETE
			 */
			while(rs.next()) {
				String mid = rs.getString("MEM_ID");
				String mname = rs.getString("MEM_NAME");
				String jumin = rs.getString("MEM_REGNO1") + "-" + rs.getString("MEM_REGNO2");
				String hp = rs.getString("MEM_HP");
				int mileage = rs.getInt("MEM_MILEAGE");
				
				System.out.printf("%6s  %5s  %13s  %15s  %6d\n", mid, mname, jumin, hp, mileage);
			}
		}catch(SQLException e) {
			e.printStackTrace(); // jvm의 call stack메모리에 담긴 오류 메시지 출력.
		}finally {
			if(rs != null) try {rs.close();} catch(Exception e) {} // 예외 클래스의 조상 클래스는 Exception
			if(stmt != null) try {stmt.close();} catch(Exception e) {}
			if(conn != null) try {conn.close();} catch(Exception e) {} // 연 순서의 반대 순서로 차례대로 닫는다.
		}
	}
	
}

[DBTestExample.java]

package ddit.chap06.sec08;

public class DBTestExample {

	public static void main(String[] args) {
		
		JDBCUtil jdbc = JDBCUtil.getInstance();
		
		String sql = "SELECT MEM_ID, MEM_NAME, MEM_REGNO1, MEM_REGNO2, MEM_HP, MEM_MILEAGE ";
//		sql += "FROM MEMBER WHERE MEM_ID = ? "; // 동적 쿼리.
//		sql += "FROM MEMBER WHERE MEM_ID >= 'c001' ";
		sql += "FROM MEMBER WHERE MEM_REGNO1 LIKE '0%' "; // 2000년대 이후 출생자.
		
		jdbc.selectlist(sql);
		
	}

}

콘솔 결과

 

'대덕인재개발원_Java' 카테고리의 다른 글

230725 자바 강의  (0) 2023.07.25
230724 자바 강의  (0) 2023.07.24
230720 자바 강의  (0) 2023.07.20
230719 자바 강의  (0) 2023.07.19
230718 자바 강의  (0) 2023.07.18